Skip to content

Commit 7cbae62

Browse files
Merge branch 'main' into SUP-1488-reassign-submitted-assessment
2 parents 4ec37fe + 88e199e commit 7cbae62

147 files changed

Lines changed: 12702 additions & 2768 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
"""A third-party campaign builds its questionnaires by hand rather than through
2+
EntityAssessmentWriteSerializer, so the access that serializer grants has to be
3+
granted on this path too — otherwise the representatives are emailed a link to a
4+
questionnaire they cannot open."""
5+
6+
import pytest
7+
from rest_framework.test import APIClient
8+
9+
from core.models import Campaign, Framework, RequirementAssignment, RequirementNode
10+
from iam.models import Folder, User, UserGroup
11+
from tprm.models import Entity, EntityAssessment, Representative
12+
13+
14+
@pytest.fixture
15+
def setup(db):
16+
domain = Folder.objects.create(
17+
parent_folder=Folder.get_root_folder(),
18+
name="Campaign Domain",
19+
content_type=Folder.ContentType.DOMAIN,
20+
)
21+
entity = Entity.objects.create(name="Vendor Co", folder=domain)
22+
respondent = User.objects.create_user("campaign-rep@tests.com", is_third_party=True)
23+
Representative.objects.create(
24+
entity=entity, email=respondent.email, user=respondent
25+
)
26+
27+
admin = APIClient()
28+
admin.force_authenticate(User.objects.create_superuser("campaign-admin@tests.com"))
29+
respondent_client = APIClient()
30+
respondent_client.force_authenticate(respondent)
31+
32+
framework = Framework.objects.create(name="F", min_score=0, max_score=100)
33+
# An assignment covers the audit's requirement assessments, so the framework needs
34+
# at least one assessable node for the questionnaire to have anything to hold.
35+
RequirementNode.objects.create(
36+
framework=framework,
37+
folder=Folder.get_root_folder(),
38+
urn="urn:test:campaign:req:001",
39+
ref_id="REQ-001",
40+
assessable=True,
41+
)
42+
43+
return {
44+
"domain": domain,
45+
"entity": entity,
46+
"respondent": respondent,
47+
"admin": admin,
48+
"respondent_client": respondent_client,
49+
"framework": framework,
50+
}
51+
52+
53+
def launch(setup):
54+
response = setup["admin"].post(
55+
"/api/campaigns/",
56+
{
57+
"name": "Vendor round",
58+
"folder": str(setup["domain"].id),
59+
"kind": "third_party",
60+
"frameworks": [str(setup["framework"].id)],
61+
"entities": [str(setup["entity"].id)],
62+
},
63+
format="json",
64+
)
65+
assert response.status_code == 201, response.data
66+
return Campaign.objects.get(id=response.json()["id"])
67+
68+
69+
def test_launch_lets_the_representatives_into_the_workspace(setup):
70+
launch(setup)
71+
assessment = EntityAssessment.objects.get(entity=setup["entity"])
72+
enclave = assessment.compliance_assessment.folder
73+
74+
assert assessment.representatives.count() == 1
75+
assert UserGroup.objects.filter(folder=enclave).exists()
76+
assert setup["respondent"].user_groups.filter(folder=enclave).exists()
77+
78+
79+
def test_the_questionnaire_opens_for_the_representative_it_was_sent_to(setup):
80+
campaign = launch(setup)
81+
started = setup["admin"].post(f"/api/campaigns/{campaign.id}/start/", {}, "json")
82+
assert started.status_code == 200, started.data
83+
84+
assessment = EntityAssessment.objects.get(entity=setup["entity"])
85+
audit = assessment.compliance_assessment
86+
assignment = RequirementAssignment.objects.filter(
87+
compliance_assessment=audit
88+
).first()
89+
assert assignment is not None, "starting the campaign must wire an assignment"
90+
91+
client = setup["respondent_client"]
92+
assert client.get(f"/api/compliance-assessments/{audit.id}/").status_code == 200
93+
assert (
94+
client.get(f"/api/requirement-assignments/{assignment.id}/").status_code == 200
95+
)

0 commit comments

Comments
 (0)