diff --git a/src/tests_sites.py b/src/tests_sites.py
new file mode 100644
index 0000000..a29369c
--- /dev/null
+++ b/src/tests_sites.py
@@ -0,0 +1,100 @@
+import unittest
+
+from webtest import TestApp
+
+from dtos import V1ResponseBase, STATUS_OK
+import flaresolverr
+import utils
+
+
+def _find_obj_by_key(key: str, value: str, _list: list) -> dict | None:
+ for obj in _list:
+ if obj[key] == value:
+ return obj
+ return None
+
+
+def asset_cloudflare_solution(self, res, site_url, site_text):
+ self.assertEqual(res.status_code, 200)
+
+ body = V1ResponseBase(res.json)
+ self.assertEqual(STATUS_OK, body.status)
+ self.assertEqual("Challenge solved!", body.message)
+ self.assertGreater(body.startTimestamp, 10000)
+ self.assertGreaterEqual(body.endTimestamp, body.startTimestamp)
+ self.assertEqual(utils.get_flaresolverr_version(), body.version)
+
+ solution = body.solution
+ self.assertIn(site_url, solution.url)
+ self.assertEqual(solution.status, 200)
+ self.assertIs(len(solution.headers), 0)
+ self.assertIn(site_text, solution.response)
+ self.assertGreater(len(solution.cookies), 0)
+ self.assertIn("Chrome/", solution.userAgent)
+
+ cf_cookie = _find_obj_by_key("name", "cf_clearance", solution.cookies)
+ self.assertIsNotNone(cf_cookie, "Cloudflare cookie not found")
+ self.assertGreater(len(cf_cookie["value"]), 30)
+
+
+class TestFlareSolverr(unittest.TestCase):
+ app = TestApp(flaresolverr.app)
+
+ def test_v1_endpoint_request_get_cloudflare(self):
+ sites_get = [
+ ('nowsecure', 'https://nowsecure.nl', '
nowSecure'),
+ ('0magnet', 'https://0magnet.com/search?q=2022', 'Torrent Search - ØMagnet'),
+ ('1337x', 'https://1337x.unblockit.cat/cat/Movies/time/desc/1/', ''),
+ ('avistaz', 'https://avistaz.to/api/v1/jackett/torrents?in=1&type=0&search=',
+ 'Access denied'),
+ ('badasstorrents', 'https://badasstorrents.com/torrents/search/720p/date/desc',
+ 'Latest Torrents - BadassTorrents'),
+ ('bt4g', 'https://bt4g.org/search/2022', 'Download 2022 Torrents - BT4G'),
+ ('cinemaz', 'https://cinemaz.to/api/v1/jackett/torrents?in=1&type=0&search=',
+ 'Access denied'),
+ ('epublibre', 'https://epublibre.unblockit.cat/catalogo/index/0/nuevo/todos/sin/todos/--/ajax',
+ 'epublibre - catálogo'),
+ ('ext', 'https://ext.to/latest/?order=age&sort=desc',
+ 'Download Latest Torrents - EXT Torrents'),
+ ('extratorrent', 'https://extratorrent.st/search/?srt=added&order=desc&search=720p&new=1&x=0&y=0',
+ 'Page 1 - ExtraTorrent'),
+ ('idope', 'https://idope.se/browse.html', 'Recent Torrents'),
+ ('limetorrents', 'https://limetorrents.unblockninja.com/latest100',
+ 'Latest 100 torrents - LimeTorrents'),
+ ('privatehd', 'https://privatehd.to/api/v1/jackett/torrents?in=1&type=0&search=',
+ 'Access denied'),
+ ('torrentcore', 'https://torrentcore.xyz/index', 'Torrent[CORE] - Torrent community.'),
+ ('torrentqq223', 'https://torrentqq223.com/torrent/newest.html', 'https://torrentqq223.com/ads/'),
+ ('36dm', 'https://www.36dm.club/1.html', 'https://www.36dm.club/yesterday-1.html'),
+ ('erai-raws', 'https://www.erai-raws.info/feed/?type=magnet', '403 Forbidden'),
+ ('teamos', 'https://www.teamos.xyz/torrents/?filename=&freeleech=',
+ 'Log in | Team OS : Your Only Destination To Custom OS !!'),
+ ('yts', 'https://yts.unblockninja.com/api/v2/list_movies.json?query_term=&limit=50&sort=date_added',
+ '{"movie_count":')
+ ]
+ for site_name, site_url, site_text in sites_get:
+ with self.subTest(msg=site_name):
+ res = self.app.post_json('/v1', {
+ "cmd": "request.get",
+ "url": site_url
+ })
+ asset_cloudflare_solution(self, res, site_url, site_text)
+
+ def test_v1_endpoint_request_post_cloudflare(self):
+ sites_post = [
+ ('nnmclub', 'https://nnmclub.to/forum/tracker.php', 'Трекер :: NNM-Club',
+ 'prev_sd=0&prev_a=0&prev_my=0&prev_n=0&prev_shc=0&prev_shf=1&prev_sha=1&prev_shs=0&prev_shr=0&prev_sht=0&f%5B%5D=-1&o=1&s=2&tm=-1&shf=1&sha=1&ta=-1&sns=-1&sds=-1&nm=&pn=&submit=%CF%EE%E8%F1%EA')
+ ]
+
+ for site_name, site_url, site_text, post_data in sites_post:
+ with self.subTest(msg=site_name):
+ res = self.app.post_json('/v1', {
+ "cmd": "request.post",
+ "url": site_url,
+ "postData": post_data
+ })
+ asset_cloudflare_solution(self, res, site_url, site_text)
+
+
+if __name__ == '__main__':
+ unittest.main()