From 229a37b983c67a42d781ec2ae1ca34501ae13f32 Mon Sep 17 00:00:00 2001 From: Usman Khalid <2200617@gmail.com> Date: Fri, 13 Mar 2015 16:40:59 +0500 Subject: [PATCH] Bokchoy tests for account settings page. TNL-1499 --- .../acceptance/pages/lms/account_settings.py | 61 +++++ common/test/acceptance/pages/lms/dashboard.py | 19 ++ common/test/acceptance/pages/lms/fields.py | 138 ++++++++++ .../tests/lms/test_account_settings.py | 256 ++++++++++++++++++ .../ebe754f90bc88acf8ec6a1d27b87f743_120.jpg | Bin 0 -> 3168 bytes .../ebe754f90bc88acf8ec6a1d27b87f743_30.jpg | Bin 0 -> 957 bytes .../ebe754f90bc88acf8ec6a1d27b87f743_50.jpg | Bin 0 -> 1362 bytes .../ebe754f90bc88acf8ec6a1d27b87f743_500.jpg | Bin 0 -> 15852 bytes .../f0d065035a5c4d32df318fbc54138765_120.jpg | Bin 0 -> 3168 bytes .../f0d065035a5c4d32df318fbc54138765_30.jpg | Bin 0 -> 957 bytes .../f0d065035a5c4d32df318fbc54138765_50.jpg | Bin 0 -> 1362 bytes .../f0d065035a5c4d32df318fbc54138765_500.jpg | Bin 0 -> 15852 bytes 12 files changed, 474 insertions(+) create mode 100644 common/test/acceptance/pages/lms/account_settings.py create mode 100644 common/test/acceptance/pages/lms/fields.py create mode 100644 common/test/acceptance/tests/lms/test_account_settings.py create mode 100755 test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_120.jpg create mode 100755 test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_30.jpg create mode 100755 test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_50.jpg create mode 100755 test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_500.jpg create mode 100755 test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_120.jpg create mode 100755 test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_30.jpg create mode 100755 test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_50.jpg create mode 100755 test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_500.jpg diff --git a/common/test/acceptance/pages/lms/account_settings.py b/common/test/acceptance/pages/lms/account_settings.py new file mode 100644 index 0000000000..4e55e8479c --- /dev/null +++ b/common/test/acceptance/pages/lms/account_settings.py @@ -0,0 +1,61 @@ +""" +Base class for account settings page. +""" +from . import BASE_URL + +from bok_choy.page_object import PageObject +from bok_choy.promise import EmptyPromise + +from .fields import FieldsMixin + + +class AccountSettingsPage(FieldsMixin, PageObject): + """ + Tests for Account Settings Page. + """ + + url = "{base}/{settings}".format(base=BASE_URL, settings='account/settings') + + def is_browser_on_page(self): + return 'Account Settings' in self.browser.title + + def sections_structure(self): + """ + Return list of section titles and field titles for each section. + + Example: [ + { + 'title': 'Section Title' + 'fields': ['Field 1 title', 'Field 2 title',...] + }, + ... + ] + """ + self.wait_for_ajax() + + structure = [] + + sections = self.q(css='.section') + for section in sections: + section_title_element = section.find_element_by_class_name('section-header') + field_title_elements = section.find_elements_by_class_name('u-field-title') + + structure.append({ + 'title': section_title_element.text, + 'fields': [element.text for element in field_title_elements], + }) + + return structure + + def _is_loading_in_progress(self): + """ + Check if loading indicator is visible. + """ + query = self.q(css='.ui-loading-indicator') + return query.present and 'is-hidden' not in query.attrs('class')[0].split() + + def wait_for_loading_indicator(self): + """ + Wait for loading indicator to become visible. + """ + EmptyPromise(self._is_loading_in_progress, "Loading is in progress.").fulfill() diff --git a/common/test/acceptance/pages/lms/dashboard.py b/common/test/acceptance/pages/lms/dashboard.py index e1954d13f2..10958a34d9 100644 --- a/common/test/acceptance/pages/lms/dashboard.py +++ b/common/test/acceptance/pages/lms/dashboard.py @@ -183,3 +183,22 @@ class DashboardPage(PageObject): def get_course_social_sharing_widget(self, widget_name): """ Retrieves the specified social sharing widget by its classification """ return self.q(css='a.action-{}'.format(widget_name)) + + def click_username_dropdown(self): + """ + Click username dropdown. + """ + self.q(css='.dropdown').first.click() + + @property + def username_dropdown_link_text(self): + """ + Return list username dropdown links. + """ + return self.q(css='.dropdown-menu li a').text + + def click_account_settings_link(self): + """ + Click on `Account Settings` link. + """ + self.q(css='.dropdown-menu li a').first.click() diff --git a/common/test/acceptance/pages/lms/fields.py b/common/test/acceptance/pages/lms/fields.py new file mode 100644 index 0000000000..62124ea4f1 --- /dev/null +++ b/common/test/acceptance/pages/lms/fields.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +""" +Mixins for fields. +""" +from bok_choy.promise import EmptyPromise + +from ...tests.helpers import get_selected_option_text, select_option_by_text + + +class FieldsMixin(object): + """ + Methods for testing fields in pages. + """ + + def field(self, field_id): + """ + 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 + + def wait_for_field(self, field_id): + """ + Wait for a field to appear in DOM. + """ + EmptyPromise( + lambda: self.field(field_id) is not None, + "Field with id \"{0}\" is in DOM.".format(field_id) + ).fulfill() + + def title_for_field(self, field_id): + """ + Return the title of a field. + """ + self.wait_for_field(field_id) + + query = self.q(css='.u-field-{} .u-field-title'.format(field_id)) + return query.text[0] if query.present else None + + def message_for_field(self, field_id): + """ + Return the current message in a field. + """ + self.wait_for_field(field_id) + + query = self.q(css='.u-field-{} .u-field-message'.format(field_id)) + return query.text[0] if query.present else None + + def wait_for_messsage(self, field_id, message): + """ + Wait for a message to appear in a field. + """ + EmptyPromise( + lambda: message in (self.message_for_field(field_id) or ''), + "Messsage \"{0}\" is visible.".format(message) + ).fulfill() + + def indicator_for_field(self, field_id): + """ + Return the name of the current indicator in a field. + """ + self.wait_for_field(field_id) + + query = self.q(css='.u-field-{} .u-field-message i'.format(field_id)) + return [ + class_name for class_name + in query.attrs('class')[0].split(' ') + if class_name.startswith('message') + ][0].partition('-')[2] if query.present else None + + def wait_for_indicator(self, field_id, indicator): + """ + Wait for an indicator to appear in a field. + """ + EmptyPromise( + lambda: indicator == self.indicator_for_field(field_id), + "Indicator \"{0}\" is visible.".format(self.indicator_for_field(field_id)) + ).fulfill() + + def value_for_readonly_field(self, field_id): + """ + Return the value in a readonly field. + """ + self.wait_for_field(field_id) + + return self.value_for_text_field(field_id) + + def value_for_text_field(self, field_id, value=None): + """ + Get or set the value of a text field. + """ + self.wait_for_field(field_id) + + query = self.q(css='.u-field-{} input'.format(field_id)) + if not query.present: + return None + + if value is not None: + current_value = query.attrs('value')[0] + query.results[0].send_keys(u'\ue003' * len(current_value)) # Delete existing value. + query.results[0].send_keys(value) # Input new value + query.results[0].send_keys(u'\ue007') # Press Enter + return query.attrs('value')[0] + + def value_for_dropdown_field(self, field_id, value=None): + """ + Get or set the value in a dropdown field. + """ + self.wait_for_field(field_id) + + query = self.q(css='.u-field-{} select'.format(field_id)) + if not query.present: + return None + + if value is not None: + select_option_by_text(query, value) + return get_selected_option_text(query) + + def link_title_for_link_field(self, field_id): + """ + Return the title of the link in a link field. + """ + self.wait_for_field(field_id) + + query = self.q(css='.u-field-{} a'.format(field_id)) + return query.text[0] if query.present else None + + def click_on_link_in_link_field(self, field_id): + """ + Click the link in a link field. + """ + self.wait_for_field(field_id) + + query = self.q(css='.u-field-{} a'.format(field_id)) + if query.present: + query.first.click() diff --git a/common/test/acceptance/tests/lms/test_account_settings.py b/common/test/acceptance/tests/lms/test_account_settings.py new file mode 100644 index 0000000000..4558171360 --- /dev/null +++ b/common/test/acceptance/tests/lms/test_account_settings.py @@ -0,0 +1,256 @@ +# -*- coding: utf-8 -*- +""" +End-to-end tests for the Account Settings page. +""" +from unittest import skip + +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 + + +class AccountSettingsPageTest(WebAppTest): + """ + Tests that verify behaviour of the Account Settings page. + """ + + SUCCESS_MESSAGE = 'Your changes have been saved.' + USERNAME = "test" + PASSWORD = "testpass" + EMAIL = "test@example.com" + + def setUp(self): + """ + Initialize account and pages. + """ + super(AccountSettingsPageTest, self).setUp() + + AutoAuthPage(self.browser, username=self.USERNAME, password=self.PASSWORD, email=self.EMAIL).visit() + + self.account_settings_page = AccountSettingsPage(self.browser) + self.account_settings_page.visit() + + def test_link_on_dashboard_works(self): + """ + Scenario: Verify that account settings link is present in dashboard + page and we can use it to navigate to the page. + """ + dashboard_page = DashboardPage(self.browser) + dashboard_page.visit() + dashboard_page.click_username_dropdown() + self.assertIn('Account Settings', dashboard_page.username_dropdown_link_text) + dashboard_page.click_account_settings_link() + + def test_all_sections_and_fields_are_present(self): + """ + Scenario: Verify that all sections and fields are present on the page. + """ + expected_sections_structure = [ + { + 'title': 'Basic Account Information (required)', + 'fields': [ + 'Username', + 'Full Name', + 'Email Address', + 'Password', + 'Language', + ] + }, + { + 'title': 'Additional Information (optional)', + 'fields': [ + 'Education Completed', + 'Gender', + 'Year of Birth', + 'Country or Region', + 'Preferred Language', + ] + }, + { + 'title': 'Connected Accounts', + 'fields': [ + 'Facebook', + 'Google', + ] + } + ] + + self.assertEqual(self.account_settings_page.sections_structure(), expected_sections_structure) + + def _test_readonly_field(self, field_id, title, value): + """ + Test behavior of a readonly field. + """ + self.assertEqual(self.account_settings_page.title_for_field(field_id), title) + self.assertEqual(self.account_settings_page.value_for_readonly_field(field_id), value) + + def _test_text_field( + self, field_id, title, initial_value, new_invalid_value, new_valid_values, success_message=SUCCESS_MESSAGE, + assert_after_reload=True + ): + """ + Test behaviour of a text field. + """ + self.assertEqual(self.account_settings_page.title_for_field(field_id), title) + self.assertEqual(self.account_settings_page.value_for_text_field(field_id), initial_value) + + self.assertEqual( + self.account_settings_page.value_for_text_field(field_id, new_invalid_value), new_invalid_value + ) + self.account_settings_page.wait_for_indicator(field_id, 'validation-error') + self.browser.refresh() + self.assertNotEqual(self.account_settings_page.value_for_text_field(field_id), new_invalid_value) + + for new_value in new_valid_values: + self.assertEqual(self.account_settings_page.value_for_text_field(field_id, new_value), new_value) + self.account_settings_page.wait_for_messsage(field_id, success_message) + if assert_after_reload: + self.browser.refresh() + self.assertEqual(self.account_settings_page.value_for_text_field(field_id), new_value) + + def _test_dropdown_field( + self, field_id, title, initial_value, new_values, success_message=SUCCESS_MESSAGE, reloads_on_save=False + ): + """ + Test behaviour of a dropdown field. + """ + self.assertEqual(self.account_settings_page.title_for_field(field_id), title) + self.assertEqual(self.account_settings_page.value_for_dropdown_field(field_id), initial_value) + + for new_value in new_values: + self.assertEqual(self.account_settings_page.value_for_dropdown_field(field_id, new_value), new_value) + self.account_settings_page.wait_for_messsage(field_id, success_message) + if reloads_on_save: + self.account_settings_page.wait_for_loading_indicator() + else: + self.browser.refresh() + 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): + """ + Test behaviour a link field. + """ + self.assertEqual(self.account_settings_page.title_for_field(field_id), title) + self.assertEqual(self.account_settings_page.link_title_for_link_field(field_id), link_title) + self.account_settings_page.click_on_link_in_link_field(field_id) + self.account_settings_page.wait_for_messsage(field_id, success_message) + + def test_username_field(self): + """ + Test behaviour of "Username" field. + """ + self._test_readonly_field( + 'username', + 'Username', + self.USERNAME, + ) + + def test_full_name_field(self): + """ + Test behaviour of "Full Name" field. + """ + self._test_text_field( + u'name', + u'Full Name', + self.USERNAME, + u'@', + [u'another name', self.USERNAME], + ) + + def test_email_field(self): + """ + Test behaviour of "Email" field. + """ + self._test_text_field( + u'email', + u'Email Address', + self.EMAIL, + u'@', + [u'me@here.com', u'you@there.com'], + success_message='Click the link in the message to update your email address.', + assert_after_reload=False + ) + + def test_password_field(self): + """ + Test behaviour of "Password" field. + """ + self._test_link_field( + u'password', + u'Password', + u'Reset Password', + success_message='Click the link in the message to reset your password.', + ) + + @skip( + 'On bokchoy test servers, language changes take a few reloads to fully realize ' + 'which means we can no longer reliably match the strings in the html in other tests.' + ) + def test_language_field(self): + """ + Test behaviour of "Language" field. + """ + self._test_dropdown_field( + u'pref-lang', + u'Language', + u'English', + [u'Dummy Language (Esperanto)', u'English'], + reloads_on_save=True, + ) + + def test_education_completed_field(self): + """ + Test behaviour of "Education Completed" field. + """ + self._test_dropdown_field( + u'level_of_education', + u'Education Completed', + u'', + [u'Bachelor\'s degree', u''], + ) + + def test_gender_field(self): + """ + Test behaviour of "Gender" field. + """ + self._test_dropdown_field( + u'gender', + u'Gender', + u'', + [u'Female', u''], + ) + + def test_year_of_birth_field(self): + """ + Test behaviour of "Year of Birth" field. + """ + self._test_dropdown_field( + u'year_of_birth', + u'Year of Birth', + u'', + [u'1980', u''], + ) + + def test_country_field(self): + """ + Test behaviour of "Country or Region" field. + """ + self._test_dropdown_field( + u'country', + u'Country or Region', + u'', + [u'Pakistan', u''], + ) + + def test_prefered_language_field(self): + """ + Test behaviour of "Preferred Language" field. + """ + self._test_dropdown_field( + u'language_proficiencies', + u'Preferred Language', + u'', + [u'Pushto', u''], + ) diff --git a/test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_120.jpg b/test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_120.jpg new file mode 100755 index 0000000000000000000000000000000000000000..4feac03ee91ef751e775583a823d84759b2bab46 GIT binary patch literal 3168 zcmbW2c{J327stP2Ft!XLlC2@T${N3z3E4xI#xfPMOekb&rj#kP7+YkC%Fx)xnq^4Q z=%-9+Q8Z&2yO6Dro#y*Yzu)uxp65J&{hsH3&i$OvIrpA>?(5w5`CPCU905dZEp03T z2m}BioCAO?z#QP?<%RL`@WEg(ettdyA@LnTf`UT3#dgBQWu@iiWTjC?GTy zWn@$jsc9b6*3;9IS1~d%)G^+#tEcm;2!x-XUr10$YR3*KoxL)9b^d1qTLDo%01x1y z5Cp&_3W173z?XnLr%xWp9|ru>AY4#x9$pw9zknbofhq!UL7-4BZYU2AH#aByDklzb zi}Hx=)i&kb>Er`LToBi}o>su8Xjbz=!uivJlJ1%CSbl+Bl2W^+_bIEWs;TSg8yqq; z`px{Pg{76XjjfC83ACHLho`Tfe*pGuU{FM4)I}Wr(&f1L8#iy=P9Ub=&B)BkzL%5x zh+J4yTvAFYtF5c2HZ(qIdis0Y%UA96*Kazyx<50RJ-vPXqhsS=CMKu8PR}eZ{a9XE zU0dJS{KW+UpnqaNiUKHLgH2S; z=lZ)|uNi6L;&P+7wk8kHXvj(qhs>rj>t-3xr9j~IvnUYo!h*mNPvFN!vu-7;G%)gQ zhI5#pvQcTa8ACRf9HHez%5Cv-pIJ5i%owc2qDLHeQl3IyCW2#9S*p%nfA zL*k)`uVwbuOi5xzAf)% zxALV`axqBmG%Ps4W%!TO-4wAaJ%-Z>t0ZY!e6<>10~O^--x-L2n^ zXSLl(U{s7N-A#;l`V0bif@kjn>DJ9u|EU3mt#fUYo!fO@-#{Q4pRsTvrmkaX(6P8Y zXOy|a)#mV5@)X;8up!0zJUPXq|B^&l*TEOQvlez1R|U{$B+|a|;-wZ4NMuMACGBkm zfvogMlqp-^79}-Y9;ak5*V5{YI?2SY?&lyO56Q2+Aa6;!fBefh4`yi>xQ8GEB ziRz_T-$k80<+A3x#))HYBzm=o+n_(bhV{DE`~g`58^>BGrKkkUe%8(mqW3Y-gq*&wx!J3kw{akF^47U) zIFry=;PYEoIb^Lq!pt-PJ#;q;o^) zX^G^yG7S0i^1bJ3mi~zIYVnsw3i}jd5YKkVpYEo<7Ru87uFkvO>(f1hs5hTIyQSohQ`wd$L_8anWOao*CT{2i_SI|xjzjLF~Bfm8V?Ags$YhS1m|Tjw|EIm(@DI6_LW%S*2% ztsv6Mvm=)*(bT{*?9K67@JI3K*4vh84RRq=aBB!=bPQK_dTmNlIvB@t*amynU+ za<_MpCj8ZTHhT=|JY=lb<(t1OH`x-zhiHg3+7KQN?O_|)Rt z#_*u`uU?`XmK+bq6ZHq)MGI`6l#}qG3}IG~D%y0r-ELX(0(~(>r!XfPKF!%P-WYyh zm@+!^%h5kxMTN?~6jmZy3{)H@E;)+KrqAYH&zSIb%#!L{sHUvxQ%1gXevp8Ht2gIC z;FEG_X2O{A$|gs84 z`BS6zCO$;OSf`K}O@=yqZ%S{ZxW;sA)(JZO*tcdPRH(g$JYSqP0aqPNe;00fb>_gl;DL>8&c3HTYPljFSgQ8y6HTx6*2+KE5?%2_3D(a@tRvuyPDs+f(_~ zmANd=CR#GEnhfcCW_&$`%zU&cQ}cdIV*?Qt8F;T;?X_YrlXmUf`T3~mTTk)~U0HXe ztpxZ7OoFEZ&EPvEHkW literal 0 HcmV?d00001 diff --git a/test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_30.jpg b/test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_30.jpg new file mode 100755 index 0000000000000000000000000000000000000000..46be2ff684969c59713788fdae49c5527f0e8480 GIT binary patch literal 957 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<fW=16jCP7AKLB{__803NOWMu>c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!_R-qH*cBs?~}BLh{$iCku`%$hFJ%xfZZYGVpvf+4R}AS~Ydyw`->U%iVl4W!j-f|L#5rt;|(0jNUSd zVaI{zw-xy6woZPS>-Ics`<{PSvMU4C70r_selb)RA6##+X!pzHz4NttO2S|7{pa2o Uuk-C((Uh%ao3~wiyYl}{0C#V8<^TWy literal 0 HcmV?d00001 diff --git a/test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_50.jpg b/test_root/uploads/profile-images/ebe754f90bc88acf8ec6a1d27b87f743_50.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a5ef6559b24ebf3d1208670903671509b96f9f70 GIT binary patch literal 1362 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 literal 0 HcmV?d00001 diff --git a/test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_120.jpg b/test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_120.jpg new file mode 100755 index 0000000000000000000000000000000000000000..4feac03ee91ef751e775583a823d84759b2bab46 GIT binary patch literal 3168 zcmbW2c{J327stP2Ft!XLlC2@T${N3z3E4xI#xfPMOekb&rj#kP7+YkC%Fx)xnq^4Q z=%-9+Q8Z&2yO6Dro#y*Yzu)uxp65J&{hsH3&i$OvIrpA>?(5w5`CPCU905dZEp03T z2m}BioCAO?z#QP?<%RL`@WEg(ettdyA@LnTf`UT3#dgBQWu@iiWTjC?GTy zWn@$jsc9b6*3;9IS1~d%)G^+#tEcm;2!x-XUr10$YR3*KoxL)9b^d1qTLDo%01x1y z5Cp&_3W173z?XnLr%xWp9|ru>AY4#x9$pw9zknbofhq!UL7-4BZYU2AH#aByDklzb zi}Hx=)i&kb>Er`LToBi}o>su8Xjbz=!uivJlJ1%CSbl+Bl2W^+_bIEWs;TSg8yqq; z`px{Pg{76XjjfC83ACHLho`Tfe*pGuU{FM4)I}Wr(&f1L8#iy=P9Ub=&B)BkzL%5x zh+J4yTvAFYtF5c2HZ(qIdis0Y%UA96*Kazyx<50RJ-vPXqhsS=CMKu8PR}eZ{a9XE zU0dJS{KW+UpnqaNiUKHLgH2S; z=lZ)|uNi6L;&P+7wk8kHXvj(qhs>rj>t-3xr9j~IvnUYo!h*mNPvFN!vu-7;G%)gQ zhI5#pvQcTa8ACRf9HHez%5Cv-pIJ5i%owc2qDLHeQl3IyCW2#9S*p%nfA zL*k)`uVwbuOi5xzAf)% zxALV`axqBmG%Ps4W%!TO-4wAaJ%-Z>t0ZY!e6<>10~O^--x-L2n^ zXSLl(U{s7N-A#;l`V0bif@kjn>DJ9u|EU3mt#fUYo!fO@-#{Q4pRsTvrmkaX(6P8Y zXOy|a)#mV5@)X;8up!0zJUPXq|B^&l*TEOQvlez1R|U{$B+|a|;-wZ4NMuMACGBkm zfvogMlqp-^79}-Y9;ak5*V5{YI?2SY?&lyO56Q2+Aa6;!fBefh4`yi>xQ8GEB ziRz_T-$k80<+A3x#))HYBzm=o+n_(bhV{DE`~g`58^>BGrKkkUe%8(mqW3Y-gq*&wx!J3kw{akF^47U) zIFry=;PYEoIb^Lq!pt-PJ#;q;o^) zX^G^yG7S0i^1bJ3mi~zIYVnsw3i}jd5YKkVpYEo<7Ru87uFkvO>(f1hs5hTIyQSohQ`wd$L_8anWOao*CT{2i_SI|xjzjLF~Bfm8V?Ags$YhS1m|Tjw|EIm(@DI6_LW%S*2% ztsv6Mvm=)*(bT{*?9K67@JI3K*4vh84RRq=aBB!=bPQK_dTmNlIvB@t*amynU+ za<_MpCj8ZTHhT=|JY=lb<(t1OH`x-zhiHg3+7KQN?O_|)Rt z#_*u`uU?`XmK+bq6ZHq)MGI`6l#}qG3}IG~D%y0r-ELX(0(~(>r!XfPKF!%P-WYyh zm@+!^%h5kxMTN?~6jmZy3{)H@E;)+KrqAYH&zSIb%#!L{sHUvxQ%1gXevp8Ht2gIC z;FEG_X2O{A$|gs84 z`BS6zCO$;OSf`K}O@=yqZ%S{ZxW;sA)(JZO*tcdPRH(g$JYSqP0aqPNe;00fb>_gl;DL>8&c3HTYPljFSgQ8y6HTx6*2+KE5?%2_3D(a@tRvuyPDs+f(_~ zmANd=CR#GEnhfcCW_&$`%zU&cQ}cdIV*?Qt8F;T;?X_YrlXmUf`T3~mTTk)~U0HXe ztpxZ7OoFEZ&EPvEHkW literal 0 HcmV?d00001 diff --git a/test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_30.jpg b/test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_30.jpg new file mode 100755 index 0000000000000000000000000000000000000000..46be2ff684969c59713788fdae49c5527f0e8480 GIT binary patch literal 957 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<fW=16jCP7AKLB{__803NOWMu>c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!_R-qH*cBs?~}BLh{$iCku`%$hFJ%xfZZYGVpvf+4R}AS~Ydyw`->U%iVl4W!j-f|L#5rt;|(0jNUSd zVaI{zw-xy6woZPS>-Ics`<{PSvMU4C70r_selb)RA6##+X!pzHz4NttO2S|7{pa2o Uuk-C((Uh%ao3~wiyYl}{0C#V8<^TWy literal 0 HcmV?d00001 diff --git a/test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_50.jpg b/test_root/uploads/profile-images/f0d065035a5c4d32df318fbc54138765_50.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a5ef6559b24ebf3d1208670903671509b96f9f70 GIT binary patch literal 1362 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 literal 0 HcmV?d00001