Exemplo n.º 1
0
 def test_no_sorting_default_to_modified_field(self):
     token = self.resource._build_pagination_token([('last_modified', -1)],
                                                   self.record,
                                                   42)
     tokeninfo = json.loads(b64decode(token).decode('ascii'))
     self.assertDictEqual(tokeninfo['last_record'],
                          {"last_modified": 1234})
Exemplo n.º 2
0
 def test_multiple_sorting_keep_all(self):
     token = self.resource._build_pagination_token(
         [("status", 1), ("title", -1), ("last_modified", -1)], self.record
     )
     self.assertEqual(
         json.loads(b64decode(token).decode("ascii")), {"last_modified": 1234, "status": 2, "title": "Title"}
     )
Exemplo n.º 3
0
    def _extract_pagination_rules_from_token(self, sorting):
        """Get pagination params."""
        queryparams = self.request.GET
        paginate_by = self.request.registry.settings['cliquet.paginate_by']
        limit = queryparams.get('_limit', paginate_by)
        if limit:
            try:
                limit = int(limit)
            except ValueError:
                error_details = {
                    'location': 'querystring',
                    'description': "_limit should be an integer"
                }
                raise_invalid(self.request, **error_details)

        # If limit is higher than paginate_by setting, ignore it.
        if limit and paginate_by:
            limit = min(limit, paginate_by)

        token = queryparams.get('_token', None)
        filters = []
        if token:
            try:
                last_record = json.loads(decode64(token))
                assert isinstance(last_record, dict)
            except (ValueError, TypeError, AssertionError):
                error_msg = '_token has invalid content'
                error_details = {
                    'location': 'querystring',
                    'description': error_msg
                }
                raise_invalid(self.request, **error_details)

            filters = self._build_pagination_rules(sorting, last_record)
        return filters, limit
Exemplo n.º 4
0
 def test_no_sorting_default_to_modified_field(self):
     token = self.resource._build_pagination_token([('last_modified', -1)],
                                                   self.record,
                                                   42)
     tokeninfo = json.loads(b64decode(token).decode('ascii'))
     self.assertDictEqual(tokeninfo['last_record'],
                          {"last_modified": 1234})
Exemplo n.º 5
0
 def test_sorting_handle_ordering_direction(self):
     token = self.resource._build_pagination_token([
         ('status', 1),
         ('last_modified', 1)
     ], self.record, 32)
     tokeninfo = json.loads(b64decode(token).decode('ascii'))
     self.assertEqual(tokeninfo['last_record'],
                      {"last_modified": 1234, "status": 2})
Exemplo n.º 6
0
 def test_sorting_handle_both_rules(self):
     token = self.resource._build_pagination_token([
         ('status', -1),
         ('last_modified', -1)
     ], self.record)
     self.assertDictEqual(
         json.loads(b64decode(token).decode('ascii')),
         {"last_modified": 1234, "status": 2})
Exemplo n.º 7
0
 def test_sorting_handle_ordering_direction(self):
     token = self.resource._build_pagination_token([
         ('status', 1),
         ('last_modified', 1)
     ], self.record, 32)
     tokeninfo = json.loads(b64decode(token).decode('ascii'))
     self.assertEqual(tokeninfo['last_record'],
                      {"last_modified": 1234, "status": 2})
Exemplo n.º 8
0
 def get(self, key):
     purge = "DELETE FROM cache WHERE ttl IS NOT NULL AND now() > ttl;"
     query = "SELECT value FROM cache WHERE key = :key;"
     with self.client.connect() as conn:
         conn.execute(purge)
         result = conn.execute(query, dict(key=key))
         if result.rowcount > 0:
             value = result.fetchone()['value']
             return json.loads(value)
Exemplo n.º 9
0
 def get(self, key):
     purge = "DELETE FROM cache WHERE ttl IS NOT NULL AND now() > ttl;"
     query = "SELECT value FROM cache WHERE key = :key;"
     with self.client.connect() as conn:
         conn.execute(purge)
         result = conn.execute(query, dict(key=self.prefix + key))
         if result.rowcount > 0:
             value = result.fetchone()['value']
             return json.loads(value)
Exemplo n.º 10
0
 def get(self, key):
     purge = "DELETE FROM cache WHERE ttl IS NOT NULL AND now() > ttl;"
     query = "SELECT value FROM cache WHERE key = %s;"
     with self.connect() as cursor:
         cursor.execute(purge)
         cursor.execute(query, (key,))
         if cursor.rowcount > 0:
             value = cursor.fetchone()['value']
             return json.loads(value)
Exemplo n.º 11
0
 def test_multiple_sorting_keep_all(self):
     token = self.resource._build_pagination_token([
         ('status', 1),
         ('title', -1),
         ('last_modified', -1)
     ], self.record)
     self.assertEqual(
         json.loads(b64decode(token).decode('ascii')),
         {"last_modified": 1234, "status": 2, 'title': 'Title'})
Exemplo n.º 12
0
 def test_multiple_sorting_keep_all(self):
     token = self.resource._build_pagination_token([
         ('status', 1),
         ('title', -1),
         ('last_modified', -1)
     ], self.record, 31)
     tokeninfo = json.loads(b64decode(token).decode('ascii'))
     self.assertEqual(tokeninfo['last_record'],
                      {"last_modified": 1234, "status": 2,
                       'title': 'Title'})
Exemplo n.º 13
0
    def test_standard_entries_are_filled(self):
        with mock.patch('cliquet.utils.msec_time', return_value=12):
            value = self.renderer(self.logger, 'debug', {})

        log = json.loads(value)
        self.assertDictEqual(log, {
            'EnvVersion': '2.0',
            'Hostname': os.uname()[1],
            'Logger': '',
            'Pid': os.getpid(),
            'Severity': 7,
            'Timestamp': 12000000,
            'Type': '',
            'Fields': {}
        })
Exemplo n.º 14
0
    def test_standard_entries_are_filled(self):
        with mock.patch('cliquet.utils.msec_time', return_value=12):
            value = self.renderer(self.logger, 'debug', {})

        log = json.loads(value)
        self.assertDictEqual(
            log, {
                'EnvVersion': '2.0',
                'Hostname': os.uname()[1],
                'Logger': '',
                'Pid': os.getpid(),
                'Severity': 7,
                'Timestamp': 12000000,
                'Type': '',
                'Fields': {}
            })
Exemplo n.º 15
0
    def test_standard_entries_are_filled(self):
        with mock.patch("cliquet.utils.msec_time", return_value=12):
            value = self.renderer(self.logger, "debug", {})

        log = json.loads(value)
        self.assertDictEqual(
            log,
            {
                "EnvVersion": "2.0",
                "Hostname": os.uname()[1],
                "Logger": "",
                "Pid": os.getpid(),
                "Severity": 7,
                "Timestamp": 12000000,
                "Type": "",
                "Fields": {},
            },
        )
Exemplo n.º 16
0
    def test_returns_alert_if_eos_in_the_future(self):
        # Set an end of service date in the future.
        tomorrow = datetime.datetime.now() + datetime.timedelta(days=1)
        with mock.patch.dict(self.app.app.registry.settings, [
                             ('eos', tomorrow.isoformat()),
                             ('eos_url', 'http://eos-url'),
                             ('eos_message',
                              'This service will soon be decommissioned')]):
            response = self.app.get('/')

            # Requests should work as usual and contain an
            # Alert header, with the service end of life information.
            self.assertIn('Alert', response.headers)
            self.assertDictEqual(json.loads(response.headers['Alert']), {
                'code': 'soft-eol',
                'url': 'http://eos-url',
                'message': 'This service will soon be decommissioned'
            })
Exemplo n.º 17
0
    def _extract_pagination_rules_from_token(self, limit, sorting):
        """Get pagination params."""
        queryparams = self.request.GET
        token = queryparams.get('_token', None)
        filters = []
        if token:
            try:
                last_record = json.loads(decode64(token))
                assert isinstance(last_record, dict)
            except (ValueError, TypeError, AssertionError):
                error_msg = '_token has invalid content'
                error_details = {
                    'location': 'querystring',
                    'description': error_msg
                }
                raise_invalid(self.request, **error_details)

            filters = self._build_pagination_rules(sorting, last_record)
        return filters
Exemplo n.º 18
0
 def test_returns_410_if_eos_in_the_past(self):
     # Set an end of service date in the past.
     yesterday = datetime.datetime.now() - datetime.timedelta(days=1)
     with mock.patch.dict(self.app.app.registry.settings, [
                          ('eos', yesterday.isoformat()),
                          ('eos_url', 'http://eos-url'),
                          ('eos_message',
                           'This service had been decommissioned')]):
         response = self.app.get('/', status=410)
         self.assertIn('Alert', response.headers)
         self.assertDictEqual(json.loads(response.headers['Alert']), {
             'code': 'hard-eol',
             'url': 'http://eos-url',
             'message': 'This service had been decommissioned'
         })
         self.assertDictEqual(response.json, {
             "errno": ERRORS.SERVICE_DEPRECATED.value,
             "message": "The service you are trying to connect no longer "
                        "exists at this location.",
             "code": 410,
             "error": "Gone"
         })
Exemplo n.º 19
0
    def _extract_pagination_rules_from_token(self, limit, sorting):
        """Get pagination params."""
        queryparams = self.request.GET
        token = queryparams.get('_token', None)
        filters = []
        offset = 0
        if token:
            try:
                tokeninfo = json.loads(decode64(token))
                if not isinstance(tokeninfo, dict):
                    raise ValueError()
                last_record = tokeninfo['last_record']
                offset = tokeninfo['offset']
            except (ValueError, KeyError, TypeError):
                error_msg = '_token has invalid content'
                error_details = {
                    'location': 'querystring',
                    'description': error_msg
                }
                raise_invalid(self.request, **error_details)

            filters = self._build_pagination_rules(sorting, last_record)
        return filters, offset
Exemplo n.º 20
0
    def _extract_pagination_rules_from_token(self, limit, sorting):
        """Get pagination params."""
        queryparams = self.request.GET
        token = queryparams.get('_token', None)
        filters = []
        offset = 0
        if token:
            try:
                tokeninfo = json.loads(decode64(token))
                if not isinstance(tokeninfo, dict):
                    raise ValueError()
                last_record = tokeninfo['last_record']
                offset = tokeninfo['offset']
            except (ValueError, KeyError, TypeError):
                error_msg = '_token has invalid content'
                error_details = {
                    'location': 'querystring',
                    'description': error_msg
                }
                raise_invalid(self.request, **error_details)

            filters = self._build_pagination_rules(sorting, last_record)
        return filters, offset
Exemplo n.º 21
0
 def test_objects_values_are_serialized_as_string(self):
     querystring = {"_sort": "name"}
     logged = self.renderer(self.logger, "info", {"params": querystring})
     log = json.loads(logged)
     self.assertEqual(log["Fields"]["params"], json.dumps(querystring))
Exemplo n.º 22
0
 def test_fields_can_be_provided_directly(self):
     value = self.renderer(self.logger, "critical", {"Fields": {"win": 11}})
     log = json.loads(value)
     self.assertEqual(log["Fields"], {"win": 11})
Exemplo n.º 23
0
 def test_unknown_fields_are_moved_to_fields_entry(self):
     value = self.renderer(self.logger, 'critical', {'win': 11})
     log = json.loads(value)
     self.assertEqual(log['Fields'], {'win': 11})
Exemplo n.º 24
0
 def test_severity_comes_from_logger_name(self):
     value = self.renderer(self.logger, 'critical', {})
     log = json.loads(value)
     self.assertEqual(log['Severity'], 0)
Exemplo n.º 25
0
 def test_standard_entries_are_not_overwritten(self):
     value = self.renderer(self.logger, 'debug', {'Hostname': 'her'})
     log = json.loads(value)
     self.assertEqual(log['Hostname'], 'her')
Exemplo n.º 26
0
 def test_standard_entries_are_not_overwritten(self):
     value = self.renderer(self.logger, 'debug', {'Hostname': 'her'})
     log = json.loads(value)
     self.assertEqual(log['Hostname'], 'her')
Exemplo n.º 27
0
 def test_list_of_homogeneous_values_are_serialized_as_string(self):
     list_values = ['life', 'of', 'pi', 3.14]
     logged = self.renderer(self.logger, 'info', {'params': list_values})
     log = json.loads(logged)
     self.assertEqual(log['Fields']['params'], json.dumps(list_values))
Exemplo n.º 28
0
 def test_list_of_string_values_are_not_serialized(self):
     list_values = ['life', 'of', 'pi']
     logged = self.renderer(self.logger, 'info', {'params': list_values})
     log = json.loads(logged)
     self.assertEqual(log['Fields']['params'], list_values)
Exemplo n.º 29
0
 def test_list_of_homogeneous_values_are_serialized_as_string(self):
     list_values = ["life", "of", "pi", 3.14]
     logged = self.renderer(self.logger, "info", {"params": list_values})
     log = json.loads(logged)
     self.assertEqual(log["Fields"]["params"], json.dumps(list_values))
Exemplo n.º 30
0
 def test_fields_can_be_provided_directly(self):
     value = self.renderer(self.logger, 'critical', {'Fields': {'win': 11}})
     log = json.loads(value)
     self.assertEqual(log['Fields'], {'win': 11})
Exemplo n.º 31
0
 def test_list_of_string_values_are_not_serialized(self):
     list_values = ["life", "of", "pi"]
     logged = self.renderer(self.logger, "info", {"params": list_values})
     log = json.loads(logged)
     self.assertEqual(log["Fields"]["params"], list_values)
Exemplo n.º 32
0
 def test_list_of_homogeneous_values_are_serialized_as_string(self):
     list_values = ['life', 'of', 'pi', 3.14]
     logged = self.renderer(self.logger, 'info', {'params': list_values})
     log = json.loads(logged)
     self.assertEqual(log['Fields']['params'], json.dumps(list_values))
Exemplo n.º 33
0
 def test_fields_can_be_provided_directly(self):
     value = self.renderer(self.logger, 'critical', {'Fields': {'win': 11}})
     log = json.loads(value)
     self.assertEqual(log['Fields'], {'win': 11})
Exemplo n.º 34
0
 def get(self, key):
     value = self._client.get(self.prefix + key)
     if value:
         value = value.decode('utf-8')
         return json.loads(value)
Exemplo n.º 35
0
 def test_type_comes_from_structlog_event(self):
     value = self.renderer(self.logger, 'debug', {'event': 'booh'})
     log = json.loads(value)
     self.assertEqual(log['Type'], 'booh')
Exemplo n.º 36
0
 def test_objects_values_are_serialized_as_string(self):
     querystring = {'_sort': 'name'}
     logged = self.renderer(self.logger, 'info', {'params': querystring})
     log = json.loads(logged)
     self.assertEqual(log['Fields']['params'], json.dumps(querystring))
Exemplo n.º 37
0
 def test_unknown_fields_are_moved_to_fields_entry(self):
     value = self.renderer(self.logger, 'critical', {'win': 11})
     log = json.loads(value)
     self.assertEqual(log['Fields'], {'win': 11})
Exemplo n.º 38
0
 def test_type_comes_from_structlog_event(self):
     value = self.renderer(self.logger, 'debug', {'event': 'booh'})
     log = json.loads(value)
     self.assertEqual(log['Type'], 'booh')
Exemplo n.º 39
0
 def test_objects_values_are_serialized_as_string(self):
     querystring = {'_sort': 'name'}
     logged = self.renderer(self.logger, 'info', {'params': querystring})
     log = json.loads(logged)
     self.assertEqual(log['Fields']['params'], json.dumps(querystring))
Exemplo n.º 40
0
 def test_standard_entries_are_not_overwritten(self):
     value = self.renderer(self.logger, "debug", {"Hostname": "her"})
     log = json.loads(value)
     self.assertEqual(log["Hostname"], "her")
Exemplo n.º 41
0
 def test_list_of_string_values_are_not_serialized(self):
     list_values = ['life', 'of', 'pi']
     logged = self.renderer(self.logger, 'info', {'params': list_values})
     log = json.loads(logged)
     self.assertEqual(log['Fields']['params'], list_values)
Exemplo n.º 42
0
 def test_type_comes_from_structlog_event(self):
     value = self.renderer(self.logger, "debug", {"event": "booh"})
     log = json.loads(value)
     self.assertEqual(log["Type"], "booh")
Exemplo n.º 43
0
 def test_token_contains_current_offset(self):
     token = self.resource._build_pagination_token([('last_modified', -1)],
                                                   self.record,
                                                   42)
     tokeninfo = json.loads(b64decode(token).decode('ascii'))
     self.assertEqual(tokeninfo['offset'], 42)
Exemplo n.º 44
0
 def test_unknown_fields_are_moved_to_fields_entry(self):
     value = self.renderer(self.logger, "critical", {"win": 11})
     log = json.loads(value)
     self.assertEqual(log["Fields"], {"win": 11})
Exemplo n.º 45
0
 def test_token_contains_current_offset(self):
     token = self.resource._build_pagination_token([('last_modified', -1)],
                                                   self.record,
                                                   42)
     tokeninfo = json.loads(b64decode(token).decode('ascii'))
     self.assertEqual(tokeninfo['offset'], 42)
Exemplo n.º 46
0
 def test_severity_comes_from_logger_name(self):
     value = self.renderer(self.logger, 'critical', {})
     log = json.loads(value)
     self.assertEqual(log['Severity'], 0)