def test_secretariat_edit(self): # Secretariat user logs in # He goes to the details of a DRAFT questionnaire which he did not enter detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': 'sample_1'} detail_page.open(login=True, user=self.user_secretariat) assert detail_page.has_text('Foo 1') # He sees a button to edit the questionnaire, he clicks it detail_page.edit_questionnaire() # In edit mode, he sees that he can edit the first section edit_page = SampleEditPage(self) edit_page.click_edit_category('cat_1') # He saves the step and returns step_page = SampleStepPage(self) step_page.submit_step() # He also opens a public questionnaire which he did not enter detail_page.route_kwargs = {'identifier': 'sample_3'} detail_page.open() assert detail_page.has_text('Foo 3') # In the database, there is only 1 version assert Questionnaire.objects.filter(code='sample_3').count() == 1 # He sees a button to edit the questionnaire, he clicks it and creates a # new version detail_page.create_new_version() # In the database, there are now 2 versions assert Questionnaire.objects.filter(code='sample_3').count() == 2
def test_creation_date_does_not_change(self): # Alice logs in user = User.objects.get(pk=102) # She goes to the details of an existing questionnaire and takes # note of the creation and update dates detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': 'sample_3'} detail_page.open(login=True, user=user) creation_date = detail_page.get_el(detail_page.LOC_CREATION_DATE).text update_date = detail_page.get_el(detail_page.LOC_UPDATE_DATE).text # She creates a new version detail_page.create_new_version() # She notices that the creation date did not change while the # update date changed. creation_date_1 = detail_page.get_el(detail_page.LOC_CREATION_DATE).text update_date_1 = detail_page.get_el(detail_page.LOC_UPDATE_DATE).text assert creation_date == creation_date_1 assert update_date != update_date_1 # Alice logs in as a different user # She also opens a draft version of a questionnaire and takes # note of the creation and update dates user = User.objects.get(pk=101) detail_page.route_kwargs = {'identifier': 'sample_1'} detail_page.open(login=True, user=user) creation_date = detail_page.get_el(detail_page.LOC_CREATION_DATE).text update_date = detail_page.get_el(detail_page.LOC_UPDATE_DATE).text # She makes an edit detail_page.edit_questionnaire() edit_page = SampleEditPage(self) edit_page.click_edit_category('cat_1') step_page = SampleStepPage(self) step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_1, ' (changed)') # She submits the questionnaire step_page.submit_step() # She sees the changes were submitted assert edit_page.has_text(' (changed)') # She notices that the creation date did not change while the # update date changed. creation_date_1 = edit_page.get_el(edit_page.LOC_CREATION_DATE).text update_date_1 = edit_page.get_el(edit_page.LOC_UPDATE_DATE).text assert creation_date == creation_date_1 assert update_date != update_date_1
def test_enter_translation_in_review_process(self): # Alice logs in user_alice = create_new_user() user_alice.groups = [Group.objects.get(pk=3), Group.objects.get(pk=4)] self.doLogin(user=user_alice) # She goes to the form to enter a new Questionnaire self.browser.get(self.live_server_url + reverse(route_questionnaire_new)) # She enters a questionnaire in English self.click_edit_section('cat_1') self.findBy( 'name', 'qg_1-0-original_key_1').send_keys('Foo content in English') # She submits the step and sees the values were transmitted correctly. self.submit_form_step() self.findBy('xpath', '//*[text()[contains(.,"Foo content in English")]]') # She submits the questionnaire self.review_action('submit') self.findBy('xpath', '//*[text()[contains(.,"Foo content in English")]]') # She is also moderator and edits the questionnaire again self.findBy('xpath', '//a[text()="Edit" and @type="submit"]').click() # She changes the language to Spanish self.changeLanguage('es') # She edits the first section self.click_edit_section('cat_1') # She sees a warning that she is about to create a new translation step_page = SampleStepPage(self) assert step_page.has_translation_warning() step_page.translation_warning_click_continue() # She sees that the field already contains the original value text_field = self.findBy('name', 'qg_1-0-translation_key_1') self.assertEqual(text_field.get_attribute('value'), 'Foo content in English') # She changes the value to its Spanish translation text_field.clear() text_field.send_keys('Foo content in Spanish') # She submits the step and sees the values were transmitted correctly. step_page.submit_step(confirm_add_translation=True) self.findBy('xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') # She sees that both languages are available in the tech info metadata translations = self.findManyBy( 'xpath', '//ul[contains(@class, "tech-lang-list")]/li') self.assertEqual(len(translations), 2)
def test_enter_translation_in_review_process(self): # Alice logs in user_alice = create_new_user() user_alice.groups = [Group.objects.get(pk=3), Group.objects.get(pk=4)] self.doLogin(user=user_alice) # She goes to the form to enter a new Questionnaire self.browser.get(self.live_server_url + reverse( route_questionnaire_new)) # She enters a questionnaire in English self.click_edit_section('cat_1') self.findBy('name', 'qg_1-0-original_key_1').send_keys( 'Foo content in English') # She submits the step and sees the values were transmitted correctly. self.submit_form_step() self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in English")]]') # She submits the questionnaire self.review_action('submit') self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in English")]]') # She is also moderator and edits the questionnaire again self.findBy('xpath', '//a[text()="Edit" and @type="submit"]').click() # She changes the language to Spanish self.changeLanguage('es') # She edits the first section self.click_edit_section('cat_1') # She sees a warning that she is about to create a new translation step_page = SampleStepPage(self) assert step_page.has_translation_warning() step_page.translation_warning_click_continue() # She sees that the field already contains the original value text_field = self.findBy('name', 'qg_1-0-translation_key_1') self.assertEqual( text_field.get_attribute('value'), 'Foo content in English') # She changes the value to its Spanish translation text_field.clear() text_field.send_keys('Foo content in Spanish') # She submits the step and sees the values were transmitted correctly. step_page.submit_step(confirm_add_translation=True) self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') # She sees that both languages are available in the tech info metadata translations = self.findManyBy( 'xpath', '//ul[contains(@class, "tech-lang-list")]/li') self.assertEqual(len(translations), 2)
def test_creation_date_does_not_change(self): # Alice logs in user = User.objects.get(pk=102) # She goes to the details of an existing questionnaire and takes # note of the creation and update dates detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': 'sample_3'} detail_page.open(login=True, user=user) creation_date = detail_page.get_el(detail_page.LOC_CREATION_DATE).text update_date = detail_page.get_el(detail_page.LOC_UPDATE_DATE).text # She creates a new version detail_page.create_new_version() # She notices that the creation date did not change while the # update date changed. creation_date_1 = detail_page.get_el( detail_page.LOC_CREATION_DATE).text update_date_1 = detail_page.get_el(detail_page.LOC_UPDATE_DATE).text assert creation_date == creation_date_1 assert update_date != update_date_1 # Alice logs in as a different user # She also opens a draft version of a questionnaire and takes # note of the creation and update dates user = User.objects.get(pk=101) detail_page.route_kwargs = {'identifier': 'sample_1'} detail_page.open(login=True, user=user) creation_date = detail_page.get_el(detail_page.LOC_CREATION_DATE).text update_date = detail_page.get_el(detail_page.LOC_UPDATE_DATE).text # She makes an edit detail_page.edit_questionnaire() edit_page = SampleEditPage(self) edit_page.click_edit_category('cat_1') step_page = SampleStepPage(self) step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_1, ' (changed)') # She submits the questionnaire step_page.submit_step() # She sees the changes were submitted assert edit_page.has_text(' (changed)') # She notices that the creation date did not change while the # update date changed. creation_date_1 = edit_page.get_el(edit_page.LOC_CREATION_DATE).text update_date_1 = edit_page.get_el(edit_page.LOC_UPDATE_DATE).text assert creation_date == creation_date_1 assert update_date != update_date_1
def test_add_user(self, mock_search_users, mock_user_information): mock_search_users.side_effect = self.get_mock_remote_user_client_search mock_user_information.side_effect = self.get_mock_remote_user_client_user_information # User logs in and goes to the questionnaire step where he can add a # user. new_page = SampleNewPage(self) new_page.open(login=True, user=self.user_alice) new_page.click_edit_category('cat_0') # The field to search a user is not visible. step_page = SampleStepPage(self) search_field = step_page.get_user_search_field(index=1) assert not search_field.is_displayed() # She clicks the radio to search for an existing user step_page.get_el(step_page.LOC_RADIO_SEARCH_USER).click() # Now the search field is visible assert search_field.is_displayed() # There is no loading indicator loading_indicator = step_page.get_el(step_page.LOC_LOADING_SEARCH_USER) assert not loading_indicator.is_displayed() # She enters a name and sees a search is conducted search_field.send_keys(self.user_bob.firstname) step_page.select_autocomplete(self.user_bob.get_display_name()) # She sees a loading indicator while the user is updated in the DB assert loading_indicator.is_displayed() # She waits until the loading indicator disappears step_page.wait_for(step_page.LOC_LOADING_SEARCH_USER, visibility=False) # She sees that the search field is not visible anymore assert not search_field.is_displayed() # She sees that a field with the name was added assert step_page.has_selected_user(self.user_bob) # She sees that the user ID was added to the hidden field assert step_page.get_selected_user_id() == str(self.user_bob.pk) # She removes the user step_page.remove_selected_user(self.user_bob) # The user is removed and the search box is visible again assert not step_page.has_selected_user(self.user_bob) assert search_field.is_displayed() # She hidden field does not contain the ID anymore assert step_page.get_selected_user_id() == '' # She selects the user again step_page.select_user(self.user_bob) # She submits the step step_page.submit_step() # She sees the name is in the overview edit_page = SampleEditPage(self) assert edit_page.has_text(self.user_bob.get_display_name()) # She goes back to the form edit_page.click_edit_category('cat_0') # She sees the user is selected, loading and search fields are # not visible step_page.wait_for(step_page.LOC_LOADING_SEARCH_USER, visibility=False) assert step_page.has_selected_user(self.user_bob) assert step_page.get_selected_user_id() == str(self.user_bob.pk) # She removes the user and selects another one step_page.remove_selected_user(self.user_bob) step_page.select_user(self.user_chris) # She submits the step step_page.submit_step() assert edit_page.has_text(self.user_chris.get_display_name()) # She submits the entire questionnaire and sees the name is there edit_page.submit_questionnaire() assert edit_page.has_text(self.user_chris.get_display_name()) # She checks the database to make sure the user was added. questionnaire = Questionnaire.objects.first() questionnaire_users = sorted(questionnaire.get_users(), key=lambda u: (u[0], u[1].pk)) assert questionnaire_users == [('compiler', self.user_alice), ('landuser', self.user_chris)]
def test_show_only_one_linked_version(self): sample_title = 'This is the first key.' samplemulti_title = 'This is key 1a' samplemulti_changed_text = ' (changed)' samplemulti_title_changed = samplemulti_title + samplemulti_changed_text # Alice logs in # She goes to the SAMPLE questionnaire and sees the link user_1 = User.objects.get(pk=101) sample_detail_page = SampleDetailPage(self) sample_detail_page.route_kwargs = {'identifier': 'sample_1'} sample_detail_page.open(login=True, user=user_1) sample_detail_page.expand_details() expected_samplemulti_links = [ { 'title': samplemulti_title, 'configuration': 'samplemulti', } ] sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links) # She goes to the MULTISAMPLE questionnaire and sees the link sample_detail_page.click_linked_questionnaire(index=0) samplemulti_detail_page = SampleMultiDetailPage(self) samplemulti_detail_page.expand_details() expected_sample_links = [ { 'title': sample_title, 'configuration': 'sample', } ] samplemulti_detail_page.check_linked_questionnaires( expected=expected_sample_links) # She edits the MULTISAMPLE questionnaire and sees only one # version is linked (still the same) samplemulti_detail_page.create_new_version() samplemulti_edit_page = SampleMultiEditPage(self) samplemulti_edit_page.click_edit_category('mcat_1') samplemulti_step_page = SampleMultiStepPage(self) samplemulti_step_page.enter_text( samplemulti_step_page.LOC_QUESTION_MQG01_MKEY01, samplemulti_changed_text) # She submits the step samplemulti_step_page.submit_step() # She sees that only one questionnaire is linked samplemulti_edit_page.expand_details() samplemulti_edit_page.check_linked_questionnaires( expected=expected_sample_links) # She goes to the SAMPLE questionnaire and sees only one version # is linked (the pending one) samplemulti_edit_page.click_linked_questionnaire(index=0) expected_samplemulti_links_changed = [ { 'title': samplemulti_title_changed, 'configuration': 'samplemulti', } ] sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links_changed) # She even creates a new version and opens the form and sees there is # only one version sample_detail_page.create_new_version() sample_edit_page = SampleEditPage(self) sample_edit_page.click_edit_category('cat_5') sample_step_page = SampleStepPage(self) sample_step_page.check_links([samplemulti_title_changed]) sample_step_page.back_without_saving() # She logs out and sees only one questionnaire is linked (the # active one) sample_detail_page.logout() sample_detail_page.open() sample_detail_page.expand_details() sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links) # She logs in as a different user and sees only one version is # linked (the active one) user_2 = User.objects.get(pk=102) sample_detail_page.open(login=True, user=user_2) sample_detail_page.expand_details() sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links)
def test_show_only_one_linked_version(self): sample_title = 'This is the first key.' samplemulti_title = 'This is key 1a' samplemulti_changed_text = ' (changed)' samplemulti_title_changed = samplemulti_title + samplemulti_changed_text # Alice logs in # She goes to the SAMPLE questionnaire and sees the link user_1 = User.objects.get(pk=101) sample_detail_page = SampleDetailPage(self) sample_detail_page.route_kwargs = {'identifier': 'sample_1'} sample_detail_page.open(login=True, user=user_1) sample_detail_page.expand_details() expected_samplemulti_links = [{ 'title': samplemulti_title, 'configuration': 'samplemulti', }] sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links) # She goes to the MULTISAMPLE questionnaire and sees the link sample_detail_page.click_linked_questionnaire(index=0) samplemulti_detail_page = SampleMultiDetailPage(self) samplemulti_detail_page.expand_details() expected_sample_links = [{ 'title': sample_title, 'configuration': 'sample', }] samplemulti_detail_page.check_linked_questionnaires( expected=expected_sample_links) # She edits the MULTISAMPLE questionnaire and sees only one # version is linked (still the same) samplemulti_detail_page.create_new_version() samplemulti_edit_page = SampleMultiEditPage(self) samplemulti_edit_page.click_edit_category('mcat_1') samplemulti_step_page = SampleMultiStepPage(self) samplemulti_step_page.enter_text( samplemulti_step_page.LOC_QUESTION_MQG01_MKEY01, samplemulti_changed_text) # She submits the step samplemulti_step_page.submit_step() # She sees that only one questionnaire is linked samplemulti_edit_page.expand_details() samplemulti_edit_page.check_linked_questionnaires( expected=expected_sample_links) # She goes to the SAMPLE questionnaire and sees only one version # is linked (the pending one) samplemulti_edit_page.click_linked_questionnaire(index=0) expected_samplemulti_links_changed = [{ 'title': samplemulti_title_changed, 'configuration': 'samplemulti', }] sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links_changed) # She even creates a new version and opens the form and sees there is # only one version sample_detail_page.create_new_version() sample_edit_page = SampleEditPage(self) sample_edit_page.click_edit_category('cat_5') sample_step_page = SampleStepPage(self) sample_step_page.check_links([samplemulti_title_changed]) sample_step_page.back_without_saving() # She logs out and sees only one questionnaire is linked (the # active one) sample_detail_page.logout() sample_detail_page.open() sample_detail_page.expand_details() sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links) # She logs in as a different user and sees only one version is # linked (the active one) user_2 = User.objects.get(pk=102) sample_detail_page.open(login=True, user=user_2) sample_detail_page.expand_details() sample_detail_page.check_linked_questionnaires( expected=expected_samplemulti_links)
def test_edit_public_new_config_edition(self, mock_choices): mock_choices.return_value = CODE_CHOICES + [ ('sample', 'sample'), ] code = 'sample_3' old_version = Questionnaire.objects.get(code=code) # A user logs in and goes to the detail page of a public questionnaire # where he is the compiler detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': code} detail_page.open(login=True, user=self.user) # The user sees a hint about a new edition on the detail page detail_page.close_edition_modal() assert detail_page.has_new_edition() # The user creates a new version detail_page.create_new_version() # The new version is in the new edition new_version = Questionnaire.objects.latest('updated') assert new_version.configuration.edition == '2018' # The data of the old version was cleaned up assert old_version.data['qg_2'][0]['key_2'] is not None assert new_version.data['qg_2'][0]['key_2'] is None assert old_version.data['qg_2'][0]['key_3'] \ == new_version.data['qg_2'][0]['key_3'] assert 'qg_5' in old_version.data assert 'qg_5' not in new_version.data # The old values are still there edit_page = SampleEditPage(self) assert edit_page.has_text('Foo 3') # New questions are available and can be entered edit_page.click_edit_category('cat_4') step_page = SampleStepPage(self) step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_68, 'New key for edition 2018') step_page.submit_step() assert edit_page.has_text('New key for edition 2018') # The old values are still there assert edit_page.has_text('Foo 3') # Questions also have updated labels edit_page.click_edit_category('cat_1') assert step_page.has_text('Key 1 (edition 2018):') step_page.submit_step() # The old values are still there assert edit_page.has_text('Foo 3') # The user submits the version edit_page.submit_questionnaire() # The version is reviewed (in DB) new_version.status = settings.QUESTIONNAIRE_PUBLIC new_version.save() # The new public version does not have a hint about new editions detail_page.open() assert not detail_page.has_new_edition()
def test_edit_questionnaire(self): user = self.create_new_user(email='*****@*****.**', groups=['Reviewers', 'Publishers']) # Alice logs in # She enters a Questionnaire new_page = SampleNewPage(self) new_page.open(login=True, user=user) new_page.click_edit_category('cat_1') step_page = SampleStepPage(self) step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_1, 'Foo') step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_3, 'Bar') step_page.submit_step() # The questionnaire is already saved as draft # She submits it for review edit_page = SampleEditPage(self) edit_page.submit_questionnaire() # She reviews it detail_page = SampleDetailPage(self) detail_page.review_questionnaire() # She publishes it detail_page.publish_questionnaire() # She sees it is public and visible assert detail_page.has_text('Foo') assert detail_page.has_text('Bar') url = self.browser.current_url # She creates a new version detail_page.create_new_version() # She edits it edit_page.click_edit_category('cat_1') # She changes some values step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_1, 'asdf', clear=True) step_page.submit_step() # The questionnaire is already saved as draft # She is taken to the overview page where she sees the latest # (pending) changes of the draft edit_page.check_status('draft') assert not edit_page.has_text('Foo') assert edit_page.has_text('asdf') assert edit_page.has_text('Bar') # She sees the edit buttons assert edit_page.exists_el( edit_page.format_locator(edit_page.LOC_BUTTON_EDIT_CATEGORY, keyword='cat_1')) # She sees the possibility to view the questionnaire edit_page.view_questionnaire() self.assertIn(url, self.browser.current_url + '#top') # All the changes are there assert not detail_page.has_text('Foo') assert detail_page.has_text('asdf') assert detail_page.has_text('Bar') # There are no buttons to edit the sections anymore assert not detail_page.exists_el( detail_page.format_locator(edit_page.LOC_BUTTON_EDIT_CATEGORY, keyword='cat_1'))
def test_edit_public_new_config_edition(self, mock_choices): mock_choices.return_value = CODE_CHOICES + [('sample', 'sample'), ] code = 'sample_3' old_version = Questionnaire.objects.get(code=code) # A user logs in and goes to the detail page of a public questionnaire # where he is the compiler detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': code} detail_page.open(login=True, user=self.user) # The user sees a hint about a new edition on the detail page detail_page.close_edition_modal() assert detail_page.has_new_edition() # The user creates a new version detail_page.create_new_version() # The new version is in the new edition new_version = Questionnaire.objects.latest('updated') assert new_version.configuration.edition == '2018' # The data of the old version was cleaned up assert old_version.data['qg_2'][0]['key_2'] is not None assert new_version.data['qg_2'][0]['key_2'] is None assert old_version.data['qg_2'][0]['key_3'] \ == new_version.data['qg_2'][0]['key_3'] assert 'qg_5' in old_version.data assert 'qg_5' not in new_version.data # The old values are still there edit_page = SampleEditPage(self) assert edit_page.has_text('Foo 3') # New questions are available and can be entered edit_page.click_edit_category('cat_4') step_page = SampleStepPage(self) step_page.enter_text( step_page.LOC_FORM_INPUT_KEY_68, 'New key for edition 2018') step_page.submit_step() assert edit_page.has_text('New key for edition 2018') # The old values are still there assert edit_page.has_text('Foo 3') # Questions also have updated labels edit_page.click_edit_category('cat_1') assert step_page.has_text('Key 1 (edition 2018):') step_page.submit_step() # The old values are still there assert edit_page.has_text('Foo 3') # The user submits the version edit_page.submit_questionnaire() # The version is reviewed (in DB) new_version.status = settings.QUESTIONNAIRE_PUBLIC new_version.save() # The new public version does not have a hint about new editions detail_page.open() assert not detail_page.has_new_edition()
def test_edit_questionnaire(self): user = self.create_new_user( email='*****@*****.**', groups=['Reviewers', 'Publishers']) # Alice logs in # She enters a Questionnaire new_page = SampleNewPage(self) new_page.open(login=True, user=user) new_page.click_edit_category('cat_1') step_page = SampleStepPage(self) step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_1, 'Foo') step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_3, 'Bar') step_page.submit_step() # The questionnaire is already saved as draft # She submits it for review edit_page = SampleEditPage(self) edit_page.submit_questionnaire() # She reviews it detail_page = SampleDetailPage(self) detail_page.review_questionnaire() # She publishes it detail_page.publish_questionnaire() # She sees it is public and visible assert detail_page.has_text('Foo') assert detail_page.has_text('Bar') url = self.browser.current_url # She creates a new version detail_page.create_new_version() # She edits it edit_page.click_edit_category('cat_1') # She changes some values step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_1, 'asdf', clear=True) step_page.submit_step() # The questionnaire is already saved as draft # She is taken to the overview page where she sees the latest # (pending) changes of the draft edit_page.check_status('draft') assert not edit_page.has_text('Foo') assert edit_page.has_text('asdf') assert edit_page.has_text('Bar') # She sees the edit buttons assert edit_page.exists_el(edit_page.format_locator( edit_page.LOC_BUTTON_EDIT_CATEGORY, keyword='cat_1')) # She sees the possibility to view the questionnaire edit_page.view_questionnaire() self.assertIn(url, self.browser.current_url + '#top') # All the changes are there assert not detail_page.has_text('Foo') assert detail_page.has_text('asdf') assert detail_page.has_text('Bar') # There are no buttons to edit the sections anymore assert not detail_page.exists_el(detail_page.format_locator( edit_page.LOC_BUTTON_EDIT_CATEGORY, keyword='cat_1'))
def test_edit_public(self): code = 'sample_3' user = User.objects.get(pk=101) old_text = 'Faz 3' new_text = 'asdf' # User logs in and goes to the detail page of a "public" Questionnaire detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': code} detail_page.open(login=True, user=user) assert code in self.browser.current_url assert detail_page.has_text(old_text) assert not detail_page.has_text(new_text) # There is only one version of this questionnaire in the db assert Questionnaire.objects.filter(code=code).count() == 1 # User uses the direct link to go to the edit page of the questionnaire # and sees no new version of the questionnaire is created in the DB. # This prevents the issue when new versions were created upon GET of the # edit page, which should be fixed now. edit_page = SampleEditPage(self) edit_page.route_kwargs = {'identifier': code} edit_page.open() assert Questionnaire.objects.filter(code=code).count() == 1 # User edits the Questionnaire (creates a new version) and sees that # the URL contains the code of the Questionnaire detail_page.open() detail_page.create_new_version() assert code in self.browser.current_url # User edits a category and sees that the URL still contains the # code of the Questionnaire edit_page.click_edit_category('cat_2') assert code in self.browser.current_url # User makes some changes and submits the category step_page = SampleStepPage(self) step_page.enter_text( step_page.LOC_FORM_INPUT_KEY_5, new_text, clear=True) step_page.submit_step() # User is back on the overview page and sees that the URL still # contains the code of the Questionnaire assert code in self.browser.current_url assert edit_page.has_text(code) # She sees that the value of Key 1 was updated assert not edit_page.has_text(old_text) assert edit_page.has_text(new_text) # Also there was an additional version created in the database assert Questionnaire.objects.count() == 11 # The newly created version has the same code assert Questionnaire.objects.filter(code=code).count() == 2 # She goes to see her own questionnaire and sees sample_3 appears only # once my_page = MyDataPage(self) my_page.open() my_page.wait_for_lists() expected_list = [ { 'description': new_text, }, { # Just to check that description is there ... 'description': 'Faz 1' }, # ... the rest does not really matter ] assert my_page.count_list_results() == 6 my_page.check_list_results(expected_list, count=False) # She clicks the first entry and sees that she is taken to the # details page of the latest (pending) version. my_page.click_list_entry(index=0) assert detail_page.has_text(new_text)
def test_review_panel(self): # An Editor logs in and goes to the details page of a questionnaire # which he did not enter detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': 'sample_5'} detail_page.open(login=True, user=self.user_editor) assert detail_page.has_text('Foo 5') # He does see the review panel but no actions are possible detail_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # He goes to the details of a questionnaire where he is editor (only!). detail_page.route_kwargs = {'identifier': 'sample_3'} detail_page.open() assert detail_page.has_text('Foo 3') # He does see the review panel but can only edit detail_page.check_review_actions( create_new=True, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # He creates a new version detail_page.create_new_version() edit_page = SampleEditPage(self) # He makes some changes and saves the questionnaire edit_page.click_edit_category('cat_1') step_page = SampleStepPage(self) step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_1, ' (by Editor)') step_page.submit_step() # He sees a review panel but he does not see the button to # submit the questionnaire for review edit_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # He sees the buttons to edit each section assert edit_page.can_edit_category('cat_1') # User decides to view the questionnaire edit_page.view_questionnaire() # He does not see the button to edit each section anymore assert not edit_page.can_edit_category('cat_1') # Now the compiler logs in and goes to the detail page of the # questionnaire detail_page.open(login=True, user=self.user_compiler) # The compiler does see the button to submit the questionnaire detail_page.check_review_actions( create_new=False, edit=True, submit=True, review=False, publish=False, delete=True, change_compiler=False, ) # On the detail page, the compiler does not see buttons to edit the # categories assert not detail_page.can_edit_category('cat_1') # The compiler goes to the edit page and now sees the category buttons detail_page.edit_questionnaire() assert edit_page.can_edit_category('cat_1') # She submits the questionnaire to review assert edit_page.can_delete_questionnaire() edit_page.submit_questionnaire() # The questionnaire is now pending for review. The review panel # is visible but Compiler cannot do any actions. detail_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # The editor logs in again and opens the same page detail_page.open(login=True, user=self.user_editor) # He goes to the page and he also sees the review panel but no # actions can be taken. detail_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # Reviewer logs in and opens the page detail_page.open(login=True, user=self.user_reviewer) # He goes to the page and sees the review panel. There is a # button to do the review. detail_page.check_review_actions( create_new=False, edit=True, submit=False, review=True, publish=False, delete=False, change_compiler=False, ) # He is on the detail page and does not see the buttons to edit each # section assert not detail_page.can_edit_category('cat_1') # He goes to the edit page and now she sees the buttons detail_page.edit_questionnaire() assert edit_page.can_edit_category('cat_1') # He clicks the button to do the review edit_page.review_questionnaire() # He sees the review panel but no action is possible. detail_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # Compiler logs in and goes to the page, sees the review panel # but no actions possible detail_page.open(login=True, user=self.user_compiler) detail_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # Editor logs in and goes to the page, sees the review panel but # no actions possible. detail_page.open(login=True, user=self.user_editor) detail_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, ) # Publisher logs in and goes to the page. He sees the review # panel with a button to publish. detail_page.open(login=True, user=self.user_publisher) detail_page.check_review_actions( create_new=False, edit=True, submit=False, review=False, publish=True, delete=False, change_compiler=False, ) # He is on the detail page and does not see the buttons to edit each # section assert not detail_page.can_edit_category('cat_1') # He goes to the edit page and now she sees the buttons detail_page.edit_questionnaire() # He clicks the button to publish the questionnaire. detail_page.publish_questionnaire() # The review panel is there but he cannot edit detail_page.check_review_actions( create_new=False, edit=False, submit=False, review=False, publish=False, delete=False, change_compiler=False, )
def test_show_warning_when_adding_new_translation(self): user = self.create_new_user(email='*****@*****.**') new_page = SampleNewPage(self) new_page.open(login=True, user=user) # User sets the language to English and starts editing. new_page.change_language('en') new_page.click_edit_category('cat_1') # User does not see a translation warning (no object yet) step_page = SampleStepPage(self) assert not step_page.has_translation_warning() # User fills out a key and submits the step. step_page.get_el(step_page.LOC_FORM_INPUT_KEY_1).send_keys('Foo') step_page.submit_step() # User opens another step and does not see a translation warning new_page.click_edit_category('cat_1') assert not step_page.has_translation_warning() step_page.back_without_saving() # User now changes the language to French and wants to edit again. new_page.change_language('fr') new_page.click_edit_category('cat_1') # User sees a warning, telling him that he is about to add a new # translation. assert step_page.has_translation_warning() # User decides to go back to the overview. step_page.translation_warning_click_go_back() # User again wants to edit in French new_page.click_edit_category('cat_1') assert step_page.has_translation_warning() # This time, user continues and submits the step. step_page.translation_warning_click_continue() step_page.submit_step(confirm_add_translation=True) # When he opens the step again (in French), no warning is displayed # anymore. new_page.click_edit_category('cat_1') assert not step_page.has_translation_warning()
def test_enter_questionnaire_in_spanish_freetext(self): # Alice logs in self.doLogin() # She goes to the form to enter a new Questionnaire self.browser.get(self.live_server_url + reverse( route_questionnaire_new)) # She changes the language to Spanish self.changeLanguage('es') # She starts editing and enters some freetext self.click_edit_section('cat_1') self.findBy('name', 'qg_1-0-original_key_1').send_keys( 'Foo content in Spanish') # She submits the step and sees the values were transmitted correctly. self.submit_form_step() self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') # She changes the language to English and sees that she can see the # freetext values, even though they are in Spanish self.changeLanguage('en') self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') self.click_edit_section('cat_1') # She sees a warning that she is about to create a new translation step_page = SampleStepPage(self) assert step_page.has_translation_warning() step_page.translation_warning_click_continue() # She sees that the field already contains the original value text_field = self.findBy('name', 'qg_1-0-translation_key_1') self.assertEqual( text_field.get_attribute('value'), 'Foo content in Spanish') # She changes the value to its English translation text_field.clear() text_field.send_keys('Foo content in English') # She submits the step step_page.submit_step(confirm_add_translation=True) self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in English")]]') # She submits the Questionnaire self.review_action('submit') self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in English")]]') # She sees that the Spanish original is still there self.changeLanguage('es') self.findBy( 'xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') # She sees that both languages are available in the tech info metadata translations = self.findManyBy( 'xpath', '//ul[contains(@class, "tech-lang-list")]/li') self.assertEqual(len(translations), 2)
def test_enter_questionnaire_in_spanish_freetext(self): # Alice logs in self.doLogin() # She goes to the form to enter a new Questionnaire self.browser.get(self.live_server_url + reverse(route_questionnaire_new)) # She changes the language to Spanish self.changeLanguage('es') # She starts editing and enters some freetext self.click_edit_section('cat_1') self.findBy( 'name', 'qg_1-0-original_key_1').send_keys('Foo content in Spanish') # She submits the step and sees the values were transmitted correctly. self.submit_form_step() self.findBy('xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') # She changes the language to English and sees that she can see the # freetext values, even though they are in Spanish self.changeLanguage('en') self.findBy('xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') self.click_edit_section('cat_1') # She sees a warning that she is about to create a new translation step_page = SampleStepPage(self) assert step_page.has_translation_warning() step_page.translation_warning_click_continue() # She sees that the field already contains the original value text_field = self.findBy('name', 'qg_1-0-translation_key_1') self.assertEqual(text_field.get_attribute('value'), 'Foo content in Spanish') # She changes the value to its English translation text_field.clear() text_field.send_keys('Foo content in English') # She submits the step step_page.submit_step(confirm_add_translation=True) self.findBy('xpath', '//*[text()[contains(.,"Foo content in English")]]') # She submits the Questionnaire self.review_action('submit') self.findBy('xpath', '//*[text()[contains(.,"Foo content in English")]]') # She sees that the Spanish original is still there self.changeLanguage('es') self.findBy('xpath', '//*[text()[contains(.,"Foo content in Spanish")]]') # She sees that both languages are available in the tech info metadata translations = self.findManyBy( 'xpath', '//ul[contains(@class, "tech-lang-list")]/li') self.assertEqual(len(translations), 2)
def test_add_user(self, mock_search_users, mock_user_information): mock_search_users.side_effect = self.get_mock_remote_user_client_search mock_user_information.side_effect = self.get_mock_remote_user_client_user_information # User logs in and goes to the questionnaire step where he can add a # user. new_page = SampleNewPage(self) new_page.open(login=True, user=self.user_alice) new_page.click_edit_category('cat_0') # The field to search a user is not visible. step_page = SampleStepPage(self) search_field = step_page.get_user_search_field(index=1) assert not search_field.is_displayed() # She clicks the radio to search for an existing user step_page.get_el(step_page.LOC_RADIO_SEARCH_USER).click() # Now the search field is visible assert search_field.is_displayed() # There is no loading indicator loading_indicator = step_page.get_el(step_page.LOC_LOADING_SEARCH_USER) assert not loading_indicator.is_displayed() # She enters a name and sees a search is conducted search_field.send_keys(self.user_bob.firstname) step_page.select_autocomplete(self.user_bob.get_display_name()) # She sees a loading indicator while the user is updated in the DB assert loading_indicator.is_displayed() # She waits until the loading indicator disappears step_page.wait_for(step_page.LOC_LOADING_SEARCH_USER, visibility=False) # She sees that the search field is not visible anymore assert not search_field.is_displayed() # She sees that a field with the name was added assert step_page.has_selected_user(self.user_bob) # She sees that the user ID was added to the hidden field assert step_page.get_selected_user_id() == str(self.user_bob.pk) # She removes the user step_page.remove_selected_user(self.user_bob) # The user is removed and the search box is visible again assert not step_page.has_selected_user(self.user_bob) assert search_field.is_displayed() # She hidden field does not contain the ID anymore assert step_page.get_selected_user_id() == '' # She selects the user again step_page.select_user(self.user_bob) # She submits the step step_page.submit_step() # She sees the name is in the overview edit_page = SampleEditPage(self) assert edit_page.has_text(self.user_bob.get_display_name()) # She goes back to the form edit_page.click_edit_category('cat_0') # She sees the user is selected, loading and search fields are # not visible step_page.wait_for(step_page.LOC_LOADING_SEARCH_USER, visibility=False) assert step_page.has_selected_user(self.user_bob) assert step_page.get_selected_user_id() == str(self.user_bob.pk) # She removes the user and selects another one step_page.remove_selected_user(self.user_bob) step_page.select_user(self.user_chris) # She submits the step step_page.submit_step() assert edit_page.has_text(self.user_chris.get_display_name()) # She submits the entire questionnaire and sees the name is there edit_page.submit_questionnaire() assert edit_page.has_text(self.user_chris.get_display_name()) # She checks the database to make sure the user was added. questionnaire = Questionnaire.objects.first() questionnaire_users = sorted( questionnaire.get_users(), key=lambda u: (u[0], u[1].pk)) assert questionnaire_users == [ ('compiler', self.user_alice), ('landuser', self.user_chris) ]
def test_edit_public(self): code = 'sample_3' user = User.objects.get(pk=101) old_text = 'Faz 3' new_text = 'asdf' # User logs in and goes to the detail page of a "public" Questionnaire detail_page = SampleDetailPage(self) detail_page.route_kwargs = {'identifier': code} detail_page.open(login=True, user=user) assert code in self.browser.current_url assert detail_page.has_text(old_text) assert not detail_page.has_text(new_text) # There is only one version of this questionnaire in the db assert Questionnaire.objects.filter(code=code).count() == 1 # User uses the direct link to go to the edit page of the questionnaire # and sees no new version of the questionnaire is created in the DB. # This prevents the issue when new versions were created upon GET of the # edit page, which should be fixed now. edit_page = SampleEditPage(self) edit_page.route_kwargs = {'identifier': code} edit_page.open() assert Questionnaire.objects.filter(code=code).count() == 1 # User edits the Questionnaire (creates a new version) and sees that # the URL contains the code of the Questionnaire detail_page.open() detail_page.create_new_version() assert code in self.browser.current_url # User edits a category and sees that the URL still contains the # code of the Questionnaire edit_page.click_edit_category('cat_2') assert code in self.browser.current_url # User makes some changes and submits the category step_page = SampleStepPage(self) step_page.enter_text(step_page.LOC_FORM_INPUT_KEY_5, new_text, clear=True) step_page.submit_step() # User is back on the overview page and sees that the URL still # contains the code of the Questionnaire assert code in self.browser.current_url assert edit_page.has_text(code) # She sees that the value of Key 1 was updated assert not edit_page.has_text(old_text) assert edit_page.has_text(new_text) # Also there was an additional version created in the database assert Questionnaire.objects.count() == 11 # The newly created version has the same code assert Questionnaire.objects.filter(code=code).count() == 2 # She goes to see her own questionnaire and sees sample_3 appears only # once my_page = MyDataPage(self) my_page.open() my_page.wait_for_lists() expected_list = [ { 'description': new_text, }, { # Just to check that description is there ... 'description': 'Faz 1' }, # ... the rest does not really matter ] assert my_page.count_list_results() == 6 my_page.check_list_results(expected_list, count=False) # She clicks the first entry and sees that she is taken to the # details page of the latest (pending) version. my_page.click_list_entry(index=0) assert detail_page.has_text(new_text)