Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
hub-client / tests / telemetry / test_middleware.py
Size: Mime:
# Copyright 2015 Docker, Inc. All rights reserved.

import mock
import time

from django.contrib.auth.models import AnonymousUser
from django.http import HttpResponse, Http404
from django.test import TestCase, RequestFactory

from dockerhub.telemetry.middleware import TimingRequestMiddleware


def dummy_func():
    return


class TimingRequestMiddlewareTestCase(TestCase):
    """Tests for the ``TimingRequestMiddleware`` middleware."""

    def test_view_processing(self):
        req = RequestFactory().get('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        mware.process_view(req, dummy_func, 'view_args', 'view_kwargs')
        # we expect that '.' in module.view will be replaced with '-'
        self.assertIn('tests-telemetry-test_middleware-dummy_func', req._view_name)
        self.assertIsNotNone(req._start_time)

    def test_get(self):
        req = RequestFactory().get('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        mware.process_view(req, dummy_func, 'view_args', 'view_kwargs')
        tags, _ = mware.record_time(req)
        self.assertIn('method:GET', tags)
        self.assertIn('view:tests-telemetry-test_middleware-dummy_func', tags)

    def test_post(self):
        req = RequestFactory().post('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        mware.process_view(req, dummy_func, 'view_args', 'view_kwargs')
        tags, _ = mware.record_time(req)
        self.assertIn('method:POST', tags)
        self.assertIn('view:tests-telemetry-test_middleware-dummy_func', tags)

    def test_timing(self):
        req = RequestFactory().post('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        mware.process_view(req, dummy_func, 'view_args', 'view_kwargs')
        time.sleep(.5)
        _, timing = mware.record_time(req)
        self.assertGreater(timing, 500.00)

    def test_without_start(self):
        req = RequestFactory().post('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        resp = mware.record_time(req)
        self.assertIsNone(resp)

    @mock.patch('dockerhub.telemetry.middleware.statsd', autospec=True)
    def test_status_incr(self, statsd):
        req = RequestFactory().get('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        mware.process_view(req, dummy_func, 'view_args', 'view_kwargs')
        resp = HttpResponse()
        mware.process_response(req, resp)
        expected_metric = 'request_status_code'
        expected_tags = ['view:tests-telemetry-test_middleware-dummy_func', 'method:GET',
                         'status_code:200']
        statsd.increment.assert_called_once_with(expected_metric, tags=expected_tags)

    @mock.patch('dockerhub.telemetry.middleware.statsd', autospec=True)
    def test_status_exception(self, statsd):
        req = RequestFactory().get('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        mware.process_view(req, dummy_func, 'view_args', 'view_kwargs')
        mware.process_exception(req, RuntimeError())
        expected_metric = 'request_status_code'
        expected_tags = ['view:tests-telemetry-test_middleware-dummy_func', 'method:GET',
                         'status_code:500']
        statsd.increment.assert_called_once_with(expected_metric, tags=expected_tags)

    @mock.patch('dockerhub.telemetry.middleware.statsd', autospec=True)
    def test_status_404_exception(self, statsd):
        req = RequestFactory().get('/')
        req.user = AnonymousUser()
        mware = TimingRequestMiddleware()
        mware.process_view(req, dummy_func, 'view_args', 'view_kwargs')
        mware.process_exception(req, Http404())
        # increment should not be called for a 404
        self.assertFalse(statsd.increment.called)