Skip to content

Commit

Permalink
Write test for DatasetWizardView with skippable steps
Browse files Browse the repository at this point in the history
  • Loading branch information
moustaphacheikh committed Aug 4, 2023
1 parent 63223bd commit e3fa912
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 17 deletions.
7 changes: 3 additions & 4 deletions core/forms/__init__.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
from .cohort import CohortForm, CohortFormEdit
from .contact import ContactForm, PickContactForm
from .contract import ContractForm, ContractFormEdit, PartnerRoleForm
from .dataset import DatasetForm, SkipFieldValidationMixin
from .use_restriction import UseRestrictionForm
from .data_declaration import DataDeclarationForm, DataDeclarationSubFormOther, DataDeclarationSubFormNew, \
DataDeclarationEditForm, DataDeclarationSubFormFromExisting
from .dataset import DatasetForm
from .document import DocumentForm
from .partner import PartnerForm
from .permission import UserPermFormSet
from .legal_basis import LegalBasisForm
from .publication import PublicationForm, PickPublicationForm
from .share import ShareForm
from .use_restriction import UseRestrictionForm
from .access import AccessForm



__all__ = [
"ContractForm",
"ContractFormEdit",
Expand All @@ -38,4 +36,5 @@
"PickPublicationForm",
"UseRestrictionForm",
"AccessForm",
"SkipFieldValidationMixin",
]
2 changes: 1 addition & 1 deletion core/forms/access.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.forms import ModelForm, DateInput, Textarea

from core.forms.dataset import SkipFieldValidationMixin
from core.forms import SkipFieldValidationMixin
from core.models import Access


Expand Down
4 changes: 2 additions & 2 deletions core/forms/data_declaration.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy

from core.forms.dataset import SkipFieldValidationMixin
from core.forms.use_restriction import UseRestrictionForm
from core.forms import SkipFieldValidationMixin
from core.forms import UseRestrictionForm
from core.models import DataDeclaration, Partner, Contract, GDPRRole
from core.models.contract import PartnerRole

Expand Down
1 change: 0 additions & 1 deletion core/forms/dataset.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django import forms
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import get_object_or_404
from django.forms import ValidationError
from core.models import Dataset, User, Project
Expand Down
2 changes: 1 addition & 1 deletion core/forms/legal_basis.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.forms import ModelForm

from core.forms.dataset import SkipFieldValidationMixin
from core.forms import SkipFieldValidationMixin
from core.models import LegalBasis


Expand Down
4 changes: 2 additions & 2 deletions core/forms/storage_location.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django import forms

from core.forms.dataset import SkipFieldValidationMixin
from core.models.storage_location import DataLocation
from core.forms import SkipFieldValidationMixin
from core.models import DataLocation


class StorageLocationForm(SkipFieldValidationMixin, forms.ModelForm):
Expand Down
94 changes: 94 additions & 0 deletions web/tests/test_dataset.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import random
import pytest
from core.models import Dataset, DataDeclaration, DataLocation, LegalBasisType, LegalBasis, Access
from test.factories import UserFactory, VIPGroup, StorageResourceFactory, LegalBasisFactory
from django.urls import reverse


Expand All @@ -9,3 +13,93 @@ def test_get_dataset_add(client_user_normal):
# url = reverse('dataset_wizard')
# response = client_user_normal.get(url, )
# assert response.status_code == 302, "should redirect to first wizard step"


@pytest.mark.django_db
def test_dataset_wizard_form(client_user_normal):
vip_user = UserFactory.create(groups=[VIPGroup()], first_name='Rebecca', last_name='Kafe')
storage_backend = StorageResourceFactory.create(name='test_backend', managed_by='test')
legal_basis_type = LegalBasisType(name='test_legal_basis', code='test')
legal_basis_type.save()

skip_wizard = {
'data_declaration': random.choice([True, False]),
'storage_location': random.choice([True, False]),
'access': random.choice([True, False]),
'legal_basis': random.choice([True, False]),
}
wizard_test_data = {
'dataset': [
{
'dataset-local_custodians': [vip_user.id],
'dataset-title': ['Hello Dataset'],
'dataset-project': [],
'dataset-comments': ['A comment'],
'dataset_wizard_view-current_step': ['dataset']
},
Dataset,
],
'data_declaration': [
{
'data_declaration-title': ['Data declaration title'],
'data_declaration-type': ['2'],
'comment': ['Other provenance'],
'dataset_wizard_view-current_step': ['data_declaration'],
'data_declaration-skip_wizard': [skip_wizard['data_declaration']],
},
DataDeclaration,
],
'storage_location': [
{
'storage_location-category': ['master'],
'storage_location-backend': [storage_backend.id],
'storage_location-data_declarations': [] if skip_wizard['data_declaration'] else ['1'],
'storage_location-datatypes': [],
'storage_location-location_description': ['hello'],
'dataset_wizard_view-current_step': ['storage_location'],
'storage_location-skip_wizard': [skip_wizard['storage_location']],
},
DataLocation,
],
'legal_basis': [
{
'legal_basis-data_declarations': [] if skip_wizard['data_declaration'] else ['1'],
'legal_basis-legal_basis_types': [legal_basis_type.id],
'legal_basis-personal_data_types': [],
'legal_basis-remarks': ['Legal basis comment'],
'dataset_wizard_view-current_step': ['legal_basis'],
'legal_basis-skip_wizard': [skip_wizard['legal_basis']]
},
LegalBasis,
],
'access': [
{
'access-contact': [],
'access-user': [vip_user.id],
'access-project': [''],
'access-granted_on': [''],
'access-grant_expires_on': [''],
'access-access_notes': ['ssq'],
'dataset_wizard_view-current_step': ['access'],
'access-skip_wizard': [skip_wizard['access']]
},
Access,
],
}

for step_name, step_data in wizard_test_data.items():
form_data, Model = step_data
response = client_user_normal.post(reverse('wizard'), form_data)

if step_name != 'dataset':
skip_wizard_value = form_data[f'{step_name}-skip_wizard'][0]
if skip_wizard_value:
assert Model.objects.all().count() == 0
else:
assert Model.objects.all().count() == 1

if step_name == 'access':
dataset = Dataset.objects.get(title='Hello Dataset')
redirect_url = response.url
expected_url = reverse('dataset', kwargs={'pk': dataset.id})
assert redirect_url == expected_url
9 changes: 3 additions & 6 deletions web/views/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ class DatasetWizardView(NamedUrlSessionWizardView):
]

def render_done(self, form, **kwargs):
if kwargs.get('step', None) != self.done_step_name:
return redirect(self.get_step_url(self.done_step_name))

dataset_id = self.storage.extra_data.get('dataset_id')
self.storage.reset()
if dataset_id:
Expand Down Expand Up @@ -115,7 +112,8 @@ def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['is_admin'] = self.request.user.is_admin_of_dataset(self.object)
context['can_edit'] = self.request.user.can_edit_dataset(self.object)
context['can_see_protected'] = self.request.user.has_permission_on_object(f'core.{Permissions.PROTECTED.value}_dataset', self.object)
context['can_see_protected'] = self.request.user.has_permission_on_object(
f'core.{Permissions.PROTECTED.value}_dataset', self.object)
context['company_name'] = COMPANY
context['exposure_list'] = Exposure.objects.filter(dataset=self.object)
return context
Expand All @@ -128,7 +126,6 @@ class DatasetEditView(CheckerMixin, UpdateView):
permission_required = Permissions.EDIT
permission_target = 'dataset'


def get_initial(self):
initial = super().get_initial()
project_id = self.object.project.id if self.object.project else None
Expand Down Expand Up @@ -162,7 +159,7 @@ def dataset_list(request):
'facets': facet_view_utils.filter_empty_facets(datasets.facet_counts()),
'query': query or '',
'title': 'Datasets',
'help_text' : Dataset.AppMeta.help_text,
'help_text': Dataset.AppMeta.help_text,
'search_url': 'datasets',
'add_url': 'dataset_add',
'data': {'datasets': datasets},
Expand Down

0 comments on commit e3fa912

Please sign in to comment.