From 1f3d2c24cc83f00663cc14ac9cf4161c9c956eba Mon Sep 17 00:00:00 2001 From: Andy Armstrong Date: Thu, 16 Apr 2015 11:16:03 -0400 Subject: [PATCH] Isolate Bok Choy tests to unique test users --- .../acceptance/pages/lms/account_settings.py | 4 +- common/test/acceptance/pages/lms/fields.py | 2 - common/test/acceptance/tests/helpers.py | 10 +- .../tests/lms/test_account_settings.py | 96 +++++++++++-------- .../tests/lms/test_learner_profile.py | 21 ++-- test_root/uploads/.gitignore | 1 + 6 files changed, 75 insertions(+), 59 deletions(-) diff --git a/common/test/acceptance/pages/lms/account_settings.py b/common/test/acceptance/pages/lms/account_settings.py index 4e55e8479c..648d7c5831 100644 --- a/common/test/acceptance/pages/lms/account_settings.py +++ b/common/test/acceptance/pages/lms/account_settings.py @@ -17,7 +17,7 @@ class AccountSettingsPage(FieldsMixin, PageObject): url = "{base}/{settings}".format(base=BASE_URL, settings='account/settings') def is_browser_on_page(self): - return 'Account Settings' in self.browser.title + return self.q(css='.account-settings-container').present def sections_structure(self): """ @@ -31,8 +31,6 @@ class AccountSettingsPage(FieldsMixin, PageObject): ... ] """ - self.wait_for_ajax() - structure = [] sections = self.q(css='.section') diff --git a/common/test/acceptance/pages/lms/fields.py b/common/test/acceptance/pages/lms/fields.py index 54d48dbd1e..d7e88a417a 100644 --- a/common/test/acceptance/pages/lms/fields.py +++ b/common/test/acceptance/pages/lms/fields.py @@ -16,8 +16,6 @@ class FieldsMixin(object): """ Return field with field_id. """ - self.wait_for_ajax() - query = self.q(css='.u-field-{}'.format(field_id)) return query.text[0] if query.present else None diff --git a/common/test/acceptance/tests/helpers.py b/common/test/acceptance/tests/helpers.py index 13357c93a8..9d0bbb1192 100644 --- a/common/test/acceptance/tests/helpers.py +++ b/common/test/acceptance/tests/helpers.py @@ -306,18 +306,20 @@ class EventsTestMixin(object): self.event_collection.drop() self.start_time = datetime.now() - def get_matching_events(self, event_type): + def get_matching_events(self, username, event_type): """ Returns a cursor for the matching browser events. """ return self.event_collection.find({ + "username": username, "event_type": event_type, "time": {"$gt": self.start_time}, }) - def verify_events_of_type(self, event_type, expected_events, expected_referers=None): + def verify_events_of_type(self, username, event_type, expected_events, expected_referers=None): """Verify that the expected events of a given type were logged. Args: + username (str): The name of the authenticated user. event_type (str): The type of event to be verified. expected_events (list): A list of dicts representing the events that should have been fired. @@ -328,12 +330,12 @@ class EventsTestMixin(object): will verify that the referer for the single event ends with "/account/settings". """ EmptyPromise( - lambda: self.get_matching_events(event_type).count() >= len(expected_events), + lambda: self.get_matching_events(username, event_type).count() >= len(expected_events), "Waiting for the minimum number of events of type {type} to have been recorded".format(type=event_type) ).fulfill() # Verify that the correct events were fired - cursor = self.get_matching_events(event_type) + cursor = self.get_matching_events(username, event_type) actual_events = [] actual_referers = [] for __ in range(0, cursor.count()): diff --git a/common/test/acceptance/tests/lms/test_account_settings.py b/common/test/acceptance/tests/lms/test_account_settings.py index 72d37fb41c..843610a5db 100644 --- a/common/test/acceptance/tests/lms/test_account_settings.py +++ b/common/test/acceptance/tests/lms/test_account_settings.py @@ -9,7 +9,6 @@ from bok_choy.web_app_test import WebAppTest from ...pages.lms.account_settings import AccountSettingsPage from ...pages.lms.auto_auth import AutoAuthPage from ...pages.lms.dashboard import DashboardPage -from ..helpers import EventsTestMixin from ..helpers import EventsTestMixin @@ -19,42 +18,41 @@ class AccountSettingsTestMixin(EventsTestMixin, WebAppTest): Mixin with helper methods to test the account settings page. """ - USERNAME = u"test" - PASSWORD = "testpass" - EMAIL = u"test@example.com" CHANGE_INITIATED_EVENT_NAME = u"edx.user.settings.change_initiated" USER_SETTINGS_CHANGED_EVENT_NAME = 'edx.user.settings.changed' ACCOUNT_SETTINGS_REFERER = u"/account/settings" - def setUp(self): + def log_in_as_unique_user(self, email=None): """ - Initialize account and pages. + Create a unique user and return the account's username and id. """ - super(AccountSettingsTestMixin, self).setUp() + username = "test_{uuid}".format(uuid=self.unique_id[0:6]) + auto_auth_page = AutoAuthPage(self.browser, username=username, email=email).visit() + user_id = auto_auth_page.get_user_id() + return username, user_id - self.user_id = AutoAuthPage( - self.browser, username=self.USERNAME, password=self.PASSWORD, email=self.EMAIL - ).visit().get_user_id() - - def assert_event_emitted_num_times(self, setting, num_times): + def assert_event_emitted_num_times(self, user_id, setting, num_times): """ Verify a particular user settings change event was emitted a certain number of times. """ # pylint disable=no-member super(AccountSettingsTestMixin, self).assert_event_emitted_num_times( - self.USER_SETTINGS_CHANGED_EVENT_NAME, self.start_time, self.user_id, num_times, setting=setting + self.USER_SETTINGS_CHANGED_EVENT_NAME, self.start_time, user_id, num_times, setting=setting ) - def verify_settings_changed_events(self, events, table=None): + def verify_settings_changed_events(self, username, user_id, events, table=None): """ Verify a particular set of account settings change events were fired. """ expected_referers = [self.ACCOUNT_SETTINGS_REFERER] * len(events) for event in events: - event[u'user_id'] = long(self.user_id) + event[u'user_id'] = long(user_id) event[u'table'] = u"auth_userprofile" if table is None else table - self.verify_events_of_type(self.USER_SETTINGS_CHANGED_EVENT_NAME, events, expected_referers=expected_referers) + self.verify_events_of_type( + username, self.USER_SETTINGS_CHANGED_EVENT_NAME, events, + expected_referers=expected_referers + ) class DashboardMenuTest(AccountSettingsTestMixin, WebAppTest): @@ -71,6 +69,7 @@ class DashboardMenuTest(AccountSettingsTestMixin, WebAppTest): And I click on "Account Settings" in the top drop down Then I should see my account settings page """ + self.log_in_as_unique_user() dashboard_page = DashboardPage(self.browser) dashboard_page.visit() dashboard_page.click_username_dropdown() @@ -89,10 +88,16 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): Initialize account and pages. """ super(AccountSettingsPageTest, self).setUp() + self.username, self.user_id = self.log_in_as_unique_user() + self.visit_account_settings_page() - # Visit the account settings page for the current user. + def visit_account_settings_page(self): + """ + Visit the account settings page for the current user. + """ self.account_settings_page = AccountSettingsPage(self.browser) self.account_settings_page.visit() + self.account_settings_page.wait_for_ajax() def test_page_view_event(self): """ @@ -104,9 +109,10 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): Then a page view analytics event should be recorded """ self.verify_events_of_type( + self.username, u"edx.user.settings.viewed", [{ - u"user_id": int(self.user_id), + u"user_id": long(self.user_id), u"page": u"account", u"visibility": None, }] @@ -195,6 +201,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): self.account_settings_page.wait_for_loading_indicator() else: self.browser.refresh() + self.account_settings_page.wait_for_page() self.assertEqual(self.account_settings_page.value_for_dropdown_field(field_id), new_value) def _test_link_field(self, field_id, title, link_title, success_message): @@ -210,11 +217,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): """ Test behaviour of "Username" field. """ - self._test_readonly_field( - 'username', - 'Username', - self.USERNAME, - ) + self._test_readonly_field('username', 'Username', self.username) def test_full_name_field(self): """ @@ -223,21 +226,22 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): self._test_text_field( u'name', u'Full Name', - self.USERNAME, + self.username, u'@', - [u'another name', self.USERNAME], + [u'another name', self.username], ) self.verify_settings_changed_events( + self.username, self.user_id, [{ u"setting": u"name", - u"old": self.USERNAME, + u"old": self.username, u"new": u"another name", }, { u"setting": u"name", u"old": u'another name', - u"new": self.USERNAME, + u"new": self.username, }] ) @@ -245,10 +249,13 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): """ Test behaviour of "Email" field. """ + EMAIL = u"test@example.com" + username, user_id = self.log_in_as_unique_user(email=EMAIL) + self.visit_account_settings_page() self._test_text_field( u'email', u'Email Address', - self.EMAIL, + EMAIL, u'@', [u'me@here.com', u'you@there.com'], success_message='Click the link in the message to update your email address.', @@ -256,18 +263,19 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ) self.verify_events_of_type( + username, self.CHANGE_INITIATED_EVENT_NAME, [ { - u"user_id": int(self.user_id), + u"user_id": long(user_id), u"setting": u"email", - u"old": self.EMAIL, + u"old": EMAIL, u"new": u'me@here.com' }, { - u"user_id": int(self.user_id), + u"user_id": long(user_id), u"setting": u"email", - u"old": self.EMAIL, # NOTE the first email change was never confirmed, so old has not changed. + u"old": EMAIL, # NOTE the first email change was never confirmed, so old has not changed. u"new": u'you@there.com' } ], @@ -275,7 +283,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ) # Email is not saved until user confirms, so no events should have been # emitted. - self.assert_event_emitted_num_times('email', 0) + self.assert_event_emitted_num_times(user_id, 'email', 0) def test_password_field(self): """ @@ -289,6 +297,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ) self.verify_events_of_type( + self.username, self.CHANGE_INITIATED_EVENT_NAME, [{ u"user_id": int(self.user_id), @@ -300,7 +309,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): ) # Like email, since the user has not confirmed their password change, # the field has not yet changed, so no events will have been emitted. - self.assert_event_emitted_num_times('password', 0) + self.assert_event_emitted_num_times(self.user_id, 'password', 0) @skip( 'On bokchoy test servers, language changes take a few reloads to fully realize ' @@ -329,6 +338,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): [u'Bachelor\'s degree', u''], ) self.verify_settings_changed_events( + self.username, self.user_id, [{ u"setting": u"level_of_education", u"old": None, @@ -352,6 +362,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): [u'Female', u''], ) self.verify_settings_changed_events( + self.username, self.user_id, [{ u"setting": u"gender", u"old": None, @@ -378,6 +389,7 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): [u'1980', u''], ) self.verify_settings_changed_events( + self.username, self.user_id, [{ u"setting": u"year_of_birth", u"old": None, @@ -400,17 +412,21 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, WebAppTest): u'', [u'Pakistan', u'Palau'], ) + + def test_country_field_events(self): + """ + Test that saving the country field records the correct events. + """ + self.reset_event_tracking() + self.assertEqual(self.account_settings_page.value_for_dropdown_field(u'country', u'Pakistan'), u'Pakistan') + self.account_settings_page.wait_for_messsage(u'country', self.SUCCESS_MESSAGE) self.verify_settings_changed_events( + self.username, self.user_id, [{ u"setting": u"country", u"old": None, u"new": u'PK', - }, - { - u"setting": u"country", - u"old": u'PK', - u"new": u'PW', - }] + }], ) def test_preferred_language_field(self): diff --git a/common/test/acceptance/tests/lms/test_learner_profile.py b/common/test/acceptance/tests/lms/test_learner_profile.py index 0209d21155..bc24081746 100644 --- a/common/test/acceptance/tests/lms/test_learner_profile.py +++ b/common/test/acceptance/tests/lms/test_learner_profile.py @@ -84,14 +84,15 @@ class LearnerProfileTestMixin(EventsTestMixin): str(birth_year) ) - def verify_profile_page_view_event(self, profile_user_id, visibility=None): + def verify_profile_page_view_event(self, requesting_username, profile_user_id, visibility=None): """ Verifies that the correct view event was captured for the profile page. """ self.verify_events_of_type( + requesting_username, u"edx.user.settings.viewed", [{ - u"user_id": int(profile_user_id), + u"user_id": long(profile_user_id), u"page": u"profile", u"visibility": unicode(visibility), }] @@ -180,7 +181,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): self.assertTrue(profile_page.privacy_field_visible) self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS) - self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PRIVATE) + self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PRIVATE) def test_fields_on_my_public_profile(self): """ @@ -202,7 +203,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): self.assertEqual(profile_page.editable_fields, self.PUBLIC_PROFILE_EDITABLE_FIELDS) - self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PUBLIC) + self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PUBLIC) def _test_dropdown_field(self, profile_page, field_id, new_value, displayed_value, mode): """ @@ -332,7 +333,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): username, user_id = self.log_in_as_unique_user() message = "You must specify your birth year before you can share your full profile." self.verify_profile_forced_private_message(username, birth_year=None, message=message) - self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PRIVATE) + self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PRIVATE) def test_user_is_under_age(self): """ @@ -350,7 +351,7 @@ class OwnLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): birth_year=under_age_birth_year, message='You must be over 13 to share a full profile.' ) - self.verify_profile_page_view_event(user_id, visibility=self.PRIVACY_PRIVATE) + self.verify_profile_page_view_event(username, user_id, visibility=self.PRIVACY_PRIVATE) def test_user_can_only_see_default_image_for_private_profile(self): """ @@ -557,12 +558,12 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): Then I see some of the profile fields are shown. """ different_username, different_user_id = self._initialize_different_user(privacy=self.PRIVACY_PRIVATE) - self.log_in_as_unique_user() + username, __ = self.log_in_as_unique_user() profile_page = self.visit_profile_page(different_username) self.assertFalse(profile_page.privacy_field_visible) self.assertEqual(profile_page.visible_fields, self.PRIVATE_PROFILE_FIELDS) - self.verify_profile_page_view_event(different_user_id, visibility=self.PRIVACY_PRIVATE) + self.verify_profile_page_view_event(username, different_user_id, visibility=self.PRIVACY_PRIVATE) def test_different_user_under_age(self): """ @@ -597,13 +598,13 @@ class DifferentUserLearnerProfilePageTest(LearnerProfileTestMixin, WebAppTest): Also `location`, `language` and `about me` fields are not editable. """ different_username, different_user_id = self._initialize_different_user(privacy=self.PRIVACY_PUBLIC) - self.log_in_as_unique_user() + username, __ = self.log_in_as_unique_user() profile_page = self.visit_profile_page(different_username) profile_page.wait_for_public_fields() self.assertFalse(profile_page.privacy_field_visible) self.assertEqual(profile_page.visible_fields, self.PUBLIC_PROFILE_FIELDS) self.assertEqual(profile_page.editable_fields, []) - self.verify_profile_page_view_event(different_user_id, visibility=self.PRIVACY_PUBLIC) + self.verify_profile_page_view_event(username, different_user_id, visibility=self.PRIVACY_PUBLIC) def _initialize_different_user(self, privacy=None, birth_year=None): """ diff --git a/test_root/uploads/.gitignore b/test_root/uploads/.gitignore index afed0735dc..ce360105a0 100644 --- a/test_root/uploads/.gitignore +++ b/test_root/uploads/.gitignore @@ -1 +1,2 @@ *.csv +*.jpg