tests.unit.server_tests.test_service_info_handler   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 142
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 15
eloc 99
dl 0
loc 142
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A BaseTestServiceInfoHandler.setUpClass() 0 32 4
A TestServiceInfoHandlerWithAuth.setUpClass() 0 5 1
A BaseTestServiceInfoHandler.tearDownClass() 0 5 1
A TestServiceInfoHandlerWithAuth.test_given_server_with_auth_expect_error_info_response() 0 3 1
A BaseTestServiceInfoHandler.get_app() 0 6 3
A TestServiceInfoHandlerWithoutAuth.test_given_server_with_no_auth_and_password_expect_correct_info_response() 0 10 1
A TestServiceInfoHandlerWithoutAuth.setUpClass() 0 4 1
A TestServiceInfoHandlerWithAuth.test_given_server_with_auth_expect_correct_info_response() 0 26 1
A TestServiceInfoHandlerWithoutAuth.test_server_with_no_auth_expect_correct_info_response() 0 16 1

1 Function

Rating   Name   Duplication   Size   Complexity  
A _create_expected_info_response() 0 8 1
1
import base64
2
import json
3
import os
4
from tabpy.tabpy_server.app.app import TabPyApp
5
from tabpy.tabpy_server.app.app_parameters import SettingsParameters
6
import tempfile
7
from tornado.testing import AsyncHTTPTestCase
8
9
10
def _create_expected_info_response(settings, tabpy_state):
11
    return {
12
        "description": tabpy_state.get_description(),
13
        "creation_time": tabpy_state.creation_time,
14
        "state_path": settings["state_file_path"],
15
        "server_version": settings[SettingsParameters.ServerVersion],
16
        "name": tabpy_state.name,
17
        "versions": settings["versions"]
18
    }
19
20
21
class BaseTestServiceInfoHandler(AsyncHTTPTestCase):
22
    def get_app(self):
23
        if hasattr(self, 'config_file') and hasattr(self.config_file, 'name'):
24
            self.app = TabPyApp(self.config_file.name)
25
        else:
26
            self.app = TabPyApp()
27
        return self.app._create_tornado_web_app()
28
29
    @classmethod
30
    def tearDownClass(cls):
31
        os.remove(cls.state_file.name)
32
        os.remove(cls.config_file.name)
33
        os.rmdir(cls.state_dir)
34
35
    @classmethod
36
    def setUpClass(cls):
37
        # create state.ini dir and file
38
        cls.state_dir = tempfile.mkdtemp(prefix=cls.prefix)
39
        with open(os.path.join(cls.state_dir, "state.ini"), "w+") as cls.state_file:
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable cls does not seem to be defined.
Loading history...
40
            cls.state_file.write(
41
                "[Service Info]\n"
42
                "Name = TabPy Serve\n"
43
                "Description = \n"
44
                "Creation Time = 0\n"
45
                "Access-Control-Allow-Origin = \n"
46
                "Access-Control-Allow-Headers = \n"
47
                "Access-Control-Allow-Methods = \n"
48
                "\n"
49
                "[Query Objects Service Versions]\n"
50
                "\n"
51
                "[Query Objects Docstrings]\n"
52
                "\n"
53
                "[Meta]\n"
54
                "Revision Number = 1\n"
55
            )
56
        cls.state_file.close()
57
58
        # create config file
59
        cls.config_file = tempfile.NamedTemporaryFile(
60
            prefix=cls.prefix, suffix=".conf", delete=False, mode='w'
61
        )
62
        cls.config_file.write("[TabPy]\n")
63
        if hasattr(cls, 'tabpy_config'):
64
            for k in cls.tabpy_config:
65
                cls.config_file.write(k)
66
        cls.config_file.close()
67
68
69
class TestServiceInfoHandlerWithAuth(BaseTestServiceInfoHandler):
70
    @classmethod
71
    def setUpClass(cls):
72
        cls.prefix = "__TestServiceInfoHandlerWithAuth_"
73
        cls.tabpy_config = ["TABPY_PWD_FILE = ./tests/integration/resources/pwdfile.txt\n"]
74
        super(TestServiceInfoHandlerWithAuth, cls).setUpClass()
75
76
    def test_given_server_with_auth_expect_error_info_response(self):
77
        response = self.fetch("/info")
78
        self.assertEqual(response.code, 401)
79
80
    def test_given_server_with_auth_expect_correct_info_response(self):
81
        header = {
82
            "Content-Type": "application/json",
83
            "TabPy-Client": "Integration test for deploying models with auth",
84
            "Authorization": "Basic " +
85
            base64.b64encode("user1:P@ssw0rd".encode("utf-8")).decode("utf-8"),
86
        }
87
88
        response = self.fetch("/info", headers=header)
89
        self.assertEqual(response.code, 200)
90
        actual_response = json.loads(response.body)
91
        expected_response = _create_expected_info_response(
92
            self.app.settings, self.app.tabpy_state
93
        )
94
95
        self.assertDictEqual(actual_response, expected_response)
96
        self.assertTrue("versions" in actual_response)
97
        versions = actual_response["versions"]
98
        self.assertTrue("v1" in versions)
99
        v1 = versions["v1"]
100
        self.assertTrue("features" in v1)
101
        features = v1["features"]
102
        self.assertDictEqual(
103
            {"authentication": {"methods": {"basic-auth": {}}, "required": True},
104
                'arrow_enabled': False, 'evaluate_enabled': True, 'gzip_enabled': True},
105
                features,
106
        )
107
108
109
class TestServiceInfoHandlerWithoutAuth(BaseTestServiceInfoHandler):
110
    @classmethod
111
    def setUpClass(cls):
112
        cls.prefix = "__TestServiceInfoHandlerWithoutAuth_"
113
        super(TestServiceInfoHandlerWithoutAuth, cls).setUpClass()
114
115
    def test_server_with_no_auth_expect_correct_info_response(self):
116
        response = self.fetch("/info")
117
        self.assertEqual(response.code, 200)
118
        actual_response = json.loads(response.body)
119
        expected_response = _create_expected_info_response(
120
            self.app.settings, self.app.tabpy_state
121
        )
122
123
        self.assertDictEqual(actual_response, expected_response)
124
        self.assertTrue("versions" in actual_response)
125
        versions = actual_response["versions"]
126
        self.assertTrue("v1" in versions)
127
        v1 = versions["v1"]
128
        self.assertTrue("features" in v1)
129
        features = v1["features"]
130
        self.assertDictEqual({'arrow_enabled': False, 'evaluate_enabled': True, 'gzip_enabled': True}, features)
131
132
    def test_given_server_with_no_auth_and_password_expect_correct_info_response(self):
133
        header = {
134
            "Content-Type": "application/json",
135
            "TabPy-Client": "Integration test for deploying models with auth",
136
            "Authorization": "Basic " +
137
            base64.b64encode("user1:P@ssw0rd".encode("utf-8")).decode("utf-8"),
138
        }
139
140
        response = self.fetch("/info", headers=header)
141
        self.assertEqual(response.code, 406)
142