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

server_tests.test_pwd_file   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 21
eloc 111
dl 0
loc 161
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A test_pwd_file.TestPasswordFile.test_given_one_password_in_pwd_file_expect_one_credentials_entry() 0 14 1
A test_pwd_file.TestPasswordFile.test_given_different_cases_in_pwd_file_expect_app_fails() 0 15 2
A test_pwd_file.TestPasswordFile._set_file() 0 3 2
A test_pwd_file.TestPasswordFile.test_given_empty_pwd_file_expect_app_fails() 0 12 2
A test_pwd_file.TestPasswordFile.setUp() 0 5 1
A test_pwd_file.TestPasswordFile.test_given_one_line_with_too_many_params_expect_app_fails() 0 15 2
A test_pwd_file.TestPasswordFile.test_given_missing_pwd_file_expect_app_fails() 0 8 2
A test_pwd_file.TestPasswordFile.test_given_username_but_no_password_expect_parsing_fails() 0 14 2
A test_pwd_file.TestPasswordFile.test_given_no_pwd_file_expect_empty_credentials_list() 0 10 1
A test_pwd_file.TestPasswordFile.test_given_multiple_credentials_expect_all_parsed() 0 17 3
A test_pwd_file.TestPasswordFile.test_given_duplicate_usernames_expect_parsing_fails() 0 16 2
A test_pwd_file.TestPasswordFile.tearDown() 0 5 1
1
import os
2
import unittest
3
from tempfile import NamedTemporaryFile
4
5
from tabpy.tabpy_server.app.app import TabPyApp
6
7
8
class TestPasswordFile(unittest.TestCase):
9
    def setUp(self):
10
        self.config_file = NamedTemporaryFile(mode="w", delete=False)
11
        self.config_file.close()
12
        self.pwd_file = NamedTemporaryFile(mode="w", delete=False)
13
        self.pwd_file.close()
14
15
    def tearDown(self):
16
        os.remove(self.config_file.name)
17
        self.config_file = None
18
        os.remove(self.pwd_file.name)
19
        self.pwd_file = None
20
21
    def _set_file(self, file_name, value):
22
        with open(file_name, "w") as f:
23
            f.write(value)
24
25
    def test_given_no_pwd_file_expect_empty_credentials_list(self):
26
        self._set_file(
27
            self.config_file.name, "[TabPy]\n" "TABPY_TRANSFER_PROTOCOL = http"
28
        )
29
30
        app = TabPyApp(self.config_file.name)
31
        self.assertDictEqual(
32
            app.credentials,
33
            {},
34
            "Expected no credentials with no password file provided",
35
        )
36
37
    def test_given_empty_pwd_file_expect_app_fails(self):
38
        self._set_file(
39
            self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}"
40
        )
41
42
        self._set_file(self.pwd_file.name, "# just a comment")
43
44
        with self.assertRaises(RuntimeError) as cm:
45
            TabPyApp(self.config_file.name)
46
            ex = cm.exception
47
            self.assertEqual(
48
                f"Failed to read password file {self.pwd_file.name}", ex.args[0]
49
            )
50
51
    def test_given_missing_pwd_file_expect_app_fails(self):
52
        self._set_file(self.config_file.name, "[TabPy]\n" "TABPY_PWD_FILE = foo")
53
54
        with self.assertRaises(RuntimeError) as cm:
55
            TabPyApp(self.config_file.name)
56
            ex = cm.exception
57
            self.assertEqual(
58
                f"Failed to read password file {self.pwd_file.name}", ex.args[0]
59
            )
60
61
    def test_given_one_password_in_pwd_file_expect_one_credentials_entry(self):
62
        self._set_file(
63
            self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}"
64
        )
65
66
        login = "user_name_123"
67
        pwd = "someting@something_else"
68
        self._set_file(self.pwd_file.name, "# passwords\n" "\n" f"{login} {pwd}")
69
70
        app = TabPyApp(self.config_file.name)
71
72
        self.assertEqual(len(app.credentials), 1)
73
        self.assertIn(login, app.credentials)
74
        self.assertEqual(app.credentials[login], pwd)
75
76
    def test_given_username_but_no_password_expect_parsing_fails(self):
77
        self._set_file(
78
            self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}"
79
        )
80
81
        login = "user_name_123"
82
        pwd = ""
83
        self._set_file(self.pwd_file.name, "# passwords\n" "\n" f"{login} {pwd}")
84
85
        with self.assertRaises(RuntimeError) as cm:
86
            TabPyApp(self.config_file.name)
87
            ex = cm.exception
88
            self.assertEqual(
89
                f"Failed to read password file {self.pwd_file.name}", ex.args[0]
90
            )
91
92
    def test_given_duplicate_usernames_expect_parsing_fails(self):
93
        self._set_file(
94
            self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}"
95
        )
96
97
        login = "user_name_123"
98
        pwd = "hashedpw"
99
        self._set_file(
100
            self.pwd_file.name, "# passwords\n" "\n" f"{login} {pwd}\n{login} {pwd}"
101
        )
102
103
        with self.assertRaises(RuntimeError) as cm:
104
            TabPyApp(self.config_file.name)
105
            ex = cm.exception
106
            self.assertEqual(
107
                f"Failed to read password file {self.pwd_file.name}", ex.args[0]
108
            )
109
110
    def test_given_one_line_with_too_many_params_expect_app_fails(self):
111
        self._set_file(
112
            self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}"
113
        )
114
115
        self._set_file(
116
            self.pwd_file.name,
117
            "# passwords\n" "user1 pwd1\n" "user_2 pwd#2" "user1 pwd@3",
118
        )
119
120
        with self.assertRaises(RuntimeError) as cm:
121
            TabPyApp(self.config_file.name)
122
            ex = cm.exception
123
            self.assertEqual(
124
                f"Failed to read password file {self.pwd_file.name}", ex.args[0]
125
            )
126
127
    def test_given_different_cases_in_pwd_file_expect_app_fails(self):
128
        self._set_file(
129
            self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}"
130
        )
131
132
        self._set_file(
133
            self.pwd_file.name,
134
            "# passwords\n" "user1 pwd1\n" "user_2 pwd#2" "UseR1 pwd@3",
135
        )
136
137
        with self.assertRaises(RuntimeError) as cm:
138
            TabPyApp(self.config_file.name)
139
            ex = cm.exception
140
            self.assertEqual(
141
                f"Failed to read password file {self.pwd_file.name}", ex.args[0]
142
            )
143
144
    def test_given_multiple_credentials_expect_all_parsed(self):
145
        self._set_file(
146
            self.config_file.name, "[TabPy]\n" f"TABPY_PWD_FILE = {self.pwd_file.name}"
147
        )
148
        creds = {"user_1": "pwd_1", "user@2": "pwd@2", "user#3": "pwd#3"}
149
150
        pwd_file_context = ""
151
        for login in creds:
152
            pwd_file_context += f"{login} {creds[login]}\n"
153
154
        self._set_file(self.pwd_file.name, pwd_file_context)
155
        app = TabPyApp(self.config_file.name)
156
157
        self.assertCountEqual(creds, app.credentials)
158
        for login in creds:
159
            self.assertIn(login, app.credentials)
160
            self.assertEqual(creds[login], app.credentials[login])
161