From be47a259a8b4df53ec88eefea9cc77958d892067 Mon Sep 17 00:00:00 2001 From: spl0k Date: Sun, 19 Nov 2017 17:49:31 +0100 Subject: [PATCH] Added folder management UI tests --- tests/frontend/__init__.py | 2 + tests/frontend/frontendtestbase.py | 19 ++++++ tests/frontend/test_folder.py | 102 +++++++++++++++++++++++++++++ tests/frontend/test_login.py | 21 ++++-- 4 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 tests/frontend/frontendtestbase.py create mode 100644 tests/frontend/test_folder.py diff --git a/tests/frontend/__init__.py b/tests/frontend/__init__.py index df7328c..9114882 100644 --- a/tests/frontend/__init__.py +++ b/tests/frontend/__init__.py @@ -11,11 +11,13 @@ import unittest from .test_login import LoginTestCase +from .test_folder import FolderTestCase def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(LoginTestCase)) + suite.addTest(unittest.makeSuite(FolderTestCase)) return suite diff --git a/tests/frontend/frontendtestbase.py b/tests/frontend/frontendtestbase.py new file mode 100644 index 0000000..ac379cc --- /dev/null +++ b/tests/frontend/frontendtestbase.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# +# This file is part of Supysonic. +# Supysonic is a Python implementation of the Subsonic server API. +# +# Copyright (C) 2017 Alban 'spl0k' Féron +# +# Distributed under terms of the GNU AGPLv3 license. + +from ..testbase import TestBase + +class FrontendTestBase(TestBase): + def _login(self, username, password): + return self.client.post('/user/login', data = { 'user': username, 'password': password }, follow_redirects = True) + + def _logout(self): + return self.client.get('/user/logout', follow_redirects = True) + diff --git a/tests/frontend/test_folder.py b/tests/frontend/test_folder.py new file mode 100644 index 0000000..f9b7bc1 --- /dev/null +++ b/tests/frontend/test_folder.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# +# This file is part of Supysonic. +# Supysonic is a Python implementation of the Subsonic server API. +# +# Copyright (C) 2013-2017 Alban 'spl0k' Féron +# +# Distributed under terms of the GNU AGPLv3 license. + +import uuid + +from supysonic.db import Folder + +from .frontendtestbase import FrontendTestBase + +class FolderTestCase(FrontendTestBase): + __module_to_test__ = 'supysonic.frontend' + + def test_index(self): + self._login('bob', 'B0b') + rv = self.client.get('/folder', follow_redirects = True) + self.assertIn('There\'s nothing much to see', rv.data) + self.assertNotIn('Music folders', rv.data) + self._logout() + + self._login('alice', 'Alic3') + rv = self.client.get('/folder') + self.assertIn('Music folders', rv.data) + + def test_add_get(self): + self._login('bob', 'B0b') + rv = self.client.get('/folder/add', follow_redirects = True) + self.assertIn('There\'s nothing much to see', rv.data) + self.assertNotIn('Add folder', rv.data) + self._logout() + + self._login('alice', 'Alic3') + rv = self.client.get('/folder/add') + self.assertIn('Add Folder', rv.data) + + def test_add_post(self): + self._login('alice', 'Alic3') + rv = self.client.post('/folder/add') + self.assertIn('required', rv.data) + rv = self.client.post('/folder/add', data = { 'name': 'name' }) + self.assertIn('required', rv.data) + rv = self.client.post('/folder/add', data = { 'path': 'path' }) + self.assertIn('required', rv.data) + rv = self.client.post('/folder/add', data = { 'name': 'name', 'path': 'path' }) + self.assertIn('Add Folder', rv.data) + rv = self.client.post('/folder/add', data = { 'name': 'name', 'path': 'tests/assets' }, follow_redirects = True) + self.assertIn('created', rv.data) + self.assertEqual(self.store.find(Folder).count(), 1) + + def test_delete(self): + folder = Folder() + folder.name = 'folder' + folder.path = 'tests/assets' + folder.root = True + self.store.add(folder) + self.store.commit() + + self._login('bob', 'B0b') + rv = self.client.get('/folder/del/' + str(folder.id), follow_redirects = True) + self.assertIn('There\'s nothing much to see', rv.data) + self.assertEqual(self.store.find(Folder).count(), 1) + self._logout() + + self._login('alice', 'Alic3') + rv = self.client.get('/folder/del/string', follow_redirects = True) + self.assertIn('Invalid', rv.data) + rv = self.client.get('/folder/del/' + str(uuid.uuid4()), follow_redirects = True) + self.assertIn('No such folder', rv.data) + rv = self.client.get('/folder/del/' + str(folder.id), follow_redirects = True) + self.assertIn('Music folders', rv.data) + self.assertEqual(self.store.find(Folder).count(), 0) + + def test_scan(self): + folder = Folder() + folder.name = 'folder' + folder.path = 'tests/assets' + folder.root = True + self.store.add(folder) + self.store.commit() + self._login('alice', 'Alic3') + + rv = self.client.get('/folder/scan/string', follow_redirects = True) + self.assertIn('Invalid', rv.data) + rv = self.client.get('/folder/scan/' + str(uuid.uuid4()), follow_redirects = True) + self.assertIn('No such folder', rv.data) + rv = self.client.get('/folder/scan/' + str(folder.id), follow_redirects = True) + self.assertIn('Added', rv.data) + self.assertIn('Deleted', rv.data) + rv = self.client.get('/folder/scan', follow_redirects = True) + self.assertIn('Added', rv.data) + self.assertIn('Deleted', rv.data) + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/frontend/test_login.py b/tests/frontend/test_login.py index 03a0d7f..21e0cb3 100644 --- a/tests/frontend/test_login.py +++ b/tests/frontend/test_login.py @@ -14,9 +14,9 @@ import uuid from supysonic.db import User -from ..testbase import TestBase +from .frontendtestbase import FrontendTestBase -class LoginTestCase(TestBase): +class LoginTestCase(FrontendTestBase): __module_to_test__ = 'supysonic.frontend' def test_unauthorized_request(self): @@ -26,25 +26,25 @@ class LoginTestCase(TestBase): def test_login_with_bad_data(self): # Login with not blank user or password - rv = self.client.post('/user/login', data=dict(name='', password=''), follow_redirects=True) + rv = self._login('', '') self.assertIn('Missing user name', rv.data) self.assertIn('Missing password', rv.data) # Login with not valid user or password - rv = self.client.post('/user/login', data=dict(user='nonexistent', password='nonexistent'), follow_redirects=True) + rv = self._login('nonexistent', 'nonexistent') self.assertIn('No such user', rv.data) - rv = self.client.post('/user/login', data=dict(user='alice', password='badpassword'), follow_redirects=True) + rv = self._login('alice', 'badpassword') self.assertIn('Wrong password', rv.data) def test_login_admin(self): # Login with a valid admin user - rv = self.client.post('/user/login', data=dict(user='alice', password='Alic3'), follow_redirects=True) + rv = self._login('alice', 'Alic3') self.assertIn('Logged in', rv.data) self.assertIn('Users', rv.data) self.assertIn('Folders', rv.data) def test_login_non_admin(self): # Login with a valid non-admin user - rv = self.client.post('/user/login', data=dict(user='bob', password='B0b'), follow_redirects=True) + rv = self._login('bob', 'B0b') self.assertIn('Logged in', rv.data) # Non-admin user cannot acces to users and folders self.assertNotIn('Users', rv.data) @@ -74,5 +74,12 @@ class LoginTestCase(TestBase): rv = self.client.get('/', follow_redirects=True) self.assertIn('Please login', rv.data) + def test_multiple_login(self): + self._login('alice', 'Alic3') + rv = self._login('bob', 'B0b') + self.assertIn('Already logged in', rv.data) + self.assertIn('alice', rv.data) + if __name__ == '__main__': unittest.main() +