Exemple #1
0
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"}],
    }
Exemple #3
0
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"
Exemple #6
0
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"]
Exemple #8
0
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"
        }],
    }