summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremkael <emkael@tlen.pl>2019-01-18 01:15:37 +0100
committeremkael <emkael@tlen.pl>2019-01-18 01:15:37 +0100
commit033cd8f39d3e88283e4eb626f35f0e97c16e9e0e (patch)
tree49894d0624e8f25c0e2201954f413020c98cafdf
parent8c92dbcc1fa093c3f28df21ecc13b42b4e701be3 (diff)
Test suite for API <-> pzbs.pl comparison
-rw-r--r--test/.gitignore2
-rw-r--r--test/apitest/__init__.py0
-rw-r--r--test/apitest/api.py48
-rw-r--r--test/apitest/apitest.py14
-rw-r--r--test/apitest/pzbs.py69
-rw-r--r--test/csv/.emptydir0
-rw-r--r--test/test.py65
7 files changed, 198 insertions, 0 deletions
diff --git a/test/.gitignore b/test/.gitignore
new file mode 100644
index 0000000..b26a5b8
--- /dev/null
+++ b/test/.gitignore
@@ -0,0 +1,2 @@
+*.pyc
+*.csv
diff --git a/test/apitest/__init__.py b/test/apitest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/apitest/__init__.py
diff --git a/test/apitest/api.py b/test/apitest/api.py
new file mode 100644
index 0000000..4a52296
--- /dev/null
+++ b/test/apitest/api.py
@@ -0,0 +1,48 @@
+import json
+import urlparse
+
+from .apitest import ApiTest
+
+class ApiCalculator(ApiTest):
+ ranks = {
+ 'o++++': 7,
+ 'o+++': 6,
+ 'o++': 5,
+ 'o+': 4,
+ 'o-': 3,
+ 'r': 2,
+ 'o': 1,
+ 'k': 0
+ }
+ def get_url(self):
+ return 'http://localhost/pkl/api.php'
+ def get_method(self):
+ return 'post'
+ def get_request(self,
+ tour_type, tour_rank, tour_boards,
+ cont_count, cont_rank,
+ override=None):
+ params = {}
+ params['type'] = self.tourtypes[tour_type]
+ params['over39_boards'] = tour_boards
+ params['tournament_rank'] = self.ranks[tour_rank]
+ params['contestants'] = cont_count
+ params['title_sum'] = cont_rank
+ if override:
+ params['manual'] = {}
+ if 'points' in override:
+ params['manual[min_points]'] = override['points']
+ if 'weight' in override:
+ params['manual[tournament_weight]'] = override['weight']
+ if 'players' in override:
+ params['manual[players_coefficient]'] = override['players']
+ if 'cutoff' in override:
+ i = 0
+ for c in override['cutoff']:
+ params['manual[points_cutoffs][' + str(i) + '][0]'] = c[0]
+ params['manual[points_cutoffs][' + str(i) + '][1]'] = c[1]
+ i += 1
+ return params
+
+ def get_response(self, text):
+ return json.loads(text)
diff --git a/test/apitest/apitest.py b/test/apitest/apitest.py
new file mode 100644
index 0000000..e75890d
--- /dev/null
+++ b/test/apitest/apitest.py
@@ -0,0 +1,14 @@
+class ApiTest(object):
+ ranks = {}
+ tourtypes = {'i': 1, 'p': 2, 't': 4}
+ def get_url(self):
+ pass
+ def get_method(self):
+ pass
+ def get_request(self,
+ tour_rank, tour_type, tour_boards,
+ cont_count, cont_rank,
+ override=None):
+ pass
+ def parse_response(self, response_body):
+ pass
diff --git a/test/apitest/pzbs.py b/test/apitest/pzbs.py
new file mode 100644
index 0000000..1a1f69f
--- /dev/null
+++ b/test/apitest/pzbs.py
@@ -0,0 +1,69 @@
+import urlparse
+
+from bs4 import BeautifulSoup as bs
+
+from .apitest import ApiTest
+
+class PzbsCalculator(ApiTest):
+ ranks = {
+ 'o++++': 1,
+ 'o+++': 2,
+ 'o++': 3,
+ 'o+': 4,
+ 'o-': 5,
+ 'r': 6,
+ 'o': 7,
+ 'k': 8
+ }
+ def get_url(self):
+ return 'http://pzbs.pl/sedziowie/pkl/pkle2018.php'
+ def get_method(self):
+ return 'post'
+ def get_request(self,
+ tour_type, tour_rank, tour_boards,
+ cont_count, cont_rank,
+ override=None):
+ params = {
+ 'rgg': 25, 'rgp': 15, 'rot': 10, 'rok1': 7, 'rok': 5, 'rtp': 4, 'rto': 2, 'rtk': 1,
+ 'min1': 200, 'min2': 150, 'min3': 75, 'min4': 50, 'min5': 0, 'min6': 0, 'min7': 0, 'min8': 0,
+ 'rgg_': 40, 'rgp_': 25, 'rot_': 15, 'rok1_': 10, 'rok_': 7, 'rtp_': 5, 'rto_': 3, 'rtk_': 2,
+ 'min1_': 300, 'min2_': 200, 'min3_': 100, 'min4_': 70, 'min5_': 0, 'min6_': 0, 'min7_': 0, 'min8_': 0,
+ 'zaw': 0.05, 'prp1': 90, 'prp2': 20, 'pru1': 2, 'pru2': 20, 'pru3': 50,
+ 'typ': 0,
+ 'rozdan': 0,
+ 'rng': 0,
+ 'iuc': 0,
+ 'izw': 0,
+ 'swk': 0,
+ 'srd': 0
+ }
+ params['typ'] = self.tourtypes[tour_type]
+ params['rozdan'] = tour_boards
+ params['rng'] = self.ranks[tour_rank]
+ params['iuc'] = cont_count
+ params['izw'] = cont_count * self.tourtypes[tour_type]
+ params['swk'] = cont_rank
+ params['srd'] = cont_rank / (cont_count * self.tourtypes[tour_type])
+ if override:
+ if 'points' in override:
+ params['min' + str(params['typ']) + '_'*params['rozdan']] = override['points']
+ if 'weight' in override:
+ params['r' + ['', 'gg', 'gp', 'ot', 'ok1', 'ok', 'tp', 'to', 'tk'][params['typ']] + '_'*params['rozdan']] = override['weight']
+ if 'players' in override:
+ params['zaw'] = override['players']
+ if 'cutoff' in override:
+ for i in range(0, 3):
+ params['pru' + str(i+1)] = override['cutoff'][i][0] * 100
+ params['prp' + str(i+1)] = override['cutoff'][i][1] * 100
+ return params
+
+ def get_response(self, text):
+ results = {}
+ content = bs(text, 'lxml')
+ for row in content.select('table')[-1].select('tr'):
+ cells = row.select('td')
+ if cells[0].text.isdigit():
+ results[cells[0].text] = int(cells[1].text)
+ elif cells[0].text == 'SUMA PKL':
+ results[u'sum'] = int(cells[1].text)
+ return results
diff --git a/test/csv/.emptydir b/test/csv/.emptydir
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/csv/.emptydir
diff --git a/test/test.py b/test/test.py
new file mode 100644
index 0000000..bc4ef14
--- /dev/null
+++ b/test/test.py
@@ -0,0 +1,65 @@
+import csv
+import requests
+import random
+import os
+import unittest
+
+from apitest.pzbs import PzbsCalculator
+from apitest.api import ApiCalculator
+
+def runTest(tester, params):
+ return tester.get_response(
+ requests.post(
+ tester.get_url(),
+ data=tester.get_request(*params)
+ ).text)
+
+class ApiTestCase(unittest.TestCase):
+ def __setupParams(self):
+ csv_files = []
+ for root, dirs, files in os.walk('./csv'):
+ csv_files += [os.path.join(root, f) for f in files]
+ self.params = []
+ for csv_file in csv_files:
+ csv_content = csv.reader(open(csv_file), delimiter=";")
+ param_contents = [
+ row for idx, row in enumerate(csv_content) if idx == 2][0]
+ self.params.append((
+ param_contents[0][0].lower(),
+ None, 0,
+ int(param_contents[1]), float(param_contents[4])))
+
+ def setUp(self):
+ self.pzbs = PzbsCalculator()
+ self.api = ApiCalculator()
+ self.__setupParams()
+ self.longMessage=True
+ self.maxDiff = None
+
+ @unittest.skip('')
+ def test_csvCases(self):
+ for params in self.params:
+ for rank in ApiCalculator.ranks.keys():
+ for boards in [0, 1]:
+ p = (params[0], rank, boards, params[3], params[4])
+ self.assertEqual(
+ runTest(self.pzbs, p),
+ runTest(self.api, p),
+ msg=str(p))
+
+ def test_randomCases(self):
+ for i in range(0, 20):
+ for type in ['t', 'p', 'i']:
+ for rank in ApiCalculator.ranks.keys():
+ for boards in [0, 1]:
+ p = (type, rank, boards,
+ random.randint(6, 350),
+ random.randint(0, 4000) / 2.0)
+ self.assertEqual(
+ runTest(self.pzbs, p),
+ runTest(self.api, p),
+ msg=str(p))
+
+if __name__ == '__main__':
+ suite = unittest.TestLoader().loadTestsFromTestCase(ApiTestCase)
+ unittest.TextTestRunner(verbosity=2).run(suite)