Merge branch 'master' into pg-search
[mygpo.git] / mygpo / usersettings / tests.py
blobdda1d4be6d305c0fda8b67dc0fb7408ba6e1b29b
3 import uuid
4 import urllib.request, urllib.parse, urllib.error
5 import json
7 from django.urls import reverse
8 from django.test.client import Client as TestClient
9 from django.test import TestCase
11 from mygpo.test import create_auth_string, create_user
12 from mygpo.api.advanced import settings as views
13 from mygpo.usersettings.models import UserSettings
14 from mygpo.podcasts.models import Podcast, Episode
15 from mygpo.users.models import Client
18 class TestAPI(TestCase):
20 def setUp(self):
21 self.user, pwd = create_user()
22 self.podcast_url = 'http://example.com/podcast.rss'
23 self.episode_url = 'http://example.com/podcast/episode-1.mp3'
24 self.uid = 'client-uid'
25 self.podcast = Podcast.objects.get_or_create_for_url(self.podcast_url)
26 self.episode = Episode.objects.get_or_create_for_url(
27 self.podcast,
28 self.episode_url,
30 self.user_client = Client.objects.create(
31 id = uuid.uuid1(),
32 user = self.user,
33 uid = self.uid,
35 self.client = TestClient()
36 self.extra = {
37 'HTTP_AUTHORIZATION': create_auth_string(self.user.username, pwd)
40 def tearDown(self):
41 self.user.delete()
42 self.episode.delete()
43 self.podcast.delete()
45 def test_user_settings(self):
46 """ Create, update and verify settings for the user """
47 url = self.get_url(self.user.username, 'account')
48 self._do_test_url(url)
50 def test_podcast_settings(self):
51 url = self.get_url(self.user.username, 'podcast', {
52 'podcast': self.podcast_url,
54 self._do_test_url(url)
56 def test_episode_settings(self):
57 url = self.get_url(self.user.username, 'episode', {
58 'podcast': self.podcast_url,
59 'episode': self.episode_url,
61 self._do_test_url(url)
63 def test_client_settings(self):
64 url = self.get_url(self.user.username, 'device', {
65 'device': self.uid,
67 self._do_test_url(url)
69 def _do_test_url(self, url):
70 # set settings
71 settings = {'set': {'a': 'b', 'c': 'd'}}
72 resp = self.client.post(url, json.dumps(settings),
73 content_type='application/octet-stream',
74 **self.extra)
75 self.assertEqual(resp.status_code, 200, resp.content)
77 # update settings
78 settings = {'set': {'a': 'x'}, 'remove': ['c']}
79 resp = self.client.post(url, json.dumps(settings),
80 content_type='application/octet-stream',
81 **self.extra)
82 self.assertEqual(resp.status_code, 200, resp.content)
84 # get settings
85 resp = self.client.get(url, **self.extra)
86 self.assertEqual(resp.status_code, 200, resp.content)
87 self.assertEqual(json.loads(resp.content.decode('utf-8')), {'a': 'x'})
89 def get_url(self, username, scope, params={}):
90 url = reverse('settings-api', kwargs={
91 'username': username,
92 'scope': scope,
94 return '{url}?{params}'.format(url=url,
95 params=urllib.parse.urlencode(params))