Skip to content

Commit d4ca645

Browse files
committed
adding functional tests
1 parent 8a8e5e2 commit d4ca645

10 files changed

+154
-36
lines changed

.envs/.local/.email_template

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
API_KEY=fake-api-key
2+
EMAIL_URL=https:example.com
3+

.envs/.local/.phame_template

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
USER=fake_user
2+
PASSWORD=fake_password
3+
4+
ADMIN=fake_admin
5+
ADMIN_PASSWORD=fake_admin_password
6+
7+
PUBLIC=public
8+
PUBLIC_PASSWORD=fake_public_password
9+

docker-compose-dev.yml

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ services:
4141
- api_data:/usr/src/app/static/uploads
4242
expose:
4343
- 5000
44+
env_file:
45+
- ./.envs/.local/.phame
4446
environment:
4547
- FLASK_ENV=development
4648
- FLASK_APP=project/__init__.py

docker-compose-prod.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ services:
4040
expose:
4141
- 5000
4242
env_file:
43-
- ./.envs/.local/.postgres
44-
- ./.envs/.local/.email
43+
- ./.envs/.prod/.phame
44+
- ./.envs/.prod/.email
4545
environment:
4646
- FLASK_ENV=development
4747
- FLASK_APP=project/__init__.py
@@ -61,6 +61,8 @@ services:
6161
- postgres_backup_local:/backups
6262
ports:
6363
- 5435:5432
64+
env_file:
65+
- ./.envs/.prod/.postgres
6466
environment:
6567
- POSTGRES_USER=${POSTGRES_USER}
6668
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

services/phame/project/api/users.py

+20
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,26 @@ def profile():
167167
return render_template('profile.html', user=current_user)
168168

169169

170+
@users_blueprint.route('/delete', methods=['POST'])
171+
def delete_user():
172+
response_object = {'status': 'fail', 'message': 'Cannot delete user'}
173+
try:
174+
if not current_user.is_admin:
175+
response_object['message'] = 'You must be an admin to delete users!'
176+
return jsonify(response_object), 422
177+
post_data = request.get_json()
178+
if not post_data:
179+
return jsonify(response_object), 400
180+
username = post_data.get('username')
181+
user = User.query.filter_by(username=username).first()
182+
logging.debug(f'deleting user {username}')
183+
db.session.delete(user)
184+
db.session.commit()
185+
except IntegrityError:
186+
db.session.rollback()
187+
return jsonify(response_object), 400
188+
189+
170190
@users_blueprint.route('/ping', methods=['GET'])
171191
def ping_pong():
172192
return jsonify({
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
admin_credentials = {'PHAME_ADMIN_USERNAME': 'fake_admin', 'PHAME_ADMIN_PASSWORD': 'fake_password', 'PHAME_ADMIN_NAME': 'fake_person'}
2-
operator_credentials = {'PHAME_OPERATOR_USERNAME': 'test_user', 'PHAME_OPERATOR_PASSWORD': 'NOT_A_PASSWORD',
3-
'PHAME_OPERATOR_NAME': 'User Name',
4-
'PHAME_OPERATOR_EMAIL': '[email protected]'}
2+
user_credentials = {'PHAME_USER_USERNAME': 'test_user', 'PHAME_USER_PASSWORD': 'NOT_A_PASSWORD',
3+
'PHAME_USER_NAME': 'User Name',
4+
'PHAME_USER_EMAIL': '[email protected]'}

services/phame/project/tests/fixtures/site_data.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
site_params:
22
PHAME_TEST_URL:
3-
'https://localhost/phame'
3+
'http://localhost/phame'
4+
PHAME_USERS_URL:
5+
'http://localhost/users'
46

57
create_report_widget_list :
68
[{'widget_type':'combo', 'widget_id': 'location','widget_value': 'Ascension M1'},

services/phame/project/tests/functional_tests.py

+56-18
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
import time
88
import os
99
from selenium.webdriver.common.by import By
10-
from urlparse import *
1110
import argparse
1211
from selenium.webdriver.support import expected_conditions as EC
1312
import sys
14-
print sys.path
1513
import yaml
1614

1715
sys.path.append(os.path.dirname(__file__))
@@ -25,46 +23,51 @@ class SiteTest(unittest.TestCase):
2523

2624
def setUp(self):
2725

28-
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
26+
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
2927

3028
chromeOptions = webdriver.ChromeOptions()
31-
prefs = {"download.default_directory": os.path.join(base_dir,'cm','tests')}
29+
prefs = {"download.default_directory": os.path.join(base_dir, 'project', 'tests', 'fixtures')}
3230
chromeOptions.add_experimental_option("prefs", prefs)
33-
chrome_driver = os.path.join(base_dir, 'extra', 'chromedriver')
34-
self.driver = webdriver.Chrome('/Devel/cmdb/extra/chromedriver', chrome_options=chromeOptions)
35-
operator_data = os.path.join(base_dir, 'extra', 'fixtures', 'operator_data.yaml')
31+
chrome_driver = os.path.join(base_dir, 'tests', 'extra', 'chromedriver')
32+
self.driver = webdriver.Chrome(chrome_driver, options=chromeOptions)
33+
operator_data = os.path.join(base_dir, 'tests', 'fixtures', 'operator_data.yaml')
3634
if not os.path.exists(operator_data):
37-
print('operator_data.yaml does not exist, copy example_operator_data.yaml and add your credentials')
35+
print('site_data.yaml does not exist, copy example_site_data.yaml and add your credentials')
3836
sys.exit(0)
3937
with open(operator_data) as fp:
40-
creds = yaml.safe_load(fp)
38+
creds = yaml.load(fp, Loader=yaml.FullLoader)
4139

4240
if len(sys.argv) > 1:
4341
with open(os.path.join(base_dir, 'extra', 'fixtures', sys.argv[1])) as fp:
4442
site_data = yaml.safe_load(fp)
4543
else:
46-
with open(os.path.join(base_dir, 'extra', 'fixtures', 'test_sgp_data.yaml')) as fp:
44+
with open(os.path.join(base_dir, 'tests', 'fixtures', 'site_data.yaml')) as fp:
4745
site_data = yaml.safe_load(fp)
4846

4947
self.url = site_data['site_params']['PHAME_TEST_URL']
50-
self.operator_credentials = creds['operator_credentials']
48+
self.users_url = site_data['site_params']['PHAME_USERS_URL']
49+
self.operator_credentials = creds['user_credentials']
5150
self.admin_credentials = creds['admin_credentials']
5251

52+
def tearDown(self):
53+
self.driver.get(self.url + '/users/logout')
54+
self.driver.close()
55+
56+
5357
def admin_login(self):
54-
self.admin_logout()
55-
self.driver.get(self.url)
58+
self.logout()
59+
self.driver.get(f"{self.users_url}/login")
5660
element = WebDriverWait(self.driver, 10).until(
5761
lambda driver: self.driver.find_element_by_tag_name('a'))
5862
username = self.driver.find_element_by_name("username")
5963
password = self.driver.find_element_by_name("password")
6064
username.clear()
6165
username.send_keys(self.admin_credentials['PHAME_ADMIN_USERNAME'])
6266
password.send_keys(self.admin_credentials['PHAME_ADMIN_PASSWORD'])
63-
self.driver.find_element_by_name("submitbutton").click()
64-
67+
self.driver.find_element_by_name("submit").click()
6568

66-
def admin_logout(self):
67-
self.driver.get(self.url + '/accounts/logout')
69+
def logout(self):
70+
self.driver.get(self.users_url + '/logout')
6871

6972
def login(self):
7073
username = self.driver.find_element_by_name("username")
@@ -73,4 +76,39 @@ def login(self):
7376
username.send_keys(self.operator_credentials['PHAME_OPERATOR_USERNAME'])
7477
password.send_keys(self.operator_credentials['PHAME_OPERATOR_PASSWORD'])
7578

76-
self.driver.find_element_by_name("submitbutton").click()
79+
self.driver.find_element_by_name("submit").click()
80+
81+
def test_admin_login(self):
82+
self.logout()
83+
self.driver.get(f"{self.users_url}/login")
84+
username = self.driver.find_element_by_name("username")
85+
password = self.driver.find_element_by_name("password")
86+
username.clear()
87+
username.send_keys(self.admin_credentials['PHAME_ADMIN_USERNAME'])
88+
password.send_keys(self.admin_credentials['PHAME_ADMIN_PASSWORD'])
89+
self.driver.find_element_by_name("submit").click()
90+
header = self.driver.find_element_by_xpath('// *[ @ id = "content"] / h1')
91+
self.assertIn('PhaME Input', header.text)
92+
93+
def test_login(self):
94+
self.logout()
95+
self.driver.get(f"{self.users_url}/login")
96+
username = self.driver.find_element_by_name("username")
97+
password = self.driver.find_element_by_name("password")
98+
username.clear()
99+
username.send_keys(self.operator_credentials['PHAME_USER_USERNAME'])
100+
password.send_keys(self.operator_credentials['PHAME_USER_PASSWORD'])
101+
self.driver.find_element_by_name("submit").click()
102+
header = self.driver.find_element_by_xpath('// *[ @ id = "content"] / h1')
103+
self.assertIn('PhaME Input', header.text)
104+
105+
def test_create_user(self):
106+
# delete operator user
107+
self.driver.get(self.users_url + "/register")
108+
username = self.driver.find_element_by_name("username")
109+
password = self.driver.find_element_by_name("password")
110+
password2 = self.driver.find_element_by_name("password2")
111+
email = self.driver.find_element_by_name("email")
112+
username.send_keys('test_user')
113+
password.send_keys('test_password')
114+

services/phame/project/tests/test_users.py

+53-11
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,6 @@ def add_user(self, username=None, email=None, password=None, is_admin=False):
2424
user.set_password(pssword)
2525
db.session.add(user)
2626
db.session.commit()
27-
# with self.client:
28-
# response = self.client.post(url_for('users.register'),
29-
# data=json.dumps(
30-
# {'username': user,
31-
# 'email': eml,
32-
# 'password': pssword,
33-
# 'password2': pssword2,
34-
# 'is_admin': is_admin
35-
# }),
36-
# content_type='application/json', )
37-
# print(response.status_code)
3827
return user
3928

4029
def create_app(self):
@@ -217,5 +206,58 @@ def test_no_login_redirect(self):
217206
self.assertEquals(response.status_code, 302)
218207
self.assertIn('login', response.headers['Location'])
219208

209+
def test_delete_user(self):
210+
admin = self.add_user(username='admin', email='[email protected]',
211+
password='test', is_admin=True)
212+
user = self.add_user()
213+
response = self.client.get(url_for('users.get_all_users'))
214+
data = json.loads(response.data.decode())
215+
self.assertEqual(len(data['data']['users']), 2)
216+
self.assertEqual(data['data']['users'][1]['username'], 'mark')
217+
with self.client:
218+
login_user(admin)
219+
response = self.client.post(url_for('users.delete_user'),
220+
data=json.dumps(
221+
{'username': user.username
222+
}),
223+
content_type='application/json',
224+
)
225+
self.assertEqual(response.status_code, 200)
226+
response = self.client.get(url_for('users.get_all_users'))
227+
data = json.loads(response.data.decode())
228+
self.assertEqual(len(data['data']['users']), 1)
229+
deleted = True
230+
for user in data['data']['users']:
231+
if user['username'] == 'mark':
232+
deleted = False
233+
self.assertTrue(deleted)
234+
235+
def test_delete_user_not_admin(self):
236+
admin = self.add_user(username='admin', email='[email protected]',
237+
password='test', is_admin=False)
238+
user = self.add_user()
239+
response = self.client.get(url_for('users.get_all_users'))
240+
data = json.loads(response.data.decode())
241+
self.assertEqual(len(data['data']['users']), 2)
242+
self.assertEqual(data['data']['users'][1]['username'], 'mark')
243+
with self.client:
244+
login_user(admin)
245+
response = self.client.post(url_for('users.delete_user'),
246+
data=json.dumps(
247+
{'username': user.username
248+
}),
249+
content_type='application/json',
250+
)
251+
self.assertEqual(response.status_code, 422)
252+
response = self.client.get(url_for('users.get_all_users'))
253+
data = json.loads(response.data.decode())
254+
self.assertEqual(len(data['data']['users']), 1)
255+
deleted = True
256+
for user in data['data']['users']:
257+
if user['username'] == 'mark':
258+
deleted = False
259+
self.assertTrue(deleted)
260+
261+
220262
if __name__ == '__main__':
221263
unittest.main()

services/phame/requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pandas==0.23.1
2424
psutil==5.6.2
2525
psycopg2==2.7.4
2626
pytz==2018.3
27+
pyyaml
2728
redis==2.10.6
2829
requests
2930
selenium
@@ -33,4 +34,3 @@ Werkzeug==0.15.3
3334
requests
3435
IPython
3536
Werkzeug==0.15.3
36-
pyyaml

0 commit comments

Comments
 (0)