219 lines
8.1 KiB
Python
219 lines
8.1 KiB
Python
from solo_turnier import worker
|
|
import os
|
|
import json
|
|
import pytest
|
|
import pytest_mock
|
|
|
|
def __importJSONData(name):
|
|
path = os.path.join(os.path.dirname(__file__), 'worker', name)
|
|
with open(path, 'r') as fp:
|
|
return json.load(fp)
|
|
|
|
@pytest.fixture
|
|
def fixture_csvExtractor():
|
|
data = __importJSONData('csvImport.json')
|
|
expected = __importJSONData('csvImportResult.json')
|
|
return (data, expected)
|
|
|
|
def test_csvExtractor(fixture_csvExtractor):
|
|
extractor = worker.CSVExtractor()
|
|
mapped = extractor.mapCSVImport(fixture_csvExtractor[0])
|
|
|
|
assert len(mapped) == len(fixture_csvExtractor[1])
|
|
for i,elem in enumerate(fixture_csvExtractor[1]):
|
|
assert mapped[i].__dict__ == elem
|
|
|
|
def test_extractPersonFromRow():
|
|
row = worker.ResultRow('Max', 'Mustermann', 'TSC Entenhausen', '2', 'Kin', 'Adv.', 'Rumba', '2', '2', 'Kin.', 'Beg./Adv.')
|
|
person = worker.ResultPerson.extractFromResultRow(row)
|
|
expected = {
|
|
'firstName': 'Max',
|
|
'lastName': 'Mustermann',
|
|
'name': 'Max Mustermann',
|
|
'club': 'TSC Entenhausen',
|
|
'id': None,
|
|
'group': None
|
|
}
|
|
assert person.__dict__ == expected
|
|
|
|
def test_extractCompetitionFromRow():
|
|
row = worker.ResultRow('Max', 'Mustermann', 'TSC Entenhausen', '2', 'Kin', 'Adv.', 'Rumba', '2', '2', 'Kin.', 'Beg./Adv.')
|
|
competition = worker.CompetitionResult.extractFromResultRow(row)
|
|
expected = {
|
|
'dance': 'Rumba',
|
|
'class_': 'Adv.',
|
|
'group': 'Kin',
|
|
'place': '2',
|
|
'placeTo': '2',
|
|
'id': 2,
|
|
'finalist': None,
|
|
'competitionGroup': 'Kin.',
|
|
'competitionClass': 'Beg./Adv.'
|
|
}
|
|
assert competition.__dict__ == expected
|
|
|
|
def test_combineRowsByPerson():
|
|
rows = [
|
|
worker.ResultRow('Max', 'Mustermann', 'TSC Entenhausen', '2', 'Kin', 'Adv.', 'Cha Cha', '-', '-', 'Kin.', 'Adv.'),
|
|
worker.ResultRow('Max', 'Mustermann', 'TSC Entenhausen', '2', 'Kin', 'Adv.', 'Rumba', '2', '2', 'Kin.', 'Adv.'),
|
|
worker.ResultRow('Max', 'Mustermann', 'TSC Entenhausen', '2', 'Kin', 'Beg.', 'Jive', '1', '1', 'Kin.', 'Beg.'),
|
|
worker.ResultRow('Maxime', 'Musterfrau', '1. SC Entenhausen', '1', 'Kin', 'Adv.', 'Rumba', '1', '1', 'Kin.', 'Adv.')
|
|
]
|
|
dataWorker = worker.DataWorker()
|
|
result = dataWorker.combineRowsByPerson(rows)
|
|
expected = {
|
|
worker.ResultPerson('Max', 'Mustermann', 'TSC Entenhausen'): [
|
|
worker.CompetitionResult('Rumba', 'Kin', 'Adv.', '2', '2', '2', 'Kin.', 'Adv.'),
|
|
worker.CompetitionResult('Jive', 'Kin', 'Beg.', '1', '1', '2', 'Kin.', 'Beg.')
|
|
],
|
|
worker.ResultPerson('Maxime', 'Musterfrau', '1. SC Entenhausen'): [
|
|
worker.CompetitionResult('Rumba', 'Kin', 'Adv.', '1', '1', '1', 'Kin.', 'Adv.')
|
|
]
|
|
}
|
|
assert result == expected
|
|
|
|
def test_checkUniqueIds_True():
|
|
person1 = worker.ResultPerson('Max', 'Mustermann', 'TSC Entenhausen')
|
|
person2 = worker.ResultPerson('Maxime', 'Musterfrau', '1. SC Entenhausen')
|
|
data = {
|
|
person1: [
|
|
worker.CompetitionResult('Rumba', 'Kin', 'Adv.', '2', '2', 2, 'Kin.', 'Adv.'),
|
|
worker.CompetitionResult('Jive', 'Kin', 'Beg.', '1', '1', 2, 'Kin.', 'Beg.')
|
|
],
|
|
person2: [
|
|
worker.CompetitionResult('Rumba', 'Kin', 'Adv.', '1', '1', 1, 'Kin.', 'Adv.')
|
|
]
|
|
}
|
|
dataWorker = worker.DataWorker()
|
|
assert dataWorker.checkUniqueIds(data) == True
|
|
assert person1.id == 2
|
|
assert person2.id == 1
|
|
|
|
def test_checkUniqueIds_False():
|
|
person1 = worker.ResultPerson('Max', 'Mustermann', 'TSC Entenhausen')
|
|
person2 = worker.ResultPerson('Maxime', 'Musterfrau', '1. SC Entenhausen')
|
|
data = {
|
|
person1: [
|
|
worker.CompetitionResult('Rumba', 'Kin', 'Adv.', '2', '2', 2, 'Kin.', 'Adv.'),
|
|
worker.CompetitionResult('Jive', 'Kin', 'Beg.', '1', '1', 3, 'Kin.', 'Beg.')
|
|
],
|
|
person2: [
|
|
worker.CompetitionResult('Rumba', 'Kin', 'Adv.', '1', '1', 1, 'Kin.', 'Adv.')
|
|
]
|
|
}
|
|
dataWorker = worker.DataWorker()
|
|
assert dataWorker.checkUniqueIds(data) == False
|
|
assert person1.id == None
|
|
assert person2.id == 1
|
|
|
|
@pytest.fixture(params=range(5))
|
|
def fixture_consolidateGroups(request):
|
|
person1 = worker.ResultPerson('Max 1', 'Mustermann', 'TSC Entenhausen')
|
|
person2 = worker.ResultPerson('Max 2', 'Mustermann', 'TSC Entenhausen')
|
|
person3 = worker.ResultPerson('Max 3', 'Mustermann', 'TSC Entenhausen')
|
|
person4 = worker.ResultPerson('Max 4', 'Mustermann', 'TSC Entenhausen')
|
|
# persons = (person1, person2, person3, person4)
|
|
|
|
dict1 = {
|
|
person1: [
|
|
worker.CompetitionResult('Rumba', 'Kin.', 'Adv.', '2', '2', 2, 'Kin.', 'Adv.'),
|
|
worker.CompetitionResult('Jive', 'Kin.', 'Beg.', '1', '1', 3, 'Kin.', 'Beg.')
|
|
]
|
|
}
|
|
dict2 = {
|
|
person2: [
|
|
worker.CompetitionResult('Rumba', 'Kin.', 'Adv.', '2', '2', 2, 'Kin.', 'Adv.'),
|
|
worker.CompetitionResult('Jive', 'Kin./Jun.', 'Beg.', '1', '1', 3, 'Kin./Jun.', 'Beg.')
|
|
]
|
|
}
|
|
dict3 = {
|
|
person3: [
|
|
worker.CompetitionResult('Rumba', 'Kin.', 'Adv.', '2', '2', 2, 'Kin.', 'Adv.')
|
|
]
|
|
}
|
|
dict4 = {
|
|
person4: [
|
|
worker.CompetitionResult('Rumba', 'Kin./Jun.', 'Adv.', '2', '2', 2, 'Kin./Jun.', 'Adv.')
|
|
]
|
|
}
|
|
dict5 = {
|
|
person4: [
|
|
worker.CompetitionResult('Rumba', 'Kin./Jun.', 'Adv.', '2', '2', 2, 'Kin./Jun.', 'Adv.'),
|
|
worker.CompetitionResult('Cha Cha', 'Jun./Jug.', 'Beg.', '3', '4', 2, 'Jun./Jug.', 'Beg.')
|
|
]
|
|
}
|
|
|
|
cases = (
|
|
(dict1|dict3, (True, False), {}),
|
|
(dict1|dict2|dict3, (True, True), {}),
|
|
(dict4, (False, False), {person4: 'Kin./Jun.'}),
|
|
(dict1|dict2|dict3|dict4, (False, True), {person4: 'Kin./Jun.'}),
|
|
(dict5, (True, True), {person4: 'Jun.'}),
|
|
)
|
|
return cases[request.param]
|
|
|
|
@pytest.fixture(params=range(2))
|
|
def fixture_consolidateGroups_fail(request, fixture_consolidateGroups):
|
|
person = worker.ResultPerson('Max 5', 'Mustermann', 'TSC Entenhausen')
|
|
|
|
dict1 = {
|
|
person: [
|
|
worker.CompetitionResult('Rumba', 'Kin.', 'Adv.', '2', '2', 2, 'Kin.', 'Adv.'),
|
|
worker.CompetitionResult('Jive', 'Jun.', 'Beg.', '1', '1', 3, 'Jun.', 'Adv.')
|
|
]
|
|
}
|
|
|
|
dict2 = {
|
|
person: [
|
|
worker.CompetitionResult('Rumba', 'Kin.', 'Adv.', '2', '2', 2, 'Kin.', 'Adv.'),
|
|
worker.CompetitionResult('Jive', 'Hgr', 'Beg.', '1', '1', 3, 'Hgr', 'Adv.')
|
|
]
|
|
}
|
|
|
|
cases = (
|
|
dict1 | fixture_consolidateGroups[0],
|
|
dict2 | fixture_consolidateGroups[0]
|
|
)
|
|
return cases[request.param]
|
|
|
|
def test_consolidateGroups(fixture_consolidateGroups):
|
|
data = fixture_consolidateGroups[0]
|
|
dataWorker = worker.DataWorker()
|
|
|
|
assert dataWorker.consolidateGroups(data) == fixture_consolidateGroups[1]
|
|
|
|
for person in data:
|
|
assert person.group == fixture_consolidateGroups[2].get(person, 'Kin.')
|
|
|
|
def test_consolidateGroups_failing(fixture_consolidateGroups_fail):
|
|
data = fixture_consolidateGroups_fail
|
|
dataWorker = worker.DataWorker()
|
|
|
|
with pytest.raises(Exception):
|
|
dataWorker.consolidateGroups(data)
|
|
|
|
def test_createHtmlLUT(mocker):
|
|
mock = mocker.patch('solo_turnier.html_parser.HtmlParser.guessDataFromHtmlTitle')
|
|
mock.side_effect= [
|
|
{'group': 'group1', 'class_': 'class1', 'dance': 'dance1'},
|
|
{'group': 'group2', 'class_': 'class2', 'dance': 'dance2'},
|
|
{'group': 'group3', 'class_': 'class3', 'dance': 'dance3'},
|
|
]
|
|
|
|
importMock1 = mocker.patch('solo_turnier.html_parser.HtmlImport')
|
|
importMock2 = mocker.patch('solo_turnier.html_parser.HtmlImport')
|
|
importMock3 = mocker.patch('solo_turnier.html_parser.HtmlImport')
|
|
importMock1.title = 'Fake title 1'
|
|
importMock2.title = 'Fake title 2'
|
|
importMock3.title = 'Fake title 3'
|
|
|
|
dataWorker = worker.DataWorker()
|
|
structure = dataWorker._createHtmlLUT([importMock1, importMock2, importMock3])
|
|
|
|
expected = {
|
|
('group1', 'class1', 'dance1'): importMock1,
|
|
('group2', 'class2', 'dance2'): importMock2,
|
|
('group3', 'class3', 'dance3'): importMock3,
|
|
}
|
|
assert expected == structure
|