def test_plan_update_draft(app, mode, status): app.authorization = ("Basic", ("broker", "broker")) test_data = deepcopy(test_plan_data) if mode != "real": test_data["mode"] = "test" test_data["status"] = "draft" response = app.post_json("/plans", {"data": test_data}) assert response.status == "201 Created" assert response.json["data"].get("status") == "draft" plan_id = response.json["data"]["id"] acc_token = response.json["access"]["token"] response = app.patch_json( "/plans/{}?acc_token={}".format(plan_id, acc_token), {"data": { "status": status }}) assert response.status == "200 OK" assert response.json["data"].get("status") == status response = app.get("/plans?mode={}".format(mode)) assert response.status == "200 OK" assert len(response.json["data"]) == 1 assert response.json["data"][0]["id"] == plan_id response = app.get("/plans?feed=changes&mode={}".format(mode)) assert response.status == "200 OK" assert len(response.json["data"]) == 1 assert response.json["data"][0]["id"] == plan_id
def test_get_plan_tenders_405(app, plan): app.authorization = ("Basic", ("broker", "broker")) response = app.get("/plans/{}/tenders".format(plan["data"]["id"]), status=405) assert response.json == { u"status": u"error", u"errors": [{u"description": u"Method not allowed", u"location": u"request", u"name": u"method"}], }
def test_cancel_compatibility_completed_plan(app): """ well I don't know if it's an appropriate case. it's probably not """ app.authorization = ("Basic", ("broker", "broker")) test_data = deepcopy(test_plan_data) response = app.post_json("/plans", {"data": test_data}) assert response.status == "201 Created" plan = response.json["data"] acc_token = response.json["access"]["token"] obj = app.app.registry.db.get(plan["id"]) del obj["status"] obj["tender_id"] = "a" * 32 app.app.registry.db.save(obj) response = app.get("/plans/{}".format(plan["id"])) assert response.json["data"]["status"] == "complete" # complete ! response = app.patch_json( "/plans/{}?acc_token={}".format(plan["id"], acc_token), { "data": { "cancellation": { "reason": "Because it's possible", "status": "active" } } }) assert response.status == "200 OK" assert response.json["data"]["status"] == "cancelled" # cancelled !
def test_cancel_plan_2_steps(app, initial_status): app.authorization = ("Basic", ("broker", "broker")) test_data = deepcopy(test_plan_data) test_data["status"] = initial_status response = app.post_json("/plans", {"data": test_data}) assert response.status == "201 Created" assert response.json["data"].get("status") == initial_status plan_id = response.json["data"]["id"] acc_token = response.json["access"]["token"] response = app.patch_json( "/plans/{}?acc_token={}".format(plan_id, acc_token), {"data": {"cancellation": {"reason": "Because", "status": "pending"}}}, ) assert response.status == "200 OK" assert response.json["data"]["cancellation"]["status"] == "pending" assert response.json["data"].get("status") == initial_status create_time = response.json["data"]["cancellation"]["date"] response = app.patch_json( "/plans/{}?acc_token={}".format(plan_id, acc_token), {"data": {"cancellation": {"status": "active"}}} ) assert response.status == "200 OK" assert response.json["data"]["cancellation"]["status"] == "active" assert response.json["data"]["cancellation"]["date"] > create_time assert response.json["data"]["status"] == "cancelled" get_response = app.get("/plans/{}".format(plan_id)) assert get_response.json["data"]["cancellation"]["date"] == response.json["data"]["cancellation"]["date"]
def test_success_plan_tenders_creation(app, request_tender_data): app.authorization = ("Basic", ("broker", "broker")) request_plan_data = deepcopy(test_plan_data) if request_tender_data["procurementMethodType"] in ( "aboveThresholdUA.defense", "simple.defense"): request_plan_data['procuringEntity']['kind'] = 'defense' plan = create_plan_for_tender(app, request_tender_data, request_plan_data) response = app.post_json("/plans/{}/tenders".format(plan["data"]["id"]), {"data": request_tender_data}) assert response.status == "201 Created" tender_data = response.json["data"] assert tender_data["plans"] == [{"id": plan["data"]["id"]}] assert tender_data["title"] == request_tender_data["title"] assert response.headers[ "Location"] == "http://localhost/api/2.5/tenders/{}".format( tender_data["id"]) # get plan response = app.get("/plans/{}".format(plan["data"]["id"])) assert response.json["data"]["tender_id"] == tender_data["id"] # removing status (if the tender was created before the plan statuses release) plan_from_db = app.app.registry.databases.plans.get(plan["data"]["id"]) del plan_from_db["status"] app.app.registry.databases.plans.save(plan_from_db) # add another tender response = app.post_json("/plans/{}/tenders".format(plan["data"]["id"]), {"data": request_tender_data}, status=422) error_data = response.json["errors"] assert len(error_data) == 1 error = error_data[0] assert error["location"] == "body" assert error["name"] == "tender_id" assert error["description"] == "This plan has already got a tender" # check plan status get_response = app.get("/plans/{}".format(plan["data"]["id"])) assert get_response.json["data"]["status"] == "complete"
def test_plan_draft_status(app, mode): app.authorization = ("Basic", ("broker", "broker")) test_data = deepcopy(test_plan_data) if mode != "real": test_data["mode"] = "test" test_data["status"] = "draft" response = app.post_json("/plans", {"data": test_data}) assert response.status == "201 Created" assert response.json["data"].get("status") == "draft" response = app.get("/plans?mode={}".format(mode)) assert response.status == "200 OK" assert len(response.json["data"]) == 0 response = app.get("/plans?feed=changes&mode={}".format(mode)) assert response.status == "200 OK" assert len(response.json["data"]) == 0
def test_tender_creation_modified_date(app): app.authorization = ("Basic", ("broker", "broker")) request_plan_data = deepcopy(test_plan_data) plan = create_plan_for_tender(app, below_tender_data, request_plan_data) # get feed last links response = app.get("/plans") date_feed = response.json assert len(date_feed["data"]) == 1 assert date_feed["data"][0]["id"] == plan["data"]["id"] assert date_feed["data"][0]["dateModified"] == plan["data"]["dateModified"] response = app.get("/plans?feed=changes") change_feed = response.json assert len(change_feed["data"]) == 1 assert change_feed["data"][0]["id"] == plan["data"]["id"] assert change_feed["data"][0]["dateModified"] == plan["data"][ "dateModified"] # post tender response = app.post_json("/plans/{}/tenders".format(plan["data"]["id"]), {"data": below_tender_data}) assert response.status == "201 Created" # get updated plan response = app.get("/plans/{}".format(plan["data"]["id"])) updated_plan = response.json assert updated_plan["data"]["dateModified"] > plan["data"]["dateModified"] assert updated_plan["data"]["status"] == "complete" # check feeds are not empty response = app.get("/" + date_feed["next_page"]["path"].split("/")[-1]) new_date_feed = response.json assert len(new_date_feed["data"]) == 1 assert new_date_feed["data"][0]["id"] == plan["data"]["id"] response = app.get("/plans?feed=changes&offset={}".format( change_feed["next_page"]["offset"])) new_change_feed = response.json assert len(new_change_feed["data"]) == 1 assert new_change_feed["data"][0]["id"] == plan["data"]["id"]
def test_plan_default_status(app): app.authorization = ("Basic", ("broker", "broker")) test_data = deepcopy(test_plan_data) test_data.pop("status", None) response = app.post_json("/plans", {"data": test_data}) assert response.json["data"].get("status") == "scheduled" test_data["status"] = None response = app.post_json("/plans", {"data": test_data}) assert response.json["data"].get("status") == "scheduled" response = app.get("/plans") assert response.status == "200 OK" assert len(response.json["data"]) == 2
def test_post_milestone(app, centralized_plan): plan, access_token = centralized_plan app.authorization = ("Basic", ("broker", "broker")) response = app.post_json( "/plans/{}/milestones".format(plan["id"]), {"data": test_milestone_data(app)} ) assert response.status_code == 201 milestone = response.json["data"] assert set(milestone.keys()) == {"status", "description", "title", "author", "id", "owner", "type", "dateModified", "dueDate", "documents"} assert milestone["description"] == MILESTONE_APPROVAL_DESCRIPTION assert milestone["status"] == Milestone.STATUS_SCHEDULED date_modified = parse_date(milestone["dateModified"]) assert get_now() - date_modified < timedelta(seconds=1) assert "documents" in milestone assert "access" in response.json assert "token" in response.json["access"] response = app.get("/plans/{}".format(plan["id"])) assert response.json["data"]["dateModified"] == milestone["dateModified"]
def test_validations_before_and_after_tender(app): app.authorization = ("Basic", ("broker", "broker")) request_tender_data = deepcopy(below_tender_data) request_plan_data = deepcopy(test_plan_data) plan = create_plan_for_tender(app, request_tender_data, request_plan_data) # changing procuringEntity pe_change = { "identifier": { "scheme": "UA-EDR", "id": "111983", "legalName": "ДП Державне Управління Справами" }, "name": "ДУС", } response = app.patch_json( "/plans/{}?acc_token={}".format(plan["data"]["id"], plan["access"]["token"]), {"data": { "procuringEntity": pe_change }}, ) assert response.status == "200 OK" # adding tender request_tender_data["procuringEntity"]["identifier"]["id"] = pe_change[ "identifier"]["id"] request_tender_data["procuringEntity"]["identifier"]["scheme"] = pe_change[ "identifier"]["scheme"] response = app.post_json("/plans/{}/tenders".format(plan["data"]["id"]), {"data": request_tender_data}) assert response.status == "201 Created" # removing status (if the tender was created before the plan statuses release) plan_from_db = app.app.registry.databases.plans.get(plan["data"]["id"]) del plan_from_db["status"] app.app.registry.databases.plans.save(plan_from_db) response = app.get("/plans/{}".format(plan["data"]["id"])) assert response.json["data"]["status"] == "complete" # try to change procuringEntity response = app.patch_json( "/plans/{}?acc_token={}".format(plan["data"]["id"], plan["access"]["token"]), { "data": { "procuringEntity": { "identifier": { "scheme": "UA-EDR", "id": "111983", "legalName": "ДП Державне Управління Справами", }, "name": "ДУС", } } }, status=422, ) assert response.json == { "status": "error", "errors": [{ "description": "Changing this field is not allowed after tender creation", "location": "body", "name": "procuringEntity", }], } # try to change budgetBreakdown response = app.patch_json( "/plans/{}?acc_token={}".format(plan["data"]["id"], plan["access"]["token"]), { "data": { "budget": { "breakdown": [{ "description": "Changed description" }] } } }, status=422, ) assert response.json == { "status": "error", "errors": [{ "description": "Changing this field is not allowed after tender creation", "location": "body", "name": "budget.breakdown", }], } # try to change anything except procuringEntity and budgetBreakdown response = app.patch_json( "/plans/{}?acc_token={}".format(plan["data"]["id"], plan["access"]["token"]), { "data": { "procurementMethodType": "whatever", "items": [{ "classification": { "scheme": "ДК021", "description": "Antiperspirants", "id": "33711120-4" } }], "classification": { "scheme": "ДК021", "description": "Antiperspirants", "id": "33711120-4" }, } }, ) assert response.status == "200 OK" # try again response = app.patch_json( "/plans/{}?acc_token={}".format(plan["data"]["id"], plan["access"]["token"]), {"data": { "procurementMethodType": "another" }}, status=422, ) assert response.json == { "status": "error", "errors": [{ "location": "body", "name": "status", "description": "Can't update plan in 'complete' status" }], }