import datetime
import mock
import pytz
from rest_framework import status
from rest_framework.test import APITestCase
from radioco.apps.radioco.test_utils import TestDataMixin
[docs]def mock_now():
return pytz.utc.localize(datetime.datetime(2015, 1, 6, 14, 30, 0))
[docs]class TestSchedulesAPI(TestDataMixin, APITestCase):
[docs] def test_schedules_get_all(self):
response = self.client.get('/api/2/schedules')
self.assertEqual(response.status_code, status.HTTP_200_OK)
[docs] def test_schedules_get_by_programme(self):
response = self.client.get(
'/api/2/schedules', {'programme': self.programme.slug})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 2)
self.assertEqual(response.data[0]['title'], self.programme.name)
[docs] def test_schedules_get_by_nonexisting_programme(self):
response = self.client.get(
'/api/2/schedules', {'programme': 'foo'})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 0)
[docs] def test_schedules_get_by_calendar(self):
response = self.client.get(
'/api/2/schedules', {'calendar': self.calendar.id})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 5)
self.assertEqual(
response.data[0]['calendar'], self.calendar.id)
[docs] def test_schedules_get_by_nonexisting_calendar(self):
response = self.client.get(
'/api/2/schedules', {'calendar': 'foobar'})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 0)
[docs] def test_schedules_get_by_type(self):
response = self.client.get('/api/2/schedules?type=L')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 5)
self.assertEqual(
response.data[0]['calendar'], self.calendar.id)
[docs] def test_schedules_get_by_nonexiting_type(self):
response = self.client.get('/api/2/schedules?type=B')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 0)
[docs]class TestTransmissionAPI(TestDataMixin, APITestCase):
@mock.patch('django.utils.timezone.now', mock_now)
[docs] def test_transmissions_between(self):
response = self.client.get(
'/api/2/transmissions',
{
'after': datetime.date(2015, 2, 1),
'before': datetime.date(2015, 2, 7),
})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
{_key: response.data[0][_key] for _key in response.data[0] if _key not in ['schedule', 'programme', 'id']},
{
'end': '2015-02-01T09:00:00Z', 'name': 'Morning News',
'programme_url': 'http://testserver/programmes/morning-news/',
'episode_url': None, 'episode': None,
'start': '2015-02-01T08:00:00Z', 'source': None,
'type': 'L', 'slug': 'morning-news'
}
)
[docs] def test_transmissions_between_requesting_tz(self):
response = self.client.get(
'/api/2/transmissions',
{
'after': datetime.date(2015, 2, 1),
'before': datetime.date(2015, 2, 7),
'timezone': 'Europe/Madrid'
})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
{_key: response.data[0][_key] for _key in response.data[0] if _key not in ['schedule', 'programme', 'id']},
{
'end': '2015-02-01T10:00:00+01:00', 'name': u'Morning News',
'programme_url': u'http://testserver/programmes/morning-news/',
'episode_url': None, 'episode': None,
'start': '2015-02-01T09:00:00+01:00', 'source': None,
'type': u'L', 'slug': u'morning-news'
}
)
[docs] def test_incorrect_transmission_queries(self):
response = self.client.get('/api/2/transmissions')
self.assertEqual(response.data['after'], ['This field is required.'])
self.assertEqual(response.data['before'], ['This field is required.'])
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
response = self.client.get('/api/2/transmissions', {'after': datetime.date(2015, 2, 1)})
self.assertEqual(response.data['before'], ['This field is required.'])
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
response = self.client.get('/api/2/transmissions', {'before': datetime.date(2015, 2, 1)})
self.assertEqual(response.data['after'], ['This field is required.'])
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
response = self.client.get(
'/api/2/transmissions',
{'after': datetime.date(2015, 2, 2), 'before': datetime.date(2015, 2, 1)}
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
@mock.patch('django.utils.timezone.now', mock_now)
[docs] def test_transmission_list_filter_non_active_calendar(self):
calendar_id = self.another_calendar.id
response = self.client.get(
'/api/2/transmissions',
{
'calendar': calendar_id,
'after': datetime.date(2015, 1, 1), 'before': datetime.date(2015, 2, 1)
})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertListEqual(
map(lambda t: (t['slug'], t['start']), response.data),
[('classic-hits', '2015-01-06T16:30:00Z')])
[docs] def test_transmission_same_day(self):
response = self.client.get(
'/api/2/transmissions',
{
'after': datetime.date(2015, 2, 1),
'before': datetime.date(2015, 2, 1),
})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
sorted(response.data, key=lambda t: t['start'])[0]['start'],
'2015-02-01T08:00:00Z')
@mock.patch('django.utils.timezone.now', mock_now)
[docs] def test_transmission_before(self):
response = self.client.get(
'/api/2/transmissions',
{'after': datetime.date(2015, 1, 14), 'before': datetime.date(2015, 1, 14)})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
sorted(response.data, key=lambda t: t['start'])[-1]['start'],
'2015-01-14T14:00:00Z')
@mock.patch('django.utils.timezone.now', mock_now)
[docs] def test_transmission_now(self):
response = self.client.get('/api/2/transmissions/now')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
(response.data['slug'], response.data['start']),
('classic-hits', '2015-01-06T14:00:00Z'))
[docs] def test_transmissions_filter_calendar_nonexistend(self):
response = self.client.get(
'/api/2/transmissions', {'calendar': 9999})
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
[docs]class TestRestrictedMethodsScheduleAPI(TestDataMixin, APITestCase):
[docs] def test_schedules_post(self):
response = self.client.post('/api/2/schedules')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
[docs] def test_schedules_put(self):
response = self.client.put('/api/2/schedules')
self.assertEqual(
response.status_code, status.HTTP_403_FORBIDDEN)
[docs] def test_schedules_delete(self):
response = self.client.delete('/api/2/schedules')
self.assertEqual(
response.status_code, status.HTTP_403_FORBIDDEN)
[docs] def test_transmissions_post(self):
response = self.client.post('/api/2/transmissions')
self.assertEqual(
response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
[docs] def test_transmissions_put(self):
response = self.client.put('/api/2/transmissions')
self.assertEqual(
response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
[docs] def test_transmissions_delete(self):
response = self.client.delete('/api/2/transmissions')
self.assertEqual(
response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)