Best Python code snippet using assertpy_python
validators.py
Source:validators.py
1from __future__ import print_function, unicode_literals2import inspect3from django.core.exceptions import ImproperlyConfigured4from django.core.urlresolvers import Resolver404, resolve5from django.template.response import SimpleTemplateResponse6from six.moves.urllib_parse import urlsplit, urlunsplit7class BaseValidator(object):8 """9 Base validator which should be sub-classed to create10 custom validators.11 :var tuple BaseValidator.expected_attrs: Required attributes for the12 validator. :py:meth:`_check_improper_configuration`13 will verify that all of these attributes are defined.14 .. note:: Each validator should only define required15 attributes for itself. :py:meth:`_get_expected_attrs`16 will automatically return required attributes17 from all current validator and base classes.18 :param test_step: :py:class:`subui.step.TestStep`19 instance which will be used to make assertions on.20 .. note:: This parameter is not really required in the21 ``__init__`` because the same step will be passed22 in :py:meth:`test` however is useful in ``__init__``23 in case subclass validator needs to apply custom24 login according to values from the ``step``.25 """26 expected_attrs = None27 def __init__(self, test_step=None, **kwargs):28 self.step = test_step29 self.__dict__.update(**kwargs)30 def _get_expected_attrs(self):31 """32 Get all required/expected attributes as defined by33 :py:attr:`expected_attrs` from all current and base34 classes.35 For example::36 class Validator1(BaseValidator):37 expected_attr = ('foo', 'bar')38 class Validator2(Validator1):39 expected_attr = ('hello', 'world')40 > validator = Validator2()41 > validator._get_expected_attrs()42 ['foo', 'bar', 'hello', 'world']43 :rtype: list44 """45 bases = inspect.getmro(self.__class__)46 attrs = set()47 for base in bases:48 attrs |= set(getattr(base, 'expected_attrs', None) or set())49 return list(sorted(attrs))50 def _check_improper_configuration(self):51 """52 Check that the validator is configured correctly53 by verifying that all attributes as returned by54 :py:meth:`_get_expected_attrs` are defined.55 :raises ImproperlyConfigured: If any of the required56 attributes are not defined.57 """58 for attr in self._get_expected_attrs():59 if not getattr(self, attr, None):60 msg = '{} requires to define {}'61 raise ImproperlyConfigured(62 msg.format(self.__class__.__name__, attr)63 )64 def _get_base_error_message(self):65 """66 Get base error message which will be used in assertions67 """68 msg = 'Response for {{{key}:{step}}} requesting "{url}"'69 msg = msg.format(70 key=self.step.step_key,71 step=self.step.__class__.__name__,72 url=self.step.get_url(),73 )74 return msg75 def test(self, test_step):76 """77 Test the step's server response by making78 all the necessary assertions. This method79 by default saves the ``test_step`` parameter80 into :py:attr:`step` and validates the validator81 by using :py:meth:`_check_improper_configuration`.82 All subclass validators should actually implement83 assertions in this method.84 :param test_step: Test step85 """86 self.step = test_step87 self._check_improper_configuration()88class HeaderValidator(BaseValidator):89 """90 Validator which can check that a particular header91 is returned and that it is of particular value.92 :var str HeaderValidator.header_name: Name of the header which93 must be returned94 :var str expected_header: Expected header value95 to be returned96 :var bool HeaderValidator.test_header_value: Whether to test the97 header value or simply check its existence98 :var test_contains_value: Whether to test if the99 header value contains another value, or simply100 check equality to that value101 """102 expected_attrs = ('header_name', 'expected_header',)103 header_name = None104 expected_header = None105 test_header_value = True106 test_contains_value = False107 def _get_expected_attrs(self):108 """109 Get all expected attributes except remove "expected_header"110 if :py:attr:`test_header_value` is ``False``.111 """112 attrs = super(HeaderValidator, self)._get_expected_attrs()113 if not self.test_header_value:114 attrs.remove('expected_header')115 return attrs116 def test(self, test_step):117 """118 Test the response returned with119 :py:attr:header_name header and that its value120 is equal to :py:attr:expected_header if121 :py:attr:test_header_value is True.122 If :py:attr:test_contains_value is True,123 header value will be tested to contain expected value.124 """125 super(HeaderValidator, self).test(test_step)126 if self.test_contains_value:127 self.test_header_value = False128 self.step.test.assertIn(129 self.header_name,130 self.step.response,131 '{} must contain {} header'132 ''.format(self._get_base_error_message(),133 self.header_name)134 )135 if self.test_header_value:136 self.test_contains_value = False137 self.step.test.assertEqual(138 self.step.response[self.header_name],139 self.expected_header,140 '{} returned header {} with value {} != {}'141 ''.format(self._get_base_error_message(),142 self.header_name,143 self.step.response[self.header_name],144 self.expected_header)145 )146 if self.test_contains_value:147 self.step.test.assertIn(148 self.expected_header,149 self.step.response[self.header_name],150 '{} returned header {} with value {} which doesnt contain {}'151 ''.format(self._get_base_error_message(),152 self.header_name,153 self.step.response[self.header_name],154 self.expected_header)155 )156class HeaderContentTypeValidator(HeaderValidator):157 """158 Validator to check that the expected159 "Content-Type" header is returned.160 """161 header_name = 'Content-Type'162class HeaderLocationValidator(HeaderValidator):163 """164 Validator to check that the redirect165 "Location" header is returned166 """167 header_name = 'Location'168class StatusCodeValidator(BaseValidator):169 """170 Validator which allows to verify the returned171 server status code such as "OK-200" or "Redirect-302", etc.172 :var int StatusCodeValidator.expected_status_code: Expected status code to be173 returned by the server174 """175 expected_attrs = ('expected_status_code',)176 expected_status_code = None177 def test(self, test_step):178 """179 Test that the response status code180 matched expected status code.181 """182 super(StatusCodeValidator, self).test(test_step)183 self.step.test.assertEqual(184 self.step.response.status_code,185 self.expected_status_code,186 '{} returned with status code {} != {}'187 ''.format(self._get_base_error_message(),188 self.step.response.status_code,189 self.expected_status_code)190 )191class StatusCodeCreatedValidator(StatusCodeValidator):192 """193 Validator to check that the returned status194 code is created - 201195 """196 expected_status_code = 201197class StatusCodeOkValidator(StatusCodeValidator):198 """199 Validator to check that the returned status200 code is OK - 200201 """202 expected_status_code = 200203class StatusCodeRedirectValidator(HeaderLocationValidator, StatusCodeValidator):204 """205 Validator to check that the server returns a redirect206 with the "Location" header defined.207 """208 expected_status_code = 302209 test_header_value = False210class RedirectToRouteValidator(StatusCodeRedirectValidator):211 """212 Validator which also checks that the server returns213 a redirect to an expected Django route.214 :var str expected_route_name: Route name to which215 the server should redirect to216 """217 expected_attrs = ('expected_route_name',)218 expected_route_name = None219 def test(self, test_step):220 """221 Test the response by additionally testing222 that the response redirects to an expected223 route as defined by :py:attr:`expected_route_name`.224 """225 super(RedirectToRouteValidator, self).test(test_step)226 location = self.step.response['Location']227 # remove schema, query string and host from URL. Since query string need to be removed to properly resolve that url228 location = urlunsplit(('', '', urlsplit(location).path, '', ''))229 try:230 redirected_to_route = resolve(location).view_name231 except Resolver404:232 msg = '{} returned a redirect to "{}" which cannot be resolved'233 self.step.test.fail(msg.format(self._get_base_error_message(),234 location))235 self.step.test.assertEqual(236 redirected_to_route,237 self.expected_route_name,238 '{} returned redirect to route {} != {}'239 ''.format(self._get_base_error_message(),240 redirected_to_route,241 self.expected_route_name)242 )243class ResponseContentContainsValidator(StatusCodeOkValidator):244 """245 Validator which also checks that returned response246 content contains expect string.247 :var str expected_content: Expected string in the248 server response249 """250 expected_attrs = ('expected_content',)251 expected_content = None252 def test(self, test_step):253 """254 Test the response by additionally testing255 that the response context contains expected256 string as defined by :py:attr:`expected_content`.257 """258 super(ResponseContentContainsValidator, self).test(test_step)259 self.step.test.assertIn(260 self.expected_content,261 # need to decode since content is binary262 self.step.response.content.decode('utf-8'),263 '{} does not contain {!r} in its content'264 ''.format(self._get_base_error_message(),265 self.expected_content)266 )267class ResponseContentNotContainsValidator(StatusCodeOkValidator):268 """269 Validator checks that returned response270 content does not contain unexpected string.271 :var str unexpected_content: Unexpected string in the272 server response273 """274 expected_attrs = ('unexpected_content',)275 unexpected_content = None276 def test(self, test_step):277 """278 Test the response by additionally testing279 that the response context does not contain the unexpected280 string as defined by :py:attr:`unexpected_content`.281 """282 super(ResponseContentNotContainsValidator, self).test(test_step)283 self.step.test.assertNotIn(284 self.unexpected_content,285 # need to decode since content is binary286 self.step.response.content.decode('utf-8'),287 'UnexpectedContentFound: {} contains {!r} in its content. '288 ''.format(self._get_base_error_message(),289 self.unexpected_content)290 )291class SessionDataValidator(BaseValidator):292 """293 Validator which allows to verify the data in the session based on294 session key.295 :var str expected_session_key: Expected session key to be present in session296 :var list expected_session_secondary_keys: List of Expected session key to be present in session297 """298 expected_attrs = ('expected_session_key',)299 expected_session_key = None300 expected_session_secondary_keys = []301 def test(self, test_step):302 """303 Test that expected session key is present. If expected session data provided,304 ensure the expected session key data matches what is there currently.305 """306 super(SessionDataValidator, self).test(test_step)307 self.step.test.assertIn(308 self.expected_session_key,309 self.step.response.wsgi_request.session.keys(),310 '{} does not contain session[{!r}].'311 ''.format(self._get_base_error_message(),312 self.expected_session_key)313 )314 if self.expected_session_secondary_keys:315 self.step.test.assertIsInstance(316 self.step.response.wsgi_request.session[self.expected_session_key],317 dict,318 '{} session[{!r}] is not a dictionary hence cannot contain secondary keys.'319 ''.format(self._get_base_error_message(), self.expected_session_key)320 )321 # Make sure secondary keys are not empty.322 for secondary_key in self.expected_session_secondary_keys:323 self.step.test.assertIn(324 secondary_key,325 self.step.response.wsgi_request.session[self.expected_session_key].keys(),326 '{} does not contain session[{!r}][{!r}].'327 ''.format(self._get_base_error_message(), self.expected_session_key, secondary_key)328 )329 self.step.test.assertIsNotNone(330 self.step.response.wsgi_request.session[self.expected_session_key][secondary_key],331 '{} contains session[{!r}][{!r}] but is empty.'332 ''.format(self._get_base_error_message(), self.expected_session_key, secondary_key)333 )334class FormInitialDataValidator(BaseValidator):335 """336 Validator checks that form in response has expected data in initial data.337 :var str initial_data_key: Expected initial data key to be present in form initial data338 :var expected_initial_data_value: Expected value initial value should be set to339 :var str context_data_form_name: Template context data key for form data340 :var bool test_initial_value: Test if the initial value matched expected value341 :var bool test_initial_value_present: Test if the initial value key is present in initial data342 :var bool test_initial_value_not_none: Test if the initial value is not ``None``343 """344 expected_attrs = ('initial_data_key',)345 initial_data_key = None346 expected_initial_data_value = None347 context_data_form_name = 'form'348 test_initial_value = False349 test_initial_value_present = True350 test_initial_value_not_none = True351 def test(self, test_step):352 super(FormInitialDataValidator, self).test(test_step)353 self.step.test.assertIsInstance(354 self.step.response,355 SimpleTemplateResponse,356 '{} did not return SimpleTemplateResponse '357 'and as such response.context_data is not accessible. '358 'It returned {!r}'359 ''.format(self._get_base_error_message(),360 type(self.step.response))361 )362 self.step.test.assertIn(363 self.context_data_form_name,364 self.step.response.context_data,365 '{} did not render with {!r} in its context_data'366 ''.format(self._get_base_error_message(),367 self.context_data_form_name)368 )369 self.step.test.assertIsInstance(370 self.step.response.context_data[self.context_data_form_name].initial,371 dict,372 '{} did not render with the context_data[{!r}].initial being a dictionary'373 ''.format(self._get_base_error_message(),374 self.context_data_form_name)375 )376 if self.test_initial_value_present:377 self.step.test.assertIn(378 self.initial_data_key,379 self.step.response.context_data[self.context_data_form_name].initial.keys(),380 '{} did not render with {!r} in the context_data[{!r}].initial. '381 'Provided keys - {!r}'382 ''.format(self._get_base_error_message(),383 self.initial_data_key,384 self.context_data_form_name,385 self.step.response.context_data[self.context_data_form_name].initial.keys())386 )387 if self.test_initial_value_not_none:388 self.step.test.assertIsNotNone(389 self.step.response.context_data['form'].initial[self.initial_data_key],390 '{} rendered with {!r} for context_data[{!r}].initial[{!r}]'391 ''.format(self._get_base_error_message(),392 None,393 self.context_data_form_name,394 self.initial_data_key)395 )396 if self.test_initial_value:397 self.step.test.assertEqual(398 self.step.response.context_data['form'].initial[self.initial_data_key],399 self.expected_initial_data_value,400 '{} rendered with context_data[{!r}].initial[{!r}] = {} != {}'401 ''.format(self._get_base_error_message(),402 self.context_data_form_name,403 self.initial_data_key,404 self.step.response.context_data['form'].initial[self.initial_data_key],405 self.expected_initial_data_value)...
test_choices.py
Source:test_choices.py
...22 )))23 def test_wrong_length_tuple(self):24 with self.assertRaises(ValueError):25 Choices(('a',))26 def test_contains_value(self):27 self.assertTrue('PUBLISHED' in self.STATUS)28 self.assertTrue('DRAFT' in self.STATUS)29 def test_doesnt_contain_value(self):30 self.assertFalse('UNPUBLISHED' in self.STATUS)31 def test_deepcopy(self):32 import copy33 self.assertEqual(list(self.STATUS),34 list(copy.deepcopy(self.STATUS)))35 def test_equality(self):36 self.assertEqual(self.STATUS, Choices('DRAFT', 'PUBLISHED'))37 def test_inequality(self):38 self.assertNotEqual(self.STATUS, ['DRAFT', 'PUBLISHED'])39 self.assertNotEqual(self.STATUS, Choices('DRAFT'))40 def test_composability(self):41 self.assertEqual(Choices('DRAFT') + Choices('PUBLISHED'), self.STATUS)42 self.assertEqual(Choices('DRAFT') + ('PUBLISHED',), self.STATUS)43 self.assertEqual(('DRAFT',) + Choices('PUBLISHED'), self.STATUS)44 def test_option_groups(self):45 c = Choices(('group a', ['one', 'two']), ['group b', ('three',)])46 self.assertEqual(47 list(c),48 [49 ('group a', [('one', 'one'), ('two', 'two')]),50 ('group b', [('three', 'three')]),51 ],52 )53class LabelChoicesTests(ChoicesTests):54 def setUp(self):55 self.STATUS = Choices(56 ('DRAFT', 'is draft'),57 ('PUBLISHED', 'is published'),58 'DELETED',59 )60 def test_iteration(self):61 self.assertEqual(tuple(self.STATUS), (62 ('DRAFT', 'is draft'),63 ('PUBLISHED', 'is published'),64 ('DELETED', 'DELETED'),65 ))66 def test_reversed(self):67 self.assertEqual(tuple(reversed(self.STATUS)), (68 ('DELETED', 'DELETED'),69 ('PUBLISHED', 'is published'),70 ('DRAFT', 'is draft'),71 ))72 def test_indexing(self):73 self.assertEqual(self.STATUS['PUBLISHED'], 'is published')74 def test_default(self):75 self.assertEqual(self.STATUS.DELETED, 'DELETED')76 def test_provided(self):77 self.assertEqual(self.STATUS.DRAFT, 'DRAFT')78 def test_len(self):79 self.assertEqual(len(self.STATUS), 3)80 def test_equality(self):81 self.assertEqual(self.STATUS, Choices(82 ('DRAFT', 'is draft'),83 ('PUBLISHED', 'is published'),84 'DELETED',85 ))86 def test_inequality(self):87 self.assertNotEqual(self.STATUS, [88 ('DRAFT', 'is draft'),89 ('PUBLISHED', 'is published'),90 'DELETED'91 ])92 self.assertNotEqual(self.STATUS, Choices('DRAFT'))93 def test_repr(self):94 self.assertEqual(repr(self.STATUS), "Choices" + repr((95 ('DRAFT', 'DRAFT', 'is draft'),96 ('PUBLISHED', 'PUBLISHED', 'is published'),97 ('DELETED', 'DELETED', 'DELETED'),98 )))99 def test_contains_value(self):100 self.assertTrue('PUBLISHED' in self.STATUS)101 self.assertTrue('DRAFT' in self.STATUS)102 # This should be True, because both the display value103 # and the internal representation are both DELETED.104 self.assertTrue('DELETED' in self.STATUS)105 def test_doesnt_contain_value(self):106 self.assertFalse('UNPUBLISHED' in self.STATUS)107 def test_doesnt_contain_display_value(self):108 self.assertFalse('is draft' in self.STATUS)109 def test_composability(self):110 self.assertEqual(111 Choices(('DRAFT', 'is draft',)) + Choices(('PUBLISHED', 'is published'), 'DELETED'),112 self.STATUS113 )114 self.assertEqual(115 (('DRAFT', 'is draft',),) + Choices(('PUBLISHED', 'is published'), 'DELETED'),116 self.STATUS117 )118 self.assertEqual(119 Choices(('DRAFT', 'is draft',)) + (('PUBLISHED', 'is published'), 'DELETED'),120 self.STATUS121 )122 def test_option_groups(self):123 c = Choices(124 ('group a', [(1, 'one'), (2, 'two')]),125 ['group b', ((3, 'three'),)]126 )127 self.assertEqual(128 list(c),129 [130 ('group a', [(1, 'one'), (2, 'two')]),131 ('group b', [(3, 'three')]),132 ],133 )134class IdentifierChoicesTests(ChoicesTests):135 def setUp(self):136 self.STATUS = Choices(137 (0, 'DRAFT', 'is draft'),138 (1, 'PUBLISHED', 'is published'),139 (2, 'DELETED', 'is deleted'))140 def test_iteration(self):141 self.assertEqual(tuple(self.STATUS), (142 (0, 'is draft'),143 (1, 'is published'),144 (2, 'is deleted'),145 ))146 def test_reversed(self):147 self.assertEqual(tuple(reversed(self.STATUS)), (148 (2, 'is deleted'),149 (1, 'is published'),150 (0, 'is draft'),151 ))152 def test_indexing(self):153 self.assertEqual(self.STATUS[1], 'is published')154 def test_getattr(self):155 self.assertEqual(self.STATUS.DRAFT, 0)156 def test_len(self):157 self.assertEqual(len(self.STATUS), 3)158 def test_repr(self):159 self.assertEqual(repr(self.STATUS), "Choices" + repr((160 (0, 'DRAFT', 'is draft'),161 (1, 'PUBLISHED', 'is published'),162 (2, 'DELETED', 'is deleted'),163 )))164 def test_contains_value(self):165 self.assertTrue(0 in self.STATUS)166 self.assertTrue(1 in self.STATUS)167 self.assertTrue(2 in self.STATUS)168 def test_doesnt_contain_value(self):169 self.assertFalse(3 in self.STATUS)170 def test_doesnt_contain_display_value(self):171 self.assertFalse('is draft' in self.STATUS)172 def test_doesnt_contain_python_attr(self):173 self.assertFalse('PUBLISHED' in self.STATUS)174 def test_equality(self):175 self.assertEqual(self.STATUS, Choices(176 (0, 'DRAFT', 'is draft'),177 (1, 'PUBLISHED', 'is published'),178 (2, 'DELETED', 'is deleted')...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!