#!/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) 2017 Alban 'spl0k' FĂ©ron # # Distributed under terms of the GNU AGPLv3 license. import uuid from pony.orm import db_session from supysonic.db import User, ClientPrefs from .frontendtestbase import FrontendTestBase class UserTestCase(FrontendTestBase): def setUp(self): super(UserTestCase, self).setUp() with db_session: self.users = { u.name: u.id for u in User.select() } def test_index(self): self._login('bob', 'B0b') rv = self.client.get('/user', follow_redirects = True) self.assertIn('There\'s nothing much to see', rv.data) self.assertNotIn('Users', rv.data) self._logout() self._login('alice', 'Alic3') rv = self.client.get('/user') self.assertIn('Users', rv.data) def test_details(self): self._login('alice', 'Alic3') rv = self.client.get('/user/string', follow_redirects = True) self.assertIn('Invalid', rv.data) rv = self.client.get('/user/' + str(uuid.uuid4()), follow_redirects = True) self.assertIn('No such user', rv.data) rv = self.client.get('/user/' + str(self.users['bob'])) self.assertIn('bob', rv.data) self._logout() with db_session: ClientPrefs(user = User[self.users['bob']], client_name = 'tests') self._login('bob', 'B0b') rv = self.client.get('/user/' + str(self.users['alice']), follow_redirects = True) self.assertIn('There\'s nothing much to see', rv.data) self.assertNotIn('

bob

', rv.data) rv = self.client.get('/user/me') self.assertIn('

bob

', rv.data) self.assertIn('tests', rv.data) def test_update_client_prefs(self): self._login('alice', 'Alic3') rv = self.client.post('/user/me') self.assertIn('updated', rv.data) # does nothing, says it's updated anyway # error cases, silently ignored self.client.post('/user/me', data = { 'garbage': 'trash' }) self.client.post('/user/me', data = { 'a_b_c_d_e_f': 'g_h_i_j_k' }) self.client.post('/user/me', data = { '_l': 'm' }) self.client.post('/user/me', data = { 'n_': 'o' }) self.client.post('/user/me', data = { 'inexisting_client': 'setting' }) with db_session: ClientPrefs(user = User[self.users['alice']], client_name = 'tests') rv = self.client.post('/user/me', data = { 'tests_format': 'mp3', 'tests_bitrate': 128 }) self.assertIn('updated', rv.data) with db_session: prefs = ClientPrefs[User[self.users['alice']], 'tests'] self.assertEqual(prefs.format, 'mp3') self.assertEqual(prefs.bitrate, 128) self.client.post('/user/me', data = { 'tests_delete': 1 }) with db_session: self.assertEqual(ClientPrefs.select().count(), 0) def test_change_username_get(self): self._login('bob', 'B0b') rv = self.client.get('/user/whatever/changeusername', follow_redirects = True) self.assertIn('There\'s nothing much to see', rv.data) self._logout() self._login('alice', 'Alic3') rv = self.client.get('/user/whatever/changeusername', follow_redirects = True) self.assertIn('Invalid', rv.data) rv = self.client.get('/user/{}/changeusername'.format(uuid.uuid4()), follow_redirects = True) self.assertIn('No such user', rv.data) self.client.get('/user/{}/changeusername'.format(self.users['bob'])) def test_change_username_post(self): self._login('alice', 'Alic3') self.client.post('/user/whatever/changeusername') path = '/user/{}/changeusername'.format(self.users['bob']) rv = self.client.post(path, follow_redirects = True) self.assertIn('required', rv.data) rv = self.client.post(path, data = { 'user': 'bob' }, follow_redirects = True) self.assertIn('No changes', rv.data) rv = self.client.post(path, data = { 'user': 'b0b', 'admin': 1 }, follow_redirects = True) self.assertIn('updated', rv.data) self.assertIn('b0b', rv.data) with db_session: bob = User[self.users['bob']] self.assertEqual(bob.name, 'b0b') self.assertTrue(bob.admin) rv = self.client.post(path, data = { 'user': 'alice' }, follow_redirects = True) with db_session: self.assertEqual(User[self.users['bob']].name, 'b0b') def test_change_mail_get(self): self._login('alice', 'Alic3') self.client.get('/user/me/changemail') # whatever def test_change_mail_post(self): self._login('alice', 'Alic3') self.client.post('/user/me/changemail') # whatever def test_change_password_get(self): self._login('alice', 'Alic3') rv = self.client.get('/user/me/changepass') self.assertIn('Current password', rv.data) rv = self.client.get('/user/{}/changepass'.format(self.users['bob'])) self.assertNotIn('Current password', rv.data) def test_change_password_post(self): self._login('alice', 'Alic3') path = '/user/me/changepass' rv = self.client.post(path) self.assertIn('required', rv.data) rv = self.client.post(path, data = { 'current': 'alice' }) self.assertIn('required', rv.data) rv = self.client.post(path, data = { 'new': 'alice' }) self.assertIn('required', rv.data) rv = self.client.post(path, data = { 'current': 'alice', 'new': 'alice' }) self.assertIn('password and its confirmation don', rv.data) rv = self.client.post(path, data = { 'current': 'alice', 'new': 'alice', 'confirm': 'alice' }) self.assertIn('Wrong password', rv.data) self._logout() rv = self._login('alice', 'Alic3') self.assertIn('Logged in', rv.data) rv = self.client.post(path, data = { 'current': 'Alic3', 'new': 'alice', 'confirm': 'alice' }, follow_redirects = True) self.assertIn('changed', rv.data) self._logout() rv = self._login('alice', 'alice') self.assertIn('Logged in', rv.data) path = '/user/{}/changepass'.format(self.users['bob']) rv = self.client.post(path) self.assertIn('required', rv.data) rv = self.client.post(path, data = { 'new': 'alice' }) self.assertIn('password and its confirmation don', rv.data) rv = self.client.post(path, data = { 'new': 'alice', 'confirm': 'alice' }, follow_redirects = True) self.assertIn('changed', rv.data) self._logout() rv = self._login('bob', 'alice') self.assertIn('Logged in', rv.data) def test_add_get(self): self._login('bob', 'B0b') rv = self.client.get('/user/add', follow_redirects = True) self.assertIn('There\'s nothing much to see', rv.data) self.assertNotIn('Add User', rv.data) self._logout() self._login('alice', 'Alic3') rv = self.client.get('/user/add') self.assertIn('Add User', rv.data) def test_add_post(self): self._login('alice', 'Alic3') rv = self.client.post('/user/add') self.assertIn('required', rv.data) rv = self.client.post('/user/add', data = { 'user': 'user' }) self.assertIn('Please provide a password', rv.data) rv = self.client.post('/user/add', data = { 'passwd': 'passwd' }) self.assertIn('required', rv.data) rv = self.client.post('/user/add', data = { 'user': 'name', 'passwd': 'passwd' }) self.assertIn('passwords don', rv.data) rv = self.client.post('/user/add', data = { 'user': 'alice', 'passwd': 'passwd', 'passwd_confirm': 'passwd' }) self.assertIn('already a user with that name', rv.data) with db_session: self.assertEqual(User.select().count(), 2) rv = self.client.post('/user/add', data = { 'user': 'user', 'passwd': 'passwd', 'passwd_confirm': 'passwd', 'admin': 1 }, follow_redirects = True) self.assertIn('added', rv.data) with db_session: self.assertEqual(User.select().count(), 3) self._logout() rv = self._login('user', 'passwd') self.assertIn('Logged in', rv.data) def test_delete(self): path = '/user/del/{}'.format(self.users['bob']) self._login('bob', 'B0b') rv = self.client.get(path, follow_redirects = True) self.assertIn('There\'s nothing much to see', rv.data) with db_session: self.assertEqual(User.select().count(), 2) self._logout() self._login('alice', 'Alic3') rv = self.client.get('/user/del/string', follow_redirects = True) self.assertIn('Invalid', rv.data) rv = self.client.get('/user/del/' + str(uuid.uuid4()), follow_redirects = True) self.assertIn('No such user', rv.data) rv = self.client.get(path, follow_redirects = True) self.assertIn('Deleted', rv.data) with db_session: self.assertEqual(User.select().count(), 1) self._logout() rv = self._login('bob', 'B0b') self.assertIn('No such user', rv.data) def test_lastfm_link(self): self._login('alice', 'Alic3') rv = self.client.get('/user/me/lastfm/link', follow_redirects = True) self.assertIn('Missing LastFM auth token', rv.data) rv = self.client.get('/user/me/lastfm/link', query_string = { 'token': 'abcdef' }, follow_redirects = True) self.assertIn('No API key set', rv.data) def test_lastfm_unlink(self): self._login('alice', 'Alic3') rv = self.client.get('/user/me/lastfm/unlink', follow_redirects = True) self.assertIn('Unlinked', rv.data) if __name__ == '__main__': unittest.main()