Blame view

op_robot_tests/tests_files/initial_data.py 42 KB
1
# -*- coding: utf-8 -
2 3
import os
import random
4
import hashlib
selurvedu authored
5
from datetime import timedelta
6 7
from tempfile import NamedTemporaryFile
from uuid import uuid4
8
from faker import Factory
9 10
from faker.providers.company.en_US import Provider as CompanyProviderEnUs
from faker.providers.company.ru_RU import Provider as CompanyProviderRuRu
11
from munch import munchify
12
from op_faker import OP_Provider
13
from .local_time import get_now, TZ
14
15 16 17 18 19
fake_en = Factory.create(locale='en_US')
fake_ru = Factory.create(locale='ru_RU')
fake_uk = Factory.create(locale='uk_UA')
fake_uk.add_provider(OP_Provider)
fake = fake_uk
20
used_identifier_id = []
AlexDiatlov authored
21 22 23 24
mode_open = ["belowThreshold", "aboveThresholdUA", "aboveThresholdEU",
             "aboveThresholdUA.defense", "competitiveDialogueUA", "competitiveDialogueEU", "esco",
             "closeFrameworkAgreementUA"]
mode_limited = ["reporting", "negotiation.quick", "negotiation"]
25
violationType = ["corruptionDescription", "corruptionProcurementMethodType", "corruptionChanges",
AlexDiatlov authored
26 27
                 "corruptionPublicDisclosure", "corruptionBiddingDocuments", "documentsForm",
                 "corruptionAwarded", "corruptionCancelled", "corruptionContracting"]
ivanka12 authored
28
29 30 31 32
# This workaround fixes an error caused by missing "catch_phrase" class method
# for the "ru_RU" locale in Faker >= 0.7.4
fake_ru.add_provider(CompanyProviderEnUs)
fake_ru.add_provider(CompanyProviderRuRu)
33
34
35 36 37 38
def create_fake_sentence():
    return fake.sentence(nb_words=10, variable_nb_words=True)

kvik authored
39 40 41 42
def create_fake_funder():
    return fake.funders_data()

kvik authored
43 44 45 46
def get_fake_funder_scheme():
    return fake.funder_scheme()

qa-user-1 authored
47 48
def create_fake_amount(award_amount, tender_value_added_tax_included, contract_value_added_tax_included):
    min_amount_net = award_amount / 1.2
qa-user-1 authored
49 50 51
    range_amount_net = award_amount - min_amount_net
    half_min_amount_net = min_amount_net + range_amount_net / 2
    half_max_amount_net = half_min_amount_net + range_amount_net
qa-user-1 authored
52
    if tender_value_added_tax_included == True and contract_value_added_tax_included == True:
qa-user-1 authored
53
        return round(random.uniform(half_min_amount_net, award_amount), 2)
qa-user-1 authored
54
    if tender_value_added_tax_included == False and contract_value_added_tax_included == True:
qa-user-1 authored
55
        return round(random.uniform(award_amount, half_max_amount_net), 2)
qa-user-1 authored
56 57 58 59
    if tender_value_added_tax_included == True and contract_value_added_tax_included == False:
        return round(random.uniform(half_min_amount_net, award_amount), 2)
    if tender_value_added_tax_included == False and contract_value_added_tax_included == False:
        return round(random.uniform(half_min_amount_net, award_amount), 2)
qa-user-1 authored
60 61

qa-user-1 authored
62
def create_fake_amount_net(award_amount, tender_value_added_tax_included, contract_value_added_tax_included):
qa-user-1 authored
63
    min_amount_net = award_amount / 1.2
qa-user-1 authored
64 65
    range_amount_net = award_amount - min_amount_net
    half_min_amount_net = min_amount_net + range_amount_net / 2
qa-user-1 authored
66
    if tender_value_added_tax_included == True and contract_value_added_tax_included == True:
qa-user-1 authored
67
        return round(random.uniform(min_amount_net, half_min_amount_net), 2)
qa-user-1 authored
68 69 70 71 72
    if tender_value_added_tax_included == False and contract_value_added_tax_included == True:
        return round(random.uniform(half_min_amount_net, award_amount), 2)
    if tender_value_added_tax_included == True and contract_value_added_tax_included == False:
        return round(random.uniform(half_min_amount_net, award_amount), 2)
    if tender_value_added_tax_included == False and contract_value_added_tax_included == False:
qa-user-1 authored
73
        return round(random.uniform(half_min_amount_net, award_amount), 2)
74
75
qa-user-1 authored
76 77 78 79 80 81 82 83
def create_fake_amount_paid(contract_amount, contract_amountNet):
    minimum = contract_amountNet
    maximum = contract_amount
    range = maximum - minimum
    half_min_range = minimum + range / 2
    return round(random.uniform(minimum, half_min_range), 2)

kvik authored
84 85 86 87
def create_fake_number(min_number, max_number):
    return random.randint(int(min_number), int(max_number))

qa-user-1 authored
88 89 90 91
def create_fake_number_float(min_number, max_number):
    return round(random.uniform(float(min_number), float(max_number)), 3)

92 93 94
def create_fake_title():
    return u"[ТЕСТУВАННЯ] {}".format(fake.title())
95
96 97 98
def create_fake_date():
    return get_now().isoformat()
ivanka12 authored
99
100 101 102 103 104 105 106 107
def create_fake_period(days=0, hours=0, minutes=0):
    data = {
        "startDate": get_now().isoformat(),
        "endDate": (get_now() + timedelta(days=days, hours=hours, minutes=minutes)).isoformat()
    }
    return data

ivanka12 authored
108
def subtraction(value1, value2):
AlexDiatlov authored
109 110
    if "." in str(value1) or "." in str(value2):
        return (float(value1) - float(value2))
ivanka12 authored
111
    else:
AlexDiatlov authored
112
        return (int(value1) - int(value2))
ivanka12 authored
113
114
115 116 117
def create_fake_value_amount():
    return fake.random_int(min=1)
AlexDiatlov authored
118
119 120
def get_number_of_minutes(days, accelerator):
    return 1440 * int(days) / accelerator
121
AlexDiatlov authored
122
Leits authored
123
def field_with_id(prefix, sentence):
124 125 126 127 128 129 130 131 132 133
    return u"{}-{}: {}".format(prefix, fake.uuid4()[:8], sentence)


def translate_country_en(country):
    if country == u"Україна":
        return "Ukraine"
    else:
        raise Exception(u"Cannot translate country to english: {}".format(country))

ivanka12 authored
134
def convert_amount(amount):
AlexDiatlov authored
135
    return ("{:,}".format(float(amount))).replace(',', ' ').replace('.', ',')
ivanka12 authored
136 137

138 139 140 141 142
def translate_country_ru(country):
    if country == u"Україна":
        return u"Украина"
    else:
        raise Exception(u"Cannot translate country to russian: {}".format(country))
Leits authored
143 144

145 146
def create_fake_doc():
    content = fake.text()
147
    suffix = fake.random_element(('.doc', '.docx', '.pdf'))
148 149
    prefix = "{}-{}{}".format("d", fake.uuid4()[:8], fake_en.word())
    tf = NamedTemporaryFile(delete=False, suffix=suffix, prefix=prefix)
150 151
    tf.write(content)
    tf.close()
mykhaly authored
152
    return tf.name.replace('\\', '\\\\'), os.path.basename(tf.name), content
153
selurvedu authored
154
155
def create_fake_IsoDurationType(
AlexDiatlov authored
156 157
        years=0, months=0, days=0):
    return u"P{}Y{}M{}D".format(years, months, days)
158 159

160
def test_tender_data(params,
AlexDiatlov authored
161
                     plan_data,
162
                     periods=("enquiry", "tender"),
163
                     submissionMethodDetails=None,
kvik authored
164
                     funders=None,
165
                     accelerator=None):
166 167
    submissionMethodDetails = submissionMethodDetails \
        if submissionMethodDetails else "quick"
selurvedu authored
168
    now = get_now()
169
    value_amount = round(random.uniform(3000, 99999999.99), 2)  # max value equals to budget of Ukraine in hryvnias
qa-user-1 authored
170
    vat_included = params.get('vat_included', True)
171
    data = {
selurvedu authored
172
        "mode": "test",
173
        "submissionMethodDetails": submissionMethodDetails,
174 175 176 177 178 179 180
        "description": fake.description(),
        "description_en": fake_en.sentence(nb_words=10, variable_nb_words=True),
        "description_ru": fake_ru.sentence(nb_words=10, variable_nb_words=True),
        "title": fake.title(),
        "title_en": fake_en.catch_phrase(),
        "title_ru": fake_ru.catch_phrase(),
        "procuringEntity": fake.procuringEntity(),
181
        "procurementMethodType": "belowThreshold",
selurvedu authored
182
        "value": {
183
            "amount": value_amount,
184
            "currency": u"UAH",
qa-user-1 authored
185
            "valueAddedTaxIncluded": vat_included
selurvedu authored
186 187
        },
        "minimalStep": {
188
            "amount": round(random.uniform(0.005, 0.03) * value_amount, 2),
qa-user-1 authored
189 190
            "currency": u"UAH",
            "valueAddedTaxIncluded": vat_included
selurvedu authored
191
        },
192 193
        "items": [],
        "features": []
194
    }
195 196 197 198 199 200
    if params.get("mode") == "open_framework":
        data["mainProcurementCategory"] = random.choice(['goods', 'services'])
    elif params.get("mode") == "open_competitive_dialogue":
        data["mainProcurementCategory"] = random.choice(['services', 'works'])
    else:
        data["mainProcurementCategory"] = random.choice(['goods', 'services', 'works'])
201 202
    accelerator = accelerator \
        if accelerator else params['intervals']['accelerator']
203
    data['procurementMethodDetails'] = 'quick, ' \
AlexDiatlov authored
204
                                       'accelerator={}'.format(accelerator)
205 206 207 208 209
    data["procuringEntity"]["kind"] = "other"
    if data.get("mode") == "test":
        data["title"] = u"[ТЕСТУВАННЯ] {}".format(data["title"])
        data["title_en"] = u"[TESTING] {}".format(data["title_en"])
        data["title_ru"] = u"[ТЕСТИРОВАНИЕ] {}".format(data["title_ru"])
210 211
    period_dict = {}
    inc_dt = now
212
    for period_name in periods:
213 214
        period_dict[period_name + "Period"] = {}
        for i, j in zip(range(2), ("start", "end")):
215
            inc_dt += timedelta(minutes=params['intervals'][period_name][i])
216
            period_dict[period_name + "Period"][j + "Date"] = inc_dt.astimezone(TZ).isoformat()
217
    data.update(period_dict)
AlexDiatlov authored
218 219 220 221 222
    if params.get('plan_tender'):
        data["procuringEntity"]["name"] = plan_data["data"]["procuringEntity"]["name"]
        data["procuringEntity"]["identifier"] = plan_data["data"]["procuringEntity"]["identifier"]
        cpv_group = plan_data["data"]["classification"]["id"]
    elif params.get('moz_integration'):
223
        cpv_group = 336
224 225 226 227
    elif params.get('road_index'):
        cpv_group = 'road'
    elif params.get('gmdn_index'):
        cpv_group = 'gmdn'
228 229
    else:
        cpv_group = fake.cpv()[:4]
230
    if params.get('number_of_lots'):
231
        data['lots'] = []
232
        for lot_number in range(params['number_of_lots']):
233
            lot_id = uuid4().hex
qa-user-1 authored
234
            new_lot = test_lot_data(data['value']['amount'], vat_included)
235 236
            data['lots'].append(new_lot)
            data['lots'][lot_number]['id'] = lot_id
237
            for i in range(params['number_of_items']):
238
                new_item = test_item_data(cpv_group)
Leits authored
239
                new_item['relatedLot'] = lot_id
240
                data['items'].append(new_item)
241
        value_amount = round(sum(lot['value']['amount'] for lot in data['lots']), 2)
242 243 244
        minimalStep = min(lot['minimalStep']['amount'] for lot in data['lots'])
        data['value']['amount'] = value_amount
        data['minimalStep']['amount'] = minimalStep
245 246 247
        if params.get('lot_meat'):
            new_feature = test_feature_data()
            new_feature['featureOf'] = "lot"
248
            data['lots'][0]['id'] = data['lots'][0].get('id', uuid4().hex)
249 250
            new_feature['relatedItem'] = data['lots'][0]['id']
            data['features'].append(new_feature)
251
    else:
252
        for i in range(params['number_of_items']):
253 254
            new_item = test_item_data(cpv_group)
            data['items'].append(new_item)
qa-user-1 authored
255 256 257 258 259 260 261 262 263 264 265 266 267
    milestones = params.get('number_of_milestones')
    if milestones:
        data['milestones'] = []
        percentage_data = percentage_generation(milestones)
        for percentage in percentage_data:
            milestone_element = test_milestone_data()
            milestone_element['sequenceNumber'] = len(data['milestones'])
            milestone_element['percentage'] = percentage
            if milestone_element['title'] == 'anotherEvent':
                milestone_element['description'] = fake.sentence(nb_words=40, variable_nb_words=True)
            if params.get('number_of_lots'):
                milestone_element['relatedLot'] = lot_id
            data["milestones"].append(milestone_element)
268
    if params.get('tender_meat'):
269 270 271
        new_feature = test_feature_data()
        new_feature.featureOf = "tenderer"
        data['features'].append(new_feature)
272
    if params.get('item_meat'):
273 274
        new_feature = test_feature_data()
        new_feature['featureOf'] = "item"
275
        data['items'][0]['id'] = data['items'][0].get('id', uuid4().hex)
276 277
        new_feature['relatedItem'] = data['items'][0]['id']
        data['features'].append(new_feature)
278 279
    if not data['features']:
        del data['features']
kvik authored
280 281
    if funders is not None:
        data['funders'] = [fake.funders_data() for _ in range(int(funders))]
282
    data['status'] = 'draft'
283
    return munchify(data)
selurvedu authored
284
285
286 287 288
def test_tender_data_planning(params):
    data = {
        "budget": {
289
            "amountNet": round(random.uniform(3000, 999999.99), 2),
290 291 292 293 294 295
            "description": fake.description(),
            "project": {
                "id": str(fake.random_int(min=1, max=999)),
                "name": fake.description(),
            },
            "currency": "UAH",
296
            "amount": round(random.uniform(3000, 99999999.99), 2),
297
            "id": str(fake.random_int(min=1, max=99999999999)) + "-" + str(fake.random_int(min=1, max=9)),
298 299 300 301 302
            "breakdown": [],
            "period": {
                "startDate": get_now().replace(hour=0, minute=0, second=0, microsecond=0).isoformat(),
                "endDate": get_now().replace(hour=0, minute=0, second=0, microsecond=0).isoformat()
            }
303 304
        },
        "procuringEntity": {
305
            #"kind": "general",
306 307
            "identifier": {
                "scheme": "UA-EDR",
AlexDiatlov authored
308 309
                "id": random.choice(["13313462", "00037256"]),
                "legalName": random.choice([u"Київський Тестовий Ліцей", u"Київська Тестова міська клінічна лікарня"]),
310
            },
311 312 313 314 315 316 317
            "address": {
                "countryName": "Україна",
                "postalCode": "01220",
                "region": "м. Київ",
                "streetAddress": "вул. Банкова, 11, корпус 1",
                "locality": "м. Київ"
            }
318 319
        },
        "tender": {
ivanka12 authored
320 321
            "procurementMethod": "",
            "procurementMethodType": params['mode'],
322
            "tenderPeriod": {
323
                "startDate": get_now().replace(hour=0, minute=0, second=0, microsecond=0).isoformat()
324 325
            }
        },
326
        "mode": "test",
AlexDiatlov authored
327 328
        "items": [],
        "buyers": []
AlexDiatlov authored
329
    }
AlexDiatlov authored
330
    data["procuringEntity"]["name"] = data["procuringEntity"]["identifier"]["legalName"]
331 332 333 334 335 336
    if params.get("mode") == "aboveThresholdUA.defense":
        data["procuringEntity"]["kind"] = "defense"
    elif params.get("mode") in ["belowThreshold", "reporting"]:
        data["procuringEntity"]["kind"] = "other"
    else:
        data["procuringEntity"]["kind"] = random.choice(["general", "special", "central", "authority", "social"])
AlexDiatlov authored
337 338 339 340 341 342
    buyers = test_buyers_data()
    buyers["name"] = buyers["identifier"]["legalName"]
    data['buyers'].append(buyers)
    if params.get('moz_integration'):
        id_cpv = 336
    elif params.get('road_index'):
343
        id_cpv = fake.road_cpv()[:4]
AlexDiatlov authored
344
    elif params.get('gmdn_index'):
345
        id_cpv = fake.gmdn_cpv()[:4]
AlexDiatlov authored
346 347 348
    else:
        id_cpv = fake.cpv()[:4]
    cpv_data = test_item_data(id_cpv)
349 350 351 352 353 354 355 356 357 358
    data.update(cpv_data)
    del data['deliveryDate']
    del data['description']
    del data['description_en']
    del data['description_ru']
    del data['deliveryAddress']
    del data['deliveryLocation']
    del data['quantity']
    del data['unit']
    for i in range(params['number_of_items']):
359
        item_data = test_item_data(id_cpv)
360 361
        del item_data['deliveryAddress']
        del item_data['deliveryLocation']
AlexDiatlov authored
362 363
        item_data['deliveryDate']['endDate'] = (get_now() + timedelta(days=10)).replace(hour=0, minute=0, second=0,
                                                                                        microsecond=0).isoformat()
364 365
        del item_data['deliveryDate']['startDate']
        data['items'].append(item_data)
ivanka12 authored
366 367 368 369
    if params['mode'] in mode_open:
        data["tender"]["procurementMethod"] = "open"
    if params['mode'] in mode_limited:
        data["tender"]["procurementMethod"] = "limited"
AlexDiatlov authored
370 371 372 373 374 375
    if params.get('number_of_breakdown'):
        value_data = breakdown_value_generation(params['number_of_breakdown'], data['budget']['amount'])
        for value in value_data:
            breakdown_element = test_breakdown_data()
            breakdown_element['value']['amount'] = value
            data['budget']['breakdown'].append(breakdown_element)
376 377 378
    return munchify(data)

379 380
def test_tender_data_limited(params, plan_data):
    data = test_tender_data(params, plan_data)
381 382 383 384
    del data["submissionMethodDetails"]
    del data["minimalStep"]
    del data["enquiryPeriod"]
    del data["tenderPeriod"]
385
    for lot in data.get('lots', []):
Krokop authored
386
        lot.pop('minimalStep', None)
387
    data["procuringEntity"]["kind"] = "general"
388 389
    data.update({"procurementMethodType": params['mode'], "procurementMethod": "limited"})
    if params['mode'] == "negotiation":
390
        cause_variants = (
391 392 393 394 395 396
            "resolvingInsolvency",
            "artPurchase",
            "contestWinner",
            "technicalReasons",
            "intProperty",
            "lastHope",
397 398 399 400 401 402
            "twiceUnsuccessful",
            "additionalPurchase",
            "additionalConstruction",
            "stateLegalServices"
        )
        cause = fake.random_element(cause_variants)
403 404 405 406
        data.update({
            "cause": cause,
            "causeDescription": fake.description()
        })
407
    elif params['mode'] == "negotiation.quick":
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
        cause_variants = (
            "resolvingInsolvency",
            "artPurchase",
            "contestWinner",
            "technicalReasons",
            "intProperty",
            "lastHope",
            "twiceUnsuccessful",
            "additionalPurchase",
            "additionalConstruction",
            "stateLegalServices",
            "emergency",
            "humanitarianAid",
            "contractCancelled",
            "activeComplaint"
        )
424
        cause = fake.random_element(cause_variants)
425
        data.update({
426
            "cause": cause,
427
            "causeDescription": fake.description()
428
        })
429 430
    #if params['mode'] in ("negotiation", "negotiation.quick"):
        #cause = fake.random_element(cause_variants)
431
    return munchify(data)
432 433

434
def test_feature_data():
435 436
    words = fake.words()
    feature = {
437 438
        "code": uuid4().hex,
        "title": field_with_id("f", fake.title()),
439 440
        "title_en": field_with_id('f', fake_en.sentence(nb_words=5, variable_nb_words=True)),
        "title_ru": field_with_id('f', fake_ru.sentence(nb_words=5, variable_nb_words=True)),
441 442 443 444
        "description": fake.description(),
        "enum": [
            {
                "value": 0.05,
445
                "title": words[0]
446 447 448
            },
            {
                "value": 0.01,
449
                "title": words[1]
450 451 452
            },
            {
                "value": 0,
453
                "title": words[2]
454 455
            }
        ]
456 457
    }
    return munchify(feature)
458 459

Leits authored
460
def test_question_data():
qa-user-1 authored
461 462 463 464 465 466 467
    data = {
        "author": fake.procuringTenderer(),
        "description": fake.description(),
        "title": field_with_id("q", fake.title())
    }
    del data['author']['scale']
    return munchify({'data': data})
468 469

470 471 472 473 474
def test_related_question(question, relation, obj_id):
    question.data.update({"questionOf": relation, "relatedItem": obj_id})
    return munchify(question)

475
def test_question_answer_data():
Taras Kozlovskyi authored
476
    return munchify({
477 478 479
        "data": {
            "answer": fake.sentence(nb_words=40, variable_nb_words=True)
        }
Taras Kozlovskyi authored
480
    })
481
selurvedu authored
482
483
def test_complaint_data():
qa-user-1 authored
484 485 486
    data = {
        "author": fake.procuringTenderer(),
        "description": fake.description(),
AlexDiatlov authored
487 488
        "title": field_with_id("q", fake.title()),
        "type": "complaint"
qa-user-1 authored
489 490 491
    }
    del data['author']['scale']
    return munchify({'data': data})
492 493

494 495 496 497
def test_payment_data(token, complaint_value, complaint_uaid):
    data = {
            "amount": str(complaint_value),
            "currency": "UAH",
498
            "description": generate_payment_description(token, complaint_uaid),
499 500 501 502 503 504
            "type": "credit",
            "date_oper": get_now().isoformat(),
            "account": "UA723004380000026001503374077",
            "okpo": "14360570",
            "mfo": "123456",
            "name": u"Плат.интер-эквайрин через LiqPay"
505 506 507 508 509 510 511
    }
    return data


def generate_payment_description(token, complaint_uaid):
    full_hash = hashlib.sha512(token).hexdigest()
    short_hash = full_hash[0:8]
512
    description = complaint_uaid + '-' + short_hash + ' [TESTING, ROBOT TESTS]'
513 514 515
    return description

516 517 518 519 520 521 522 523 524 525 526 527 528 529
def test_accept_complaint_data():
    data = {
        "status": "accepted",
        "reviewDate": get_now().isoformat(),
        "reviewPlace": "Place of review"
    }
    return munchify({'data': data})


def test_reject_complaint_data():
    data = {
        "rejectReason": random.choice(["lawNonCompliance", "buyerViolationsCorrected", "alreadyExists", "tenderCancelled"])
    }
    return munchify({'data': data})
530
selurvedu authored
531
AlexDiatlov authored
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
def test_award_complaint_data():
    data = {
        "author": fake.procuringTenderer(),
        "description": fake.description(),
        "title": field_with_id("q", fake.title()),
        "type": "complaint"
    }
    del data['author']['scale']
    return munchify({'data': data})


def test_claim_data():
    data = {
        "author": fake.procuringTenderer(),
        "description": fake.description(),
        "title": field_with_id("q", fake.title()),
        "type": "claim"
    }
    del data['author']['scale']
    return munchify({'data': data})
552 553

554
def test_claim_answer_data(status):
555 556 557
    return munchify({
        "data": {
            "status": "answered",
558
            "resolutionType": status,
559 560 561 562 563 564
            "tendererAction": fake.sentence(nb_words=10, variable_nb_words=True),
            "resolution": fake.sentence(nb_words=15, variable_nb_words=True)
        }
    })

565
def test_confirm_data(id):
mykhaly authored
566
    return munchify({
567 568
        "data": {
            "status": "active",
569
            "id": id
570
        }
mykhaly authored
571
    })
572 573

574 575 576 577 578 579 580 581 582
def test_cancel_pending_data(id):
    return munchify({
        "data": {
            "status": "pending",
            "id": id
        }
    })

583
def test_submit_claim_data(claim_id):
mykhaly authored
584
    return munchify({
585
        "data": {
586
            "id": claim_id,
587 588
            "status": "claim"
        }
mykhaly authored
589
    })
590 591

592 593
def test_complaint_reply_data():
    return munchify({
selurvedu authored
594
        "data": {
595 596 597 598
            "status": "resolved"
        }
    })
599
600 601 602 603
def test_bid_competitive_data():
    bid = munchify({
        "data": {
            "tenderers": [
604
                fake.procuringTenderer()
605 606 607
            ]
        }
    })
608 609
    if len(used_identifier_id) == 3:
        del used_identifier_id[0]
610 611 612
    id = bid.data.tenderers[0].identifier.id
    while (id in used_identifier_id):
        bid = munchify({
613 614
            "data": {
                "tenderers": [
qa-user-1 authored
615
                    fake.procuringTenderer()
616 617 618
                ]
            }
        })
619 620 621 622 623 624 625 626
        id = bid.data.tenderers[0].identifier.id
    used_identifier_id.append(id)
    bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName)
    bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName)
    bid.data['status'] = 'draft'
    return bid

627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
def test_bid_competitive_data_stage_2(id):
    bid = munchify({
        "data": {
            "tenderers": [
                fake.procuringTenderer()
            ]
        }
    })
    bid.data.tenderers[0].identifier.id = id
    bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName)
    bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName)
    bid.data['status'] = 'draft'
    return bid

642
def test_bid_data():
643
    bid = munchify({
644 645
        "data": {
            "tenderers": [
646
                fake.procuringTenderer()
647
            ]
648
        }
649 650 651
    })
    bid.data.tenderers[0].address.countryName_en = translate_country_en(bid.data.tenderers[0].address.countryName)
    bid.data.tenderers[0].address.countryName_ru = translate_country_ru(bid.data.tenderers[0].address.countryName)
652
    bid.data['status'] = 'draft'
653
    return bid
654
selurvedu authored
655
qa-user-1 authored
656
def test_bid_value(max_value_amount, vat_included):
657
    return munchify({
658 659
        "value": {
            "currency": "UAH",
660
            "amount": round(random.uniform((0.95 * max_value_amount), max_value_amount), 2),
qa-user-1 authored
661
            "valueAddedTaxIncluded": vat_included
662 663
        }
    })
Leits authored
664 665

ivanka12 authored
666 667 668
def test_bid_value_esco(tender_data):
    annual_cost = []
    for i in range(0, 21):
AlexDiatlov authored
669
        cost = round(random.uniform(1, 100), 2)
ivanka12 authored
670 671
        annual_cost.append(cost)
    if tender_data['fundingKind'] == "budget":
AlexDiatlov authored
672
        yearly_percentage = round(random.uniform(0.01, float(tender_data['yearlyPaymentsPercentageRange'])), 5)
ivanka12 authored
673
    else:
AlexDiatlov authored
674
        yearly_percentage = 0.8
ivanka12 authored
675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
    # when tender fundingKind is budget, yearlyPaymentsPercentageRange should be less or equal 0.8, and more or equal 0
    # when tender fundingKind is other, yearlyPaymentsPercentageRange should be equal 0.8
    return munchify({
        "value": {
            "currency": "UAH",
            "valueAddedTaxIncluded": True,
            "yearlyPaymentsPercentage": yearly_percentage,
            "annualCostsReduction": annual_cost,
            "contractDuration": {
                "years": random.randint(7, 14),
                "days": random.randint(1, 364)
            }
        }
    })

691 692 693 694 695 696 697 698 699 700
def test_bid_data_selection(data, index):
    bid = munchify({
        "data": {
            "tenderers": [
                data['agreements'][0]['contracts'][index]['suppliers'][0]
            ]
        }
    })
    bid.data['status'] = 'draft'
    bid.data['parameters'] = data['agreements'][0]['contracts'][index]['parameters']
AlexDiatlov authored
701 702 703
    bid.data['lotValues'] = [test_bid_value(data['agreements'][0]['contracts'][index]['value']['amount'],
                                            data['agreements'][0]['contracts'][index]['value'][
                                                'valueAddedTaxIncluded'])]
704 705
    return bid
ivanka12 authored
706
707
def test_supplier_data():
mykhaly authored
708
    return munchify({
709 710
        "data": {
            "suppliers": [
qa-user-1 authored
711
                fake.procuringTenderer()
712 713
            ],
            "value": {
714
                "amount": fake.random_int(min=1),
715 716
                "currency": "UAH",
                "valueAddedTaxIncluded": True
717 718
            },
            "qualified": True
719
        }
mykhaly authored
720
    })
721 722

723 724 725
def test_item_data(cpv=None):
    data = fake.fake_item(cpv)
    data["description"] = field_with_id("i", data["description"])
726 727
    data["description_en"] = field_with_id("i", data["description_en"])
    data["description_ru"] = field_with_id("i", data["description_ru"])
728 729
    startDate = fake.random_int(min=1, max=30)
    endDate = startDate + fake.random_int(min=1, max=7)
730
    data["deliveryDate"] = {
AlexDiatlov authored
731 732 733 734
        "startDate": (get_now() + timedelta(days=startDate)).astimezone(TZ).replace(hour=0, minute=0, second=0,
                                                                                    microsecond=0).isoformat(),
        "endDate": (get_now() + timedelta(days=endDate)).astimezone(TZ).replace(hour=0, minute=0, second=0,
                                                                                microsecond=0).isoformat()
735
    }
736 737 738
    data["deliveryAddress"]["countryName_en"] = translate_country_en(data["deliveryAddress"]["countryName"])
    data["deliveryAddress"]["countryName_ru"] = translate_country_ru(data["deliveryAddress"]["countryName"])
    return munchify(data)
Leits authored
739 740 741 742 743 744 745


def test_invalid_features_data():
    return [
        {
            "code": "ee3e24bc17234a41bd3e3a04cc28e9c6",
            "featureOf": "tenderer",
746 747
            "title": fake.title(),
            "description": fake.description(),
Leits authored
748 749 750
            "enum": [
                {
                    "value": 0.35,
751
                    "title": fake.word()
Leits authored
752
                },
Leits authored
753 754
                {
                    "value": 0,
755
                    "title": fake.word()
Leits authored
756 757 758 759
                }
            ]
        }
    ]
Leits authored
760 761

qa-user-1 authored
762
def test_lot_data(max_value_amount, vat_included=True):
763
    value_amount = round(random.uniform(1, max_value_amount), 2)
Leits authored
764
    return munchify(
Leits authored
765
        {
766 767
            "description": fake.description(),
            "title": field_with_id('l', fake.title()),
768 769
            "title_en": field_with_id('l', fake_en.sentence(nb_words=5, variable_nb_words=True)),
            "title_ru": field_with_id('l', fake_ru.sentence(nb_words=5, variable_nb_words=True)),
Leits authored
770 771
            "value": {
                "currency": "UAH",
772
                "amount": value_amount,
qa-user-1 authored
773
                "valueAddedTaxIncluded": vat_included
Leits authored
774 775 776
            },
            "minimalStep": {
                "currency": "UAH",
777
                "amount": round(random.uniform(0.005, 0.03) * value_amount, 2),
qa-user-1 authored
778
                "valueAddedTaxIncluded": vat_included
Leits authored
779 780 781
            },
            "status": "active"
        })
Leits authored
782 783

Leits authored
784 785 786
def test_lot_document_data(document, lot_id):
    document.data.update({"documentOf": "lot", "relatedItem": lot_id})
    return munchify(document)
Leits authored
787
788
789 790 791
def test_change_document_data(document, change_id):
    document.data.update({"documentOf": "change", "relatedItem": change_id})
    return munchify(document)
Leits authored
792 793

794
def test_tender_data_openua(params, submissionMethodDetails, plan_data):
795 796 797
    # We should not provide any values for `enquiryPeriod` when creating
    # an openUA or openEU procedure. That field should not be present at all.
    # Therefore, we pass a nondefault list of periods to `test_tender_data()`.
798
    data = test_tender_data(params, plan_data, ('tender',), submissionMethodDetails)
799 800 801
    data['procurementMethodType'] = 'aboveThresholdUA'
    data['procuringEntity']['kind'] = 'general'
    return data
Leits authored
802
selurvedu authored
803
804
def test_tender_data_openua_defense(params, submissionMethodDetails, plan_data):
805 806 807
    """We should not provide any values for `enquiryPeriod` when creating
    an openUA, openEU or openUA_defense procedure. That field should not be present at all.
    Therefore, we pass a nondefault list of periods to `test_tender_data()`."""
808
    data = test_tender_data(params, plan_data, ('tender',), submissionMethodDetails)
809 810 811 812 813
    data['procurementMethodType'] = 'aboveThresholdUA.defense'
    data['procuringEntity']['kind'] = 'defense'
    return data

AlexDiatlov authored
814
def test_tender_data_openeu(params, submissionMethodDetails, plan_data):
Leits authored
815 816 817
    # We should not provide any values for `enquiryPeriod` when creating
    # an openUA or openEU procedure. That field should not be present at all.
    # Therefore, we pass a nondefault list of periods to `test_tender_data()`.
AlexDiatlov authored
818
    data = test_tender_data(params, plan_data, ('tender',), submissionMethodDetails)
819 820 821
    data['procurementMethodType'] = 'aboveThresholdEU'
    data['title_en'] = "[TESTING]"
    for item_number, item in enumerate(data['items']):
Leits authored
822
        item['description_en'] = "Test item #{}".format(item_number)
823
    data['procuringEntity']['name_en'] = fake_en.name()
824 825
    data['procuringEntity']['contactPoint']['name_en'] = fake_en.name()
    data['procuringEntity']['contactPoint']['availableLanguage'] = "en"
AlexDiatlov authored
826 827
    data['procuringEntity']['identifier'][
        'legalName_en'] = u"Institution \"Vinnytsia City Council primary and secondary general school № 10\""
828 829
    data['procuringEntity']['kind'] = 'general'
    return data
830 831

832 833
def test_tender_data_framework_agreement(params, submissionMethodDetails, plan_data):
    data = test_tender_data_openeu(params, submissionMethodDetails, plan_data)
834 835
    data['procurementMethodType'] = 'closeFrameworkAgreementUA'
    data['maxAwardsCount'] = fake.random_int(min=3, max=5)
836 837 838
    data['agreementDuration'] = create_fake_IsoDurationType(
        years=fake.random_int(min=1, max=3),
        months=fake.random_int(min=1, max=8),
AlexDiatlov authored
839
        days=fake.random_int(min=1, max=6)
840
    )
841 842 843
    return data

844
def test_tender_data_competitive_dialogue(params, submissionMethodDetails, plan_data):
845 846 847
    # We should not provide any values for `enquiryPeriod` when creating
    # an openUA or openEU procedure. That field should not be present at all.
    # Therefore, we pass a nondefault list of periods to `test_tender_data()`.
848
    data = test_tender_data(params, plan_data, ('tender',), submissionMethodDetails)
849 850 851 852 853
    if params.get('dialogue_type') == 'UA':
        data['procurementMethodType'] = 'competitiveDialogueUA'
    else:
        data['procurementMethodType'] = 'competitiveDialogueEU'
        data['procuringEntity']['contactPoint']['availableLanguage'] = "en"
854 855 856 857 858 859 860 861
    data['title_en'] = "[TESTING] {}".format(fake_en.sentence(nb_words=3, variable_nb_words=True))
    for item in data['items']:
        item['description_en'] = fake_en.sentence(nb_words=3, variable_nb_words=True)
    data['procuringEntity']['name_en'] = fake_en.name()
    data['procuringEntity']['contactPoint']['name_en'] = fake_en.name()
    data['procuringEntity']['identifier']['legalName_en'] = fake_en.sentence(nb_words=10, variable_nb_words=True)
    data['procuringEntity']['kind'] = 'general'
    return data
862 863

864
def test_tender_data_selection(procedure_intervals, params, submissionMethodDetails, tender_data=None, plan_data=None):
865 866
    intervals = procedure_intervals['framework_selection']
    params['intervals'] = intervals
867
    data = test_tender_data(params, plan_data, (), submissionMethodDetails)
868 869 870 871 872 873
    data['title_en'] = "[TESTING]"
    data['procuringEntity'] = tender_data['data']['procuringEntity']
    del data['procuringEntity']['contactPoint']['availableLanguage']
    data['procurementMethodType'] = 'closeFrameworkAgreementSelectionUA'
    data['items'] = tender_data['data']['items']
    data['lots'] = tender_data['data']['lots']
874
    data['agreements'] = [{'id': tender_data['data']['agreements'][0]['id']}]
875 876
    del data['value']
    del data['minimalStep']
AlexDiatlov authored
877
    return munchify({'data': data})
878 879

880 881 882
def test_change_data():
    return munchify(
        {
AlexDiatlov authored
883 884 885 886 887 888 889 890 891
            "data":
                {
                    "rationale": fake.description(),
                    "rationale_en": fake_en.sentence(nb_words=10, variable_nb_words=True),
                    "rationale_ru": fake_ru.sentence(nb_words=10, variable_nb_words=True),
                    "rationaleTypes": fake.rationaleTypes(amount=3),
                    "status": "pending"
                }
        })
892 893

894 895 896
def test_agreement_change_data(rationaleType):
    return munchify(
        {
AlexDiatlov authored
897 898 899 900 901 902 903 904
            "data":
                {
                    "rationale": fake.description(),
                    "rationale_en": fake_en.sentence(nb_words=10, variable_nb_words=True),
                    "rationale_ru": fake_ru.sentence(nb_words=10, variable_nb_words=True),
                    "rationaleType": rationaleType,
                }
        })
905 906 907 908 909 910 911 912 913 914 915


def test_modification_data(item_id, field_name, field_value):
    data = {
        "modifications": [
            {
                "itemId": item_id,
                field_name: field_value
            }
        ]
    }
AlexDiatlov authored
916
    return munchify({'data': data})
917 918

919
def get_hash(file_contents):
AlexDiatlov authored
920
    return ("md5:" + hashlib.md5(file_contents).hexdigest())
921 922

AlexDiatlov authored
923 924 925 926 927 928 929 930
def test_monitoring_data(tender_id, accelerator=None):
    data = {"reasons": [random.choice(["public", "fiscal", "indicator", "authorities", "media"])],
            "tender_id": tender_id,
            "procuringStages": [random.choice(["awarding", "contracting", "planning"])],
            "parties": [test_party()],
            "mode": "test",
            'monitoringDetails': 'quick, ' 'accelerator={}'.format(accelerator)}
    return munchify({'data': data})
931 932

933 934 935 936 937
def test_party():
    party = fake.procuringEntity()
    party["roles"] = [random.choice(['sas', 'risk_indicator'])]
    party["name"] = "The State Audit Service of Ukraine"
    return munchify(party)
938 939

940
def test_dialogue():
941 942
    return munchify(
        {
AlexDiatlov authored
943 944 945 946 947 948
            "data":
                {
                    "title": fake_en.sentence(nb_words=10, variable_nb_words=True),
                    "description": fake_en.sentence(nb_words=10, variable_nb_words=True)
                }
        })
949 950

951
def test_conclusion(violationOccurred, relatedParty_id):
952
    return munchify(
AlexDiatlov authored
953 954 955 956 957 958 959
        {
            "data": {
                "conclusion": {
                    "violationOccurred": violationOccurred,
                    "violationType": random.choice(violationType),
                    "relatedParty": relatedParty_id,
                }
960
            }
AlexDiatlov authored
961
        })
962 963

964
def test_status_data(status, relatedParty_id=None):
965 966 967 968 969 970 971 972
    data = {
        "data": {
            "status": status
        }
    }
    if status in ('stopped', 'cancelled'):
        data["data"]["cancellation"] = {}
        data["data"]["cancellation"]["description"] = fake_en.sentence(nb_words=10, variable_nb_words=True)
973
        data["data"]["cancellation"]["relatedParty"] = relatedParty_id
974 975 976
    return munchify(data)

977
def test_elimination_report(corruption, relatedParty_id):
978 979 980 981 982 983
    return munchify({
        "data": {
            "eliminationResolution": {
                "resultByType": {
                    corruption: random.choice(["eliminated", "not_eliminated", "no_mechanism"])
                },
984
                "relatedParty": relatedParty_id,
985 986 987 988
                "result": random.choice(["completely", "partly", "none"]),
                "description": fake_en.sentence(nb_words=10, variable_nb_words=True)
            }
        }
989 990 991
    })

992
def test_tender_data_esco(params, submissionMethodDetails, plan_data):
993
    data = test_tender_data(params, plan_data, ('tender',), submissionMethodDetails)
994 995 996 997
    data['procurementMethodType'] = 'esco'
    data['title_en'] = "[TESTING]"
    for item_number, item in enumerate(data['items']):
        item['description_en'] = "Test item #{}".format(item_number)
998
        del item['unit']
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
    data['procuringEntity']['name_en'] = fake_en.name()
    data['procuringEntity']['contactPoint']['name_en'] = fake_en.name()
    data['procuringEntity']['contactPoint']['availableLanguage'] = "en"
    data['procuringEntity']['identifier']['legalName_en'] = fake_en.sentence(nb_words=10, variable_nb_words=True)
    data['procuringEntity']['kind'] = 'general'
    data['minimalStepPercentage'] = float(round(random.uniform(0.015, 0.03), 5))
    data['fundingKind'] = params['fundingKind']
    data['NBUdiscountRate'] = float(round(random.uniform(0, 0.99), 5))
    percentage_list = []
    del data["value"]
    del data["minimalStep"]
qa-user-1 authored
1010
    del data["milestones"]
1011 1012 1013 1014 1015
    for index in range(params['number_of_lots']):
        data['lots'][index]['fundingKind'] = data['fundingKind']
        if index == 0:
            data['lots'][index]['minimalStepPercentage'] = data['minimalStepPercentage']
        else:
AlexDiatlov authored
1016
            data['lots'][index]['minimalStepPercentage'] = round((float(data['minimalStepPercentage']) - 0.0002), 5)
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
        if data['fundingKind'] == "budget":
            data['lots'][index]['yearlyPaymentsPercentageRange'] = float(round(random.uniform(0.01, 0.8), 5))
        else:
            data['lots'][index]['yearlyPaymentsPercentageRange'] = 0.8
        percentage_list.append(data['lots'][index]['yearlyPaymentsPercentageRange'])
        del data['lots'][index]['value']
        del data['lots'][index]['minimalStep']
    if params['number_of_lots'] == 0:
        if data['fundingKind'] == "budget":
            data['yearlyPaymentsPercentageRange'] = float(round(random.uniform(0.01, 0.8), 3))
        else:
            data['yearlyPaymentsPercentageRange'] = 0.8
    else:
        data['yearlyPaymentsPercentageRange'] = min(percentage_list)
    for index in range(params['number_of_items']):
        del data['items'][index]['deliveryDate']
qa-user-1 authored
1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
    return data


def test_milestone_data():
    return munchify({
        "code": random.choice(["prepayment", "postpayment"]),
        "title": fake.milestone_title(),
        "duration": {
            "type": random.choice(["working", "banking", "calendar"]),
            "days": random.randint(1, 364)
        },
        "type": "financing"
    })


def percentage_generation(number_of_milestones):
    # input: number_of_milestones 1, 2, 3, ...
    # output: list of percentage numbers
    percentage_data = [random.randint(1, round(100 / number_of_milestones)) for _ in range(number_of_milestones - 1)]
    percentage_data.append(100 - sum(percentage_data))
qa-user-1 authored
1053 1054 1055 1056 1057
    return percentage_data


def invalid_INN_data():
    return munchify({
AlexDiatlov authored
1058 1059 1060
        "scheme": "INN",
        "description": "Insulin (human)",
        "id": "insulin (human)"
qa-user-1 authored
1061 1062 1063
    })

1064 1065
def invalid_cost_data():
    return munchify({
AlexDiatlov authored
1066 1067 1068
        "scheme": "UA-ROAD",
        "id": "H-08",
        "description": "Бориспіль - Дніпро - Запоріжжя (через м. Кременчук) - Маріуполь"
1069 1070 1071 1072 1073
    })


def invalid_gmdn_data():
    return munchify({
AlexDiatlov authored
1074 1075 1076
        "scheme": "GMDN",
        "id": "10082",
        "description": "Змішувач амальгами для стоматології"
1077 1078 1079
    })

AlexDiatlov authored
1080 1081
def test_buyers_data():
    buyers = {
1082
        "kind": "general",
AlexDiatlov authored
1083 1084 1085 1086
        "identifier": {
            "scheme": "UA-EDR",
            "id": random.choice(["13313462", "00037256"]),
            "legalName": random.choice([u"Київський Тестовий Ліцей", u"Київська Тестова міська клінічна лікарня"]),
1087 1088 1089 1090 1091 1092 1093
        },
        "address": {
            "countryName": "Україна",
            "postalCode": "01220",
            "region": "м. Київ",
            "streetAddress": "вул. Банкова, 11, корпус 1",
            "locality": "м. Київ"
AlexDiatlov authored
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106
        }
    }
    return munchify(buyers)


def invalid_buyers_data():
    buyers = {
        "identifier": {
            "scheme": "UA-EDR",
            "id": "13313462",
            "legalName": "Київський Тестовий Ліцей",
        },
        "name": "Київський Тестовий Ліцей"
AlexDiatlov authored
1107
    }
AlexDiatlov authored
1108
    return munchify(buyers)
AlexDiatlov authored
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132


def test_plan_cancel_data():
    plan_cancel = {
        "cancellation": {
            "reason": "Підстава для скасування",
            "reason_en": "Reason of the cancellation"
        }
    }
    return munchify(plan_cancel)


def test_confirm_plan_cancel_data():
    return munchify({
        "data": {
            "cancellation": {
                "status": "active"
            }
        }
    })


def test_breakdown_data():
    return munchify({
AlexDiatlov authored
1133
        "title": random.choice(["state", "local", "crimea", "own", "fund", "loan", "other"]),
AlexDiatlov authored
1134 1135 1136 1137 1138 1139 1140 1141 1142
        "description": fake.description(),
        "value": {
            "currency": "UAH"
        }
    })


def breakdown_value_generation(number_of_breakdown, plan_value):
    value_data = [round(random.uniform(1, plan_value / number_of_breakdown), 2) for _ in range(number_of_breakdown - 1)]
AlexDiatlov authored
1143
    value_data.append(round(plan_value - sum(value_data), 2))
AlexDiatlov authored
1144
    return value_data
AlexDiatlov authored
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156


def test_cancellation_data(procurement_method_type):
    if procurement_method_type == "aboveThresholdUA.defense":
        result = random.choice(["noDemand", "unFixable", "expensesCut"])
    elif procurement_method_type in ["negotiation", "negotiation.quick"]:
        result = random.choice(["noObjectiveness", "unFixable", "noDemand", "expensesCut", "dateViolation"])
    elif procurement_method_type == "belowThreshold":
        result = random.choice(["noDemand", "unFixable", "expensesCut"])
    else:
        result = random.choice(["noDemand", "unFixable", "forceMajeure", "expensesCut"])
    return munchify({"reasonType": result})
1157 1158 1159 1160 1161 1162 1163 1164 1165


def test_24_hours_data():
    return munchify({
        "data": {
                "code": "24h",
                "description": create_fake_sentence()
        }
    })