def test_save_email(self): visobj = self.place.profile.email_visibility visobj.visible_online_public = True visobj.visible_online_authed = True visobj.visible_in_book = True visobj.save() # Setting `online_authed` to False is expected to set `online_public` to # False as well, and leave `in_book` as is without change. form = VisibilityForm(data={ 'visible_online_public': True, 'visible_online_authed': False, }, instance=visobj) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() visobj.refresh_from_db() self.assertFalse(visobj.visible_online_public) self.assertFalse(visobj.visible_online_authed) self.assertTrue(visobj.visible_in_book) # Setting `online_public` to True is expected to set `online_authed` to # True as well, and leave `in_book` as is without change. form = VisibilityForm(data={ 'visible_online_public': True, 'visible_online_authed': False, }, instance=visobj) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() visobj.refresh_from_db() self.assertTrue(visobj.visible_online_public) self.assertTrue(visobj.visible_online_authed) self.assertTrue(visobj.visible_in_book)
def test_object(self): test_data = [ (self.phone.visibility, { 'title': self.phone }), (self.place.visibility, { 'title': self.place }), (self.place.family_members_visibility, { 'en': "family members", 'eo': "kunloĝantoj" }), (self.phone.profile.email_visibility, { 'title': self.phone.profile.email }), ] for obj, title in test_data: with self.subTest(type=obj.model_type): form = VisibilityForm(instance=obj) self.assertTrue(hasattr(form, 'obj')) self.assertTrue(hasattr(form.obj, 'icon')) self.assertSurrounding(form.obj.icon, "<", ">") self.assertTrue(hasattr(form.obj, '__str__')) with override_settings(LANGUAGE_CODE='en'): self.assertEqual(str(form.obj), str(title.get('en') or title['title'])) with override_settings(LANGUAGE_CODE='eo'): self.assertEqual(str(form.obj), str(title.get('eo') or title['title']))
def test_init_readonly(self): form = VisibilityForm(instance=self.phone.visibility, read_only=True) # Verify that the expected fields are part of the form. self.assertEqual(set(self.expected_fields), set(form.fields)) # Verify that all fields are marked 'disabled'. for field in self.expected_fields: with self.subTest(field=field): self.assertTrue(form.fields[field].disabled)
def test_venues(self): form = VisibilityForm(instance=self.phone.visibility) test_data = [ ( list(form.venues()), [ form['visible_in_book'], form['visible_online_public'], form['visible_online_authed'] ], ), ( list(form.venues('in_book')), [form['visible_in_book']], ), ( list(form.venues('online')), [form['visible_online_public'], form['visible_online_authed']], ), ] for i, (venues, expected_venues) in enumerate(test_data, start=1): with self.subTest(case=i):
def test_init_normal(self): test_dataset = [ { 'obj': self.phone.visibility, 'mod': True }, { 'obj': self.place.visibility, 'mod': False, 'tied_online': True }, { 'obj': self.place.family_members_visibility, 'mod': False }, ] for test_data in test_dataset: with self.subTest(type=test_data['obj'].model_type): form = VisibilityForm(instance=test_data['obj']) # Verify that the expected fields are part of the form. self.assertEqual(set(self.expected_fields), set(form.fields)) # Verify that fields are not marked 'required'. for field in self.expected_fields: with self.subTest(field=field): self.assertFalse(form.fields[field].required) # Verify that fields are properly marked 'disabled'. self.assertFalse(form.fields['visible_online_public'].disabled) self.assertEqual(test_data['obj'].rules['online_authed'], test_data['mod']) self.assertEqual(form.fields['visible_online_authed'].disabled, not test_data['mod']) self.assertTrue(form.fields['hint'].disabled) self.assertTrue(form.fields['indent'].disabled) # Verify that 'online-public' and 'online-authed' are tied on # the client side, when needed. self.assertEqual( form.fields['visible_online_public'].widget.attrs.get( 'data-tied'), str(test_data.get('tied_online', False))) self.assertEqual( form.fields['visible_online_authed'].widget.attrs.get( 'data-tied'), str(test_data.get('tied_online', False))) # Verify that the form's save method is protected in templates. self.assertTrue( hasattr(form.save, 'alters_data') or hasattr(form.save, 'do_not_call_in_templates'))
def test_object_tampering(self): test_data = [ self.phone.visibility, self.place.visibility, self.place.family_members_visibility, self.phone.profile.email_visibility, ] for obj in test_data: with self.subTest(type=obj.model_type): with self.assertRaises(ValueError) as cm: form = VisibilityForm(data={ 'visible_in_book': True, 'hint': "AbC" }, request_profile="profile Dummy") form.obj self.assertEqual( str(cm.exception), "Form is bound but no visibility settings object was provided, " "for key None and 'profile Dummy'. " "This most likely indicates tampering.")
def test_save_place(self): self.place.visibility.visible_online_public = False self.place.visibility.visible_online_authed = False self.place.visibility.visible_in_book = True self.place.visibility.save() # Setting `online_public` to True is expected to set `online_authed` to # True as well, and leave `in_book` as is without change. form = VisibilityForm(data={ 'visible_online_public': True, }, instance=self.place.visibility) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() self.place.visibility.refresh_from_db() self.assertTrue(self.place.visibility.visible_online_public) self.assertTrue(self.place.visibility.visible_online_authed) self.assertTrue(self.place.visibility.visible_in_book) place2stay = PlaceFactory(available=True, in_book=True) place2stay.visibility.refresh_from_db() place2stay.visibility.visible_online_public = False place2stay.visibility.visible_online_authed = False place2stay.visibility.visible_in_book = True place2stay.visibility.save() # Setting `in_book` to False is expected to update the visibility object. form = VisibilityForm(data={ 'visible_in_book': False, }, instance=place2stay.visibility) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() place2stay.visibility.refresh_from_db() self.assertFalse(place2stay.visibility.visible_online_public) self.assertFalse(place2stay.visibility.visible_online_authed) self.assertFalse(place2stay.visibility.visible_in_book) # Setting `in_book` to True is expected to change the visibility object # and leave `online_public`, `online_authed` as are without change. form = VisibilityForm(data={ 'visible_in_book': True, }, instance=place2stay.visibility) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() place2stay.visibility.refresh_from_db() self.assertFalse(place2stay.visibility.visible_online_public) self.assertFalse(place2stay.visibility.visible_online_authed) self.assertTrue(place2stay.visibility.visible_in_book)
def test_save_phone(self): self.phone.visibility.visible_online_public = True self.phone.visibility.visible_online_authed = True self.phone.visibility.visible_in_book = True self.phone.visibility.save() # Setting `online_authed` to False is expected to set `online_public` to # False as well, and leave `in_book` as is without change. form = VisibilityForm(data={ 'visible_online_public': True, 'visible_online_authed': False, 'visible_in_book': True, }, instance=self.phone.visibility) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() self.phone.visibility.refresh_from_db() self.assertFalse(self.phone.visibility.visible_online_public) self.assertFalse(self.phone.visibility.visible_online_authed) self.assertTrue(self.phone.visibility.visible_in_book) # Setting `online_public` to True is expected to set `online_authed` to # True as well, and leave `in_book` as is without change. form = VisibilityForm(data={ 'visible_online_public': True, 'visible_online_authed': False, 'visible_in_book': True, }, instance=self.phone.visibility) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() self.phone.visibility.refresh_from_db() self.assertTrue(self.phone.visibility.visible_online_public) self.assertTrue(self.phone.visibility.visible_online_authed) self.assertTrue(self.phone.visibility.visible_in_book) # Setting `in_book` to False is expected to change the visibility object # and leave `online_public`, `online_authed` as are without change. form = VisibilityForm(data={ 'visible_online_public': True, 'visible_online_authed': True, 'visible_in_book': False, }, instance=self.phone.visibility) self.assertTrue(form.is_valid(), msg=repr(form.errors)) form.save() self.phone.visibility.refresh_from_db() self.assertTrue(self.phone.visibility.visible_online_public) self.assertTrue(self.phone.visibility.visible_online_authed) self.assertFalse(self.phone.visibility.visible_in_book)
def test_save(self): visobj = self.place.family_members_visibility form = VisibilityForm(data={}, instance=visobj) self.assertTrue(form.is_valid(), msg=repr(form.errors)) newobj = form.save(commit=False) self.assertIs(newobj, visobj)
# Verify that the expected fields are part of the form. self.assertEqual(set(self.expected_fields), set(form.fields)) # Verify that all fields are marked 'disabled'. for field in self.expected_fields: with self.subTest(field=field): self.assertTrue(form.fields[field].disabled) def test_inbook_field_disabled(self): # Case 1. available: N, in book: N. with self.subTest(case=1, available=False, in_book=False): place = PlaceFactory(available=False, in_book=False) place.visibility.refresh_from_db() phone = PhoneFactory(profile=place.profile) phone.visibility.refresh_from_db() # The `in_book` field for place's visibility object is expected to be disabled. form = VisibilityForm(instance=place.visibility) self.assertTrue(form.fields['visible_in_book'].disabled) # The `in_book` field for phone's visibility object is expected to be disabled. form = VisibilityForm(instance=phone.visibility) self.assertTrue(form.fields['visible_in_book'].disabled) # Case 2. available: Y, in book: N. with self.subTest(case=2, available=True, in_book=False): self.assertTrue(self.place.available) self.assertFalse(self.place.in_book) # The `in_book` field for place's visibility object is expected to be disabled. form = VisibilityForm(instance=self.place.visibility) self.assertTrue(form.fields['visible_in_book'].disabled) # The `in_book` field for phone's visibility object is expected to be enabled. form = VisibilityForm(instance=self.phone.visibility) self.assertFalse(form.fields['visible_in_book'].disabled)