-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add goods on licences endpoint #2307
Changes from all commits
fb4ef21
47924e0
2170459
cb1c1e2
807d0a0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,6 +25,10 @@ | |
PartyOnApplicationFactory, | ||
StandardApplicationFactory, | ||
) | ||
from api.cases.enums import ( | ||
AdviceType, | ||
) | ||
from api.cases.tests.factories import FinalAdviceFactory | ||
from api.cases.enums import CaseTypeEnum | ||
from api.cases.models import CaseType | ||
from api.core.constants import ( | ||
|
@@ -33,6 +37,7 @@ | |
Roles, | ||
) | ||
from api.goods.tests.factories import GoodFactory | ||
from api.flags.enums import SystemFlags | ||
from api.documents.libraries.s3_operations import init_s3_client | ||
from api.letter_templates.models import LetterTemplate | ||
from api.parties.tests.factories import PartyDocumentFactory | ||
|
@@ -364,3 +369,63 @@ def check_rows(client, parse_table, unpage_data, table_name, rows): | |
expected_data.append({key: value for key, value in zip(keys, row)}) | ||
expected_data = cast_to_types(expected_data, table_metadata["fields"]) | ||
assert actual_data == expected_data | ||
|
||
|
||
@pytest.fixture() | ||
def parse_attributes(parse_table): | ||
def _parse_attributes(attributes): | ||
kwargs = {} | ||
table_data = parse_table(attributes) | ||
for key, value in table_data[1:]: | ||
kwargs[key] = value | ||
return kwargs | ||
|
||
return _parse_attributes | ||
|
||
|
||
@pytest.fixture() | ||
def issue_licence(api_client, lu_case_officer, gov_headers, siel_template): | ||
def _issue_licence(application): | ||
data = {"action": AdviceType.APPROVE, "duration": 24} | ||
for good_on_app in application.goods.all(): | ||
good_on_app.quantity = 100 | ||
good_on_app.value = 10000 | ||
good_on_app.save() | ||
data[f"quantity-{good_on_app.id}"] = str(good_on_app.quantity) | ||
data[f"value-{good_on_app.id}"] = str(good_on_app.value) | ||
# create final advice for controlled goods; skip NLR goods | ||
if good_on_app.is_good_controlled == False: | ||
continue | ||
Comment on lines
+396
to
+398
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is a new thing I added, otherwise it's the same fixture just moved to |
||
FinalAdviceFactory(user=lu_case_officer, case=application, good=good_on_app.good) | ||
|
||
issue_date = datetime.datetime.now() | ||
data.update({"year": issue_date.year, "month": issue_date.month, "day": issue_date.day}) | ||
|
||
application.flags.remove(SystemFlags.ENFORCEMENT_CHECK_REQUIRED) | ||
|
||
url = reverse("applications:finalise", kwargs={"pk": application.pk}) | ||
response = api_client.put(url, data=data, **gov_headers) | ||
assert response.status_code == 200, response.content | ||
response = response.json() | ||
|
||
data = { | ||
"template": str(siel_template.id), | ||
"text": "", | ||
"visible_to_exporter": False, | ||
"advice_type": AdviceType.APPROVE, | ||
} | ||
url = reverse( | ||
"cases:generated_documents:generated_documents", | ||
kwargs={"pk": str(application.pk)}, | ||
) | ||
response = api_client.post(url, data=data, **gov_headers) | ||
assert response.status_code == 201, response.content | ||
|
||
url = reverse( | ||
"cases:finalise", | ||
kwargs={"pk": str(application.pk)}, | ||
) | ||
response = api_client.put(url, data={}, **gov_headers) | ||
assert response.status_code == 201 | ||
|
||
return _issue_licence |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
@db | ||
Feature: Goods On Licences | ||
|
||
Scenario: Issue a licence | ||
Given a standard application with the following goods: | ||
| id | name | | ||
| 61d193bd-a4d8-4f7d-8c07-1ac5e03ea2c7 | A controlled good | | ||
And a draft licence with attributes: | ||
| name | value | | ||
| id | 962b4948-b87a-42fe-9c2b-61bdefd9cd21 | | ||
When the licence is issued | ||
Then the `goods_on_licences` table has the following rows: | ||
| good_id | licence_id | | ||
| 61d193bd-a4d8-4f7d-8c07-1ac5e03ea2c7 | 962b4948-b87a-42fe-9c2b-61bdefd9cd21 | | ||
|
||
Scenario: NLR goods not on licence | ||
Given a standard application with the following goods: | ||
| id | name | | ||
| aa9736f9-48f5-4d44-ace9-e4b8738591a5 | Another controlled good | | ||
| 56f562f6-b554-4bb3-923b-8695ab15afca | An NLR good | | ||
And the goods are assessed by TAU as: | ||
| id | Control list entry | Report summary prefix | Report summary subject | | ||
| aa9736f9-48f5-4d44-ace9-e4b8738591a5 | ML5b | accessories for | network analysers | | ||
| 56f562f6-b554-4bb3-923b-8695ab15afca | NLR | | | | ||
And a draft licence with attributes: | ||
| name | value | | ||
| id | 847a9a03-c35f-4036-ab8c-8b58d13482ab | | ||
When the licence is issued | ||
Then the `goods_on_licences` table has the following rows: | ||
| good_id | licence_id | | ||
| aa9736f9-48f5-4d44-ace9-e4b8738591a5 | 847a9a03-c35f-4036-ab8c-8b58d13482ab | | ||
|
||
Scenario: Draft licences | ||
Given a standard application with the following goods: | ||
| id | name | | ||
| f7c674b1-cd5e-4a6d-a1f5-d6ab58149d05 | A controlled good 2 | | ||
And a draft licence with attributes: | ||
| name | value | | ||
| id | 297e89b9-fc93-4f38-be46-c2ab38914007 | | ||
Then the `goods_on_licences` table is empty | ||
|
||
Scenario: Draft applications | ||
Given a draft standard application with the following goods: | ||
| id | name | | ||
| 8262dcf7-d932-4a33-978d-b5aa8a7878ee | A controlled good 3 | | ||
And a draft licence with attributes: | ||
| name | value | | ||
| id | 2078827b-6d67-406c-becc-41c423720cfc | | ||
Then the `goods_on_licences` table is empty |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,16 +4,13 @@ | |
|
||
from freezegun import freeze_time | ||
|
||
from moto import mock_aws | ||
|
||
from pytest_bdd import ( | ||
given, | ||
parsers, | ||
scenarios, | ||
when, | ||
) | ||
|
||
from django.conf import settings | ||
from django.urls import reverse | ||
|
||
from api.applications.enums import ApplicationExportType | ||
|
@@ -28,7 +25,6 @@ | |
AdviceType, | ||
) | ||
from api.cases.tests.factories import FinalAdviceFactory | ||
from api.documents.libraries.s3_operations import init_s3_client | ||
from api.flags.enums import SystemFlags | ||
from api.licences.enums import LicenceStatus | ||
from api.parties.tests.factories import ( | ||
|
@@ -41,18 +37,6 @@ | |
scenarios("./scenarios/applications.feature") | ||
|
||
|
||
@pytest.fixture() | ||
def parse_attributes(parse_table): | ||
def _parse_attributes(attributes): | ||
kwargs = {} | ||
table_data = parse_table(attributes) | ||
for key, value in table_data[1:]: | ||
kwargs[key] = value | ||
return kwargs | ||
|
||
return _parse_attributes | ||
|
||
|
||
def run_processing_time_task(start, up_to): | ||
processing_time_task_run_date_time = start.replace(hour=22, minute=30) | ||
up_to = pytz.utc.localize(datetime.datetime.fromisoformat(up_to)) | ||
|
@@ -62,19 +46,6 @@ def run_processing_time_task(start, up_to): | |
processing_time_task_run_date_time = processing_time_task_run_date_time + datetime.timedelta(days=1) | ||
|
||
|
||
@pytest.fixture(autouse=True) | ||
def mock_s3(): | ||
with mock_aws(): | ||
s3 = init_s3_client() | ||
s3.create_bucket( | ||
Bucket=settings.AWS_STORAGE_BUCKET_NAME, | ||
CreateBucketConfiguration={ | ||
"LocationConstraint": settings.AWS_REGION, | ||
}, | ||
) | ||
yield | ||
|
||
|
||
Comment on lines
-65
to
-77
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this was already moved into |
||
@pytest.fixture | ||
def submit_application(api_client, exporter_headers, mocker): | ||
def _submit_application(draft_application): | ||
|
@@ -103,51 +74,6 @@ def _submit_application(draft_application): | |
return _submit_application | ||
|
||
|
||
@pytest.fixture() | ||
def issue_licence(api_client, lu_case_officer, gov_headers, siel_template): | ||
def _issue_licence(application): | ||
data = {"action": AdviceType.APPROVE, "duration": 24} | ||
for good_on_app in application.goods.all(): | ||
good_on_app.quantity = 100 | ||
good_on_app.value = 10000 | ||
good_on_app.save() | ||
data[f"quantity-{good_on_app.id}"] = str(good_on_app.quantity) | ||
data[f"value-{good_on_app.id}"] = str(good_on_app.value) | ||
FinalAdviceFactory(user=lu_case_officer, case=application, good=good_on_app.good) | ||
|
||
issue_date = datetime.datetime.now() | ||
data.update({"year": issue_date.year, "month": issue_date.month, "day": issue_date.day}) | ||
|
||
application.flags.remove(SystemFlags.ENFORCEMENT_CHECK_REQUIRED) | ||
|
||
url = reverse("applications:finalise", kwargs={"pk": application.pk}) | ||
response = api_client.put(url, data=data, **gov_headers) | ||
assert response.status_code == 200, response.content | ||
response = response.json() | ||
|
||
data = { | ||
"template": str(siel_template.id), | ||
"text": "", | ||
"visible_to_exporter": False, | ||
"advice_type": AdviceType.APPROVE, | ||
} | ||
url = reverse( | ||
"cases:generated_documents:generated_documents", | ||
kwargs={"pk": str(application.pk)}, | ||
) | ||
response = api_client.post(url, data=data, **gov_headers) | ||
assert response.status_code == 201, response.content | ||
|
||
url = reverse( | ||
"cases:finalise", | ||
kwargs={"pk": str(application.pk)}, | ||
) | ||
response = api_client.put(url, data={}, **gov_headers) | ||
assert response.status_code == 201 | ||
|
||
return _issue_licence | ||
|
||
|
||
@pytest.fixture() | ||
def caseworker_change_status(api_client, lu_case_officer, lu_case_officer_headers): | ||
def _caseworker_change_status(application, status): | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
from django.urls import reverse | ||
from pytest_bdd import given, parsers, scenarios, when | ||
|
||
from api.applications.tests.factories import GoodOnApplicationFactory | ||
from api.licences.tests.factories import StandardLicenceFactory | ||
from api.licences.enums import LicenceStatus | ||
from api.staticdata.report_summaries.models import ( | ||
ReportSummaryPrefix, | ||
ReportSummarySubject, | ||
) | ||
|
||
scenarios("./scenarios/goods_on_licences.feature") | ||
|
||
|
||
@given(parsers.parse("a standard application with the following goods:{goods}"), target_fixture="standard_application") | ||
def standard_application_with_following_goods(parse_table, goods, standard_application): | ||
standard_application.goods.all().delete() | ||
good_attributes = parse_table(goods)[1:] | ||
for id, name in good_attributes: | ||
GoodOnApplicationFactory( | ||
application=standard_application, | ||
id=id, | ||
good__name=name, | ||
) | ||
return standard_application | ||
|
||
|
||
@given(parsers.parse("a draft licence with attributes:{attributes}"), target_fixture="draft_licence") | ||
def draft_licence_with_attributes(parse_attributes, attributes, standard_application): | ||
draft_licence = StandardLicenceFactory( | ||
case=standard_application, status=LicenceStatus.DRAFT, **parse_attributes(attributes) | ||
) | ||
return draft_licence | ||
|
||
|
||
@when("the licence is issued") | ||
def licence_is_issued(standard_application, issue_licence): | ||
issue_licence(standard_application) | ||
standard_application.refresh_from_db() | ||
return standard_application | ||
|
||
|
||
@given(parsers.parse("the goods are assessed by TAU as:{assessments}")) | ||
def the_goods_are_assessed_by_tau_as( | ||
Comment on lines
+43
to
+44
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is there in |
||
parse_table, | ||
standard_application, | ||
assessments, | ||
api_client, | ||
lu_case_officer, | ||
gov_headers, | ||
): | ||
assessments = parse_table(assessments)[1:] | ||
url = reverse("assessments:make_assessments", kwargs={"case_pk": standard_application.pk}) | ||
|
||
assessment_payload = [] | ||
for good_on_application_id, control_list_entry, report_summary_prefix, report_summary_subject in assessments: | ||
data = { | ||
"id": good_on_application_id, | ||
"comment": "Some comment", | ||
} | ||
|
||
if control_list_entry == "NLR": | ||
data.update( | ||
{ | ||
"control_list_entries": [], | ||
"is_good_controlled": False, | ||
} | ||
) | ||
else: | ||
if report_summary_prefix: | ||
prefix = ReportSummaryPrefix.objects.get(name=report_summary_prefix) | ||
else: | ||
prefix = None | ||
subject = ReportSummarySubject.objects.get(name=report_summary_subject) | ||
data.update( | ||
{ | ||
"control_list_entries": [control_list_entry], | ||
"report_summary_prefix": prefix.pk if prefix else None, | ||
"report_summary_subject": subject.pk, | ||
"is_good_controlled": True, | ||
"regime_entries": [], | ||
} | ||
) | ||
assessment_payload.append(data) | ||
|
||
response = api_client.put( | ||
url, | ||
assessment_payload, | ||
**gov_headers, | ||
) | ||
assert response.status_code == 200, response.content | ||
|
||
|
||
@given( | ||
parsers.parse("a draft standard application with the following goods:{goods}"), target_fixture="draft_application" | ||
) | ||
def draft_standard_application_with_following_goods(parse_table, goods, draft_application): | ||
draft_application.goods.all().delete() | ||
good_attributes = parse_table(goods)[1:] | ||
for id, name in good_attributes: | ||
GoodOnApplicationFactory( | ||
application=draft_application, | ||
id=id, | ||
good__name=name, | ||
) | ||
return draft_application |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
False
is a singleton data type, so should be compared usingis
. More info.