Passed
Push — master ( 53016e...38fde4 )
by Oleksandr
02:52
created

server_tests.test_service_info_handler   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 187
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 14
eloc 117
dl 0
loc 187
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A test_service_info_handler.TestServiceInfoHandlerDefault.get_app() 0 3 1
A test_service_info_handler.TestServiceInfoHandlerDefault.test_given_vanilla_tabpy_server_expect_correct_info_response() 0 9 1
A test_service_info_handler.TestServiceInfoHandlerWithoutAuth.tearDownClass() 0 5 1
A test_service_info_handler.TestServiceInfoHandlerWithAuth.test_given_tabpy_server_with_auth_expect_correct_info_response() 0 18 1
A test_service_info_handler.TestServiceInfoHandlerWithoutAuth.test_tabpy_server_with_no_auth_expect_correct_info_response() 0 16 1
A test_service_info_handler.TestServiceInfoHandlerWithAuth.get_app() 0 3 1
A test_service_info_handler.TestServiceInfoHandlerWithoutAuth.setUpClass() 0 31 2
A test_service_info_handler.TestServiceInfoHandlerWithoutAuth.get_app() 0 3 1
A test_service_info_handler.TestServiceInfoHandlerWithAuth.setUpClass() 0 44 1
A test_service_info_handler.TestServiceInfoHandlerWithAuth.tearDownClass() 0 6 1

1 Function

Rating   Name   Duplication   Size   Complexity  
A test_service_info_handler._create_expected_info_response() 0 8 1
1
import json
2
import os
3
from tabpy.tabpy_server.app.app import TabPyApp
4
from tabpy.tabpy_server.app.SettingsParameters import SettingsParameters
5
import tempfile
6
from tornado.testing import AsyncHTTPTestCase
7
8
9
def _create_expected_info_response(settings, tabpy_state):
10
    return {
11
        "description": tabpy_state.get_description(),
12
        "creation_time": tabpy_state.creation_time,
13
        "state_path": settings["state_file_path"],
14
        "server_version": settings[SettingsParameters.ServerVersion],
15
        "name": tabpy_state.name,
16
        "versions": settings["versions"],
17
    }
18
19
20
class TestServiceInfoHandlerDefault(AsyncHTTPTestCase):
21
    def get_app(self):
22
        self.app = TabPyApp()
23
        return self.app._create_tornado_web_app()
24
25
    def test_given_vanilla_tabpy_server_expect_correct_info_response(self):
26
        response = self.fetch("/info")
27
        self.assertEqual(response.code, 200)
28
        actual_response = json.loads(response.body)
29
        expected_response = _create_expected_info_response(
30
            self.app.settings, self.app.tabpy_state
31
        )
32
33
        self.assertDictEqual(actual_response, expected_response)
34
35
36
class TestServiceInfoHandlerWithAuth(AsyncHTTPTestCase):
37
    @classmethod
38
    def setUpClass(cls):
39
        prefix = "__TestServiceInfoHandlerWithAuth_"
40
        # create password file
41
        cls.pwd_file = tempfile.NamedTemporaryFile(
42
            prefix=prefix, suffix=".txt", delete=False
43
        )
44
        cls.pwd_file.write(b"username password")
45
        cls.pwd_file.close()
46
47
        # create state.ini dir and file
48
        cls.state_dir = tempfile.mkdtemp(prefix=prefix)
49
        cls.state_file = open(os.path.join(cls.state_dir, "state.ini"), "w+")
50
        cls.state_file.write(
51
            "[Service Info]\n"
52
            "Name = TabPy Serve\n"
53
            "Description = \n"
54
            "Creation Time = 0\n"
55
            "Access-Control-Allow-Origin = \n"
56
            "Access-Control-Allow-Headers = \n"
57
            "Access-Control-Allow-Methods = \n"
58
            "\n"
59
            "[Query Objects Service Versions]\n"
60
            "\n"
61
            "[Query Objects Docstrings]\n"
62
            "\n"
63
            "[Meta]\n"
64
            "Revision Number = 1\n"
65
        )
66
        cls.state_file.close()
67
68
        # create config file
69
        cls.config_file = tempfile.NamedTemporaryFile(
70
            prefix=prefix, suffix=".conf", delete=False
71
        )
72
        cls.config_file.write(
73
            bytes(
74
                "[TabPy]\n"
75
                f"TABPY_PWD_FILE = {cls.pwd_file.name}\n"
76
                f"TABPY_STATE_PATH = {cls.state_dir}",
77
                "utf-8",
78
            )
79
        )
80
        cls.config_file.close()
81
82
    @classmethod
83
    def tearDownClass(cls):
84
        os.remove(cls.pwd_file.name)
85
        os.remove(cls.state_file.name)
86
        os.remove(cls.config_file.name)
87
        os.rmdir(cls.state_dir)
88
89
    def get_app(self):
90
        self.app = TabPyApp(self.config_file.name)
91
        return self.app._create_tornado_web_app()
92
93
    def test_given_tabpy_server_with_auth_expect_correct_info_response(self):
94
        response = self.fetch("/info")
95
        self.assertEqual(response.code, 200)
96
        actual_response = json.loads(response.body)
97
        expected_response = _create_expected_info_response(
98
            self.app.settings, self.app.tabpy_state
99
        )
100
101
        self.assertDictEqual(actual_response, expected_response)
102
        self.assertTrue("versions" in actual_response)
103
        versions = actual_response["versions"]
104
        self.assertTrue("v1" in versions)
105
        v1 = versions["v1"]
106
        self.assertTrue("features" in v1)
107
        features = v1["features"]
108
        self.assertDictEqual(
109
            {"authentication": {"methods": {"basic-auth": {}}, "required": True}},
110
            features,
111
        )
112
113
114
class TestServiceInfoHandlerWithoutAuth(AsyncHTTPTestCase):
115
    @classmethod
116
    def setUpClass(cls):
117
        prefix = "__TestServiceInfoHandlerWithoutAuth_"
118
119
        # create state.ini dir and file
120
        cls.state_dir = tempfile.mkdtemp(prefix=prefix)
121
        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...
122
            cls.state_file.write(
123
                "[Service Info]\n"
124
                "Name = TabPy Serve\n"
125
                "Description = \n"
126
                "Creation Time = 0\n"
127
                "Access-Control-Allow-Origin = \n"
128
                "Access-Control-Allow-Headers = \n"
129
                "Access-Control-Allow-Methods = \n"
130
                "\n"
131
                "[Query Objects Service Versions]\n"
132
                "\n"
133
                "[Query Objects Docstrings]\n"
134
                "\n"
135
                "[Meta]\n"
136
                "Revision Number = 1\n"
137
            )
138
        cls.state_file.close()
139
140
        # create config file
141
        cls.config_file = tempfile.NamedTemporaryFile(
142
            prefix=prefix, suffix=".conf", delete=False, mode="w+"
143
        )
144
        cls.config_file.write("[TabPy]\n" f"TABPY_STATE_PATH = {cls.state_dir}")
145
        cls.config_file.close()
146
147
    @classmethod
148
    def tearDownClass(cls):
149
        os.remove(cls.state_file.name)
150
        os.remove(cls.config_file.name)
151
        os.rmdir(cls.state_dir)
152
153
    def get_app(self):
154
        self.app = TabPyApp(self.config_file.name)
155
        return self.app._create_tornado_web_app()
156
157
    def test_tabpy_server_with_no_auth_expect_correct_info_response(self):
158
        response = self.fetch("/info")
159
        self.assertEqual(response.code, 200)
160
        actual_response = json.loads(response.body)
161
        expected_response = _create_expected_info_response(
162
            self.app.settings, self.app.tabpy_state
163
        )
164
165
        self.assertDictEqual(actual_response, expected_response)
166
        self.assertTrue("versions" in actual_response)
167
        versions = actual_response["versions"]
168
        self.assertTrue("v1" in versions)
169
        v1 = versions["v1"]
170
        self.assertTrue("features" in v1)
171
        features = v1["features"]
172
        self.assertDictEqual({}, features)
173