def test_ignore_post_save_signal(self):
        resource = ResourceFactory()
        DatasetFactory(resources=[resource])
        unexpected_signals = Dataset.after_save, Dataset.on_update

        with assert_not_emit(*unexpected_signals), assert_emit(post_save):
            resource.title = 'New title'
            resource.save(signal_kwargs={'ignores': ['post_save']})
Example #2
0
    def test_ignore_post_save_signal(self):
        resource = ResourceFactory()
        DatasetFactory(resources=[resource])
        unexpected_signals = Dataset.after_save, Dataset.on_update

        with assert_not_emit(*unexpected_signals), assert_emit(post_save):
            resource.title = 'New title'
            resource.save(signal_kwargs={'ignores': ['post_save']})
Example #3
0
    def test_ignore_post_save_signal(self):
        resource = ResourceFactory()
        # assigning to a variable to avoid garbage collection issue
        _ = DatasetFactory(resources=[resource])
        unexpected_signals = Dataset.after_save, Dataset.on_update

        with assert_not_emit(*unexpected_signals), assert_emit(post_save):
            resource.title = 'New title'
            resource.save(signal_kwargs={'ignores': ['post_save']})
Example #4
0
class LinkcheckerTest(TestCase):
    settings = LinkcheckerTestSettings

    def setUp(self):
        self.resource = ResourceFactory()
        self.dataset = DatasetFactory(resources=[self.resource])

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_no_linkchecker(self, mock_fn):
        mock_fn.return_value = None
        res = check_resource(self.resource)
        self.assertEqual(res, ({'error': 'No linkchecker configured.'}, 503))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_ok(self, mock_fn):
        check_res = {'check:status': 200, 'check:available': True,
                     'check:date': datetime.now()}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        self.assertEqual(res, check_res)
        check_res.update({'check:count-availability': 1})
        self.assertEqual(self.resource.extras, check_res)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_filter_result(self, mock_fn):
        check_res = {'check:status': 200, 'dummy': 'dummy'}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        self.assertEqual(res, check_res)
        self.assertNotIn('dummy', self.resource.extras)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_no_status(self, mock_fn):
        class DummyLinkchecker:
            def check(self, _):
                return {'check:available': True}
        mock_fn.return_value = DummyLinkchecker
        res = check_resource(self.resource)
        self.assertEqual(res,
                          ({'error': 'No status in response from linkchecker'},
                           503))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_check_error(self, mock_fn):
        class DummyLinkchecker:
            def check(self, _):
                return {'check:error': 'ERROR'}
        mock_fn.return_value = DummyLinkchecker
        res = check_resource(self.resource)
        self.assertEqual(res, ({'error': 'ERROR'}, 500))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_in_resource(self, mock_fn):
        self.resource.extras['check:checker'] = 'another_linkchecker'
        self.resource.save()
        check_resource(self.resource)
        args, kwargs = mock_fn.call_args
        self.assertEqual(args, ('another_linkchecker', ))

    def test_check_resource_linkchecker_no_check(self):
        self.resource.extras['check:checker'] = 'no_check'
        self.resource.save()
        res = check_resource(self.resource)
        self.assertEqual(res.get('check:status'), 204)
        self.assertEqual(res.get('check:available'), True)

    def test_check_resource_ignored_domain(self):
        self.resource.extras = {}
        self.resource.url = 'http://example-ignore.com/url'
        self.resource.save()
        res = check_resource(self.resource)
        self.assertEqual(res.get('check:status'), 204)
        self.assertEqual(res.get('check:available'), True)

    def test_is_need_check(self):
        self.resource.extras = {'check:available': True,
                                'check:date': datetime.now(),
                                'check:status': 42}
        self.assertFalse(self.resource.need_check())

    def test_is_need_check_unknown_status(self):
        self.resource.extras = {}
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_cache_expired(self):
        self.resource.extras = {
            'check:available': True,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_date_string(self):
        check_date = (datetime.now() - timedelta(seconds=3600)).isoformat()
        self.resource.extras = {
            'check:available': True,
            'check:date': check_date,
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_wrong_check_date(self):
        check_date = '123azerty'
        self.resource.extras = {
            'check:available': True,
            'check:date': check_date,
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_wrong_check_date_int(self):
        check_date = 42
        self.resource.extras = {
            'check:available': True,
            'check:date': check_date,
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_count_availability(self):
        self.resource.extras = {
            # should need a new check after 100 * 30s = 3000s < 3600s
            'check:count-availability': 100,
            'check:available': True,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_count_availability_expired(self):
        self.resource.extras = {
            # should need a new check after 150 * 30s = 4500s > 3600s
            'check:count-availability': 150,
            'check:available': True,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertFalse(self.resource.need_check())

    def test_is_need_check_count_availability_unavailable(self):
        self.resource.extras = {
            # should need a new check after 30s < 3600S
            # count-availability is below threshold
            'check:count-availability': 95,
            'check:available': False,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_count_availability_increment(self, mock_fn):
        check_res = {'check:status': 200, 'check:available': True,
                     'check:date': datetime.now()}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        check_resource(self.resource)
        self.assertEqual(self.resource.extras['check:count-availability'], 1)

        check_resource(self.resource)
        self.assertEqual(self.resource.extras['check:count-availability'], 2)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_count_availability_reset(self, mock_fn):
        self.resource.extras = {'check:status': 200, 'check:available': True,
                                'check:date': datetime.now(),
                                'check:count-availability': 2}
        check_res = {'check:status': 200, 'check:available': False,
                     'check:date': datetime.now()}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        check_resource(self.resource)
        self.assertEqual(self.resource.extras['check:count-availability'], 1)

    def test_count_availability_threshold(self):
        self.resource.extras = {
            'check:status': 404,
            'check:available': False,
            # if it weren't above threshold, should need check (>30s)
            # and we're still below max_cache 101 * 0.5 < 100
            'check:date': datetime.now() - timedelta(seconds=60),
            'check:count-availability': 101
        }
        self.assertFalse(self.resource.need_check())

    def test_count_availability_max_cache_duration(self):
        self.resource.extras = {
            'check:status': 200,
            'check:available': True,
            # next check should be at 300 * 0.5 = 150min
            # but we are above max cache duration 150min > 100min
            # and 120m > 100 min so we should need a new check
            'check:date': datetime.now() - timedelta(minutes=120),
            'check:count-availability': 300
        }
        self.assertTrue(self.resource.need_check())
Example #5
0
class LinkcheckerTest(TestCase):
    settings = LinkcheckerTestSettings

    def setUp(self):
        self.resource = ResourceFactory()
        self.dataset = DatasetFactory(resources=[self.resource])

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_no_linkchecker(self, mock_fn):
        mock_fn.return_value = None
        res = check_resource(self.resource)
        self.assertEquals(res, ({'error': 'No linkchecker configured.'}, 503))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_ok(self, mock_fn):
        check_res = {'check:status': 200, 'check:available': True,
                     'check:date': datetime.now()}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        self.assertEquals(res, check_res)
        check_res.update({'check:count-availability': 1})
        self.assertEquals(self.resource.extras, check_res)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_filter_result(self, mock_fn):
        check_res = {'check:status': 200, 'dummy': 'dummy'}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        self.assertEquals(res, check_res)
        self.assertNotIn('dummy', self.resource.extras)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_no_status(self, mock_fn):
        class DummyLinkchecker:
            def check(self, _):
                return {'check:available': True}
        mock_fn.return_value = DummyLinkchecker
        res = check_resource(self.resource)
        self.assertEquals(res,
                          ({'error': 'No status in response from linkchecker'},
                           503))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_check_error(self, mock_fn):
        class DummyLinkchecker:
            def check(self, _):
                return {'check:error': 'ERROR'}
        mock_fn.return_value = DummyLinkchecker
        res = check_resource(self.resource)
        self.assertEquals(res, ({'error': 'ERROR'}, 500))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_in_resource(self, mock_fn):
        self.resource.extras['check:checker'] = 'another_linkchecker'
        self.resource.save()
        check_resource(self.resource)
        args, kwargs = mock_fn.call_args
        self.assertEquals(args, ('another_linkchecker', ))

    def test_check_resource_linkchecker_no_check(self):
        self.resource.extras['check:checker'] = 'no_check'
        self.resource.save()
        res = check_resource(self.resource)
        self.assertEquals(res.get('check:status'), 204)
        self.assertEquals(res.get('check:available'), True)

    def test_check_resource_ignored_domain(self):
        self.resource.extras = {}
        self.resource.url = 'http://example-ignore.com/url'
        self.resource.save()
        res = check_resource(self.resource)
        self.assertEquals(res.get('check:status'), 204)
        self.assertEquals(res.get('check:available'), True)

    def test_is_need_check(self):
        self.resource.extras = {'check:available': True,
                                'check:date': datetime.now(),
                                'check:status': 42}
        self.assertFalse(self.resource.need_check())

    def test_is_need_check_unknown_status(self):
        self.resource.extras = {}
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_cache_expired(self):
        self.resource.extras = {
            'check:available': True,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_date_string(self):
        check_date = (datetime.now() - timedelta(seconds=3600)).isoformat()
        self.resource.extras = {
            'check:available': True,
            'check:date': check_date,
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_wrong_check_date(self):
        check_date = '123azerty'
        self.resource.extras = {
            'check:available': True,
            'check:date': check_date,
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_wrong_check_date_int(self):
        check_date = 42
        self.resource.extras = {
            'check:available': True,
            'check:date': check_date,
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_count_availability(self):
        self.resource.extras = {
            # should need a new check after 100 * 30s = 3000s < 3600s
            'check:count-availability': 100,
            'check:available': True,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    def test_is_need_check_count_availability_expired(self):
        self.resource.extras = {
            # should need a new check after 150 * 30s = 4500s > 3600s
            'check:count-availability': 150,
            'check:available': True,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertFalse(self.resource.need_check())

    def test_is_need_check_count_availability_unavailable(self):
        self.resource.extras = {
            # should need a new check after 30s < 3600S
            # count-availability is below threshold
            'check:count-availability': 95,
            'check:available': False,
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }
        self.assertTrue(self.resource.need_check())

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_count_availability_increment(self, mock_fn):
        check_res = {'check:status': 200, 'check:available': True,
                     'check:date': datetime.now()}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        check_resource(self.resource)
        self.assertEquals(self.resource.extras['check:count-availability'], 1)

        check_resource(self.resource)
        self.assertEquals(self.resource.extras['check:count-availability'], 2)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_count_availability_reset(self, mock_fn):
        self.resource.extras = {'check:status': 200, 'check:available': True,
                                'check:date': datetime.now(),
                                'check:count-availability': 2}
        check_res = {'check:status': 200, 'check:available': False,
                     'check:date': datetime.now()}

        class DummyLinkchecker:
            def check(self, _):
                return check_res
        mock_fn.return_value = DummyLinkchecker

        check_resource(self.resource)
        self.assertEquals(self.resource.extras['check:count-availability'], 1)

    def test_count_availability_threshold(self):
        self.resource.extras = {
            'check:status': 404,
            'check:available': False,
            # if it weren't above threshold, should need check (>30s)
            # and we're still below max_cache 101 * 0.5 < 100
            'check:date': datetime.now() - timedelta(seconds=60),
            'check:count-availability': 101
        }
        self.assertFalse(self.resource.need_check())

    def test_count_availability_max_cache_duration(self):
        self.resource.extras = {
            'check:status': 200,
            'check:available': True,
            # next check should be at 300 * 0.5 = 150min
            # but we are above max cache duration 150min > 100min
            # and 120m > 100 min so we should need a new check
            'check:date': datetime.now() - timedelta(minutes=120),
            'check:count-availability': 300
        }
        self.assertTrue(self.resource.need_check())
Example #6
0
class LinkcheckerTest(TestCase):
    settings = LinkcheckerTestSettings

    def setUp(self):
        super(LinkcheckerTest, self).setUp()
        self.resource = ResourceFactory()
        self.dataset = DatasetFactory(resources=[self.resource])

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_no_linkchecker(self, mock_fn):
        mock_fn.return_value = None
        res = check_resource(self.resource)
        self.assertEquals(res, ({'error': 'No linkchecker configured.'}, 503))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_ok(self, mock_fn):
        check_res = {
            'check:status': 200,
            'check:available': True,
            'check:date': datetime.now()
        }

        class DummyLinkchecker:
            def check(self, _):
                return check_res

        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        self.assertEquals(res, check_res)
        self.assertEquals(self.resource.extras, check_res)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_filter_result(self, mock_fn):
        check_res = {'check:status': 200, 'dummy': 'dummy'}

        class DummyLinkchecker:
            def check(self, _):
                return check_res

        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        self.assertEquals(res, check_res)
        self.assertEquals(self.resource.extras, {'check:status': 200})

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_no_status(self, mock_fn):
        class DummyLinkchecker:
            def check(self, _):
                return {'check:available': True}

        mock_fn.return_value = DummyLinkchecker
        res = check_resource(self.resource)
        self.assertEquals(res,
                          ({
                              'error': 'No status in response from linkchecker'
                          }, 503))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_check_error(self, mock_fn):
        class DummyLinkchecker:
            def check(self, _):
                return {'check:error': 'ERROR'}

        mock_fn.return_value = DummyLinkchecker
        res = check_resource(self.resource)
        self.assertEquals(res, ({'error': 'ERROR'}, 500))

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_check_resource_linkchecker_in_resource(self, mock_fn):
        self.resource.extras['check:checker'] = 'another_linkchecker'
        self.resource.save()
        check_resource(self.resource)
        args, kwargs = mock_fn.call_args
        self.assertEquals(args, ('another_linkchecker', ))

    def test_check_resource_linkchecker_no_check(self):
        self.resource.extras['check:checker'] = 'no_check'
        self.resource.save()
        res = check_resource(self.resource)
        self.assertEquals(res.get('check:status'), 204)
        self.assertEquals(res.get('check:available'), True)

    def test_check_resource_ignored_domain(self):
        self.resource.extras = {}
        self.resource.url = 'http://example-ignore.com/url'
        self.resource.save()
        res = check_resource(self.resource)
        self.assertEquals(res.get('check:status'), 204)
        self.assertEquals(res.get('check:available'), True)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_valid_cache(self, mock_fn):
        self.resource.extras = {
            'check:date': datetime.now(),
            'check:status': 42
        }

        check_res = {
            'check:status': 200,
            'check:available': True,
            'check:date': datetime.now()
        }

        class DummyLinkchecker:
            def check(self, _):
                return check_res

        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        # we get the result from cache and not from DummyLinkchecker
        self.assertEquals(res, self.resource.extras)

    @mock.patch('udata.linkchecker.checker.get_linkchecker')
    def test_unvalid_cache(self, mock_fn):
        self.resource.extras = {
            'check:date': datetime.now() - timedelta(seconds=3600),
            'check:status': 42
        }

        check_res = {
            'check:status': 200,
            'check:available': True,
            'check:date': datetime.now()
        }

        class DummyLinkchecker:
            def check(self, _):
                return check_res

        mock_fn.return_value = DummyLinkchecker

        res = check_resource(self.resource)
        # we get the result from DummyLinkchecker and not from cache
        self.assertEquals(res, check_res)