def test_undo_hate_movie_not_owner(self): """ Ensure that not owner of a movie can undo the hate of a movie. """ users = get_sample_users() movies = get_sample_movies(users) movie = movies[0] not_owner = users[-1] set_sample_opinion(not_owner, movie, OPINION_HATE) self.assertEqual(movie.hates.count(), 1) self.assertEqual(movie.hates_counter, 1) url = reverse('movie-opinion', kwargs={'pk': movies[0].pk}) data = {'opinion': None} self.client.force_authenticate(user=not_owner) response = self.client.post(url, data, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) movie.refresh_from_db() request = get_sample_request(not_owner) expected_response = MovieSerializer(instance=movie, context={ 'request': request }).data self.assertEqual(response.data, expected_response) self.assertEqual(movie.hates_counter, 0) self.assertEqual(movie.hates.count(), 0)
def test_ordering_asceding_likes(self): """ Ensure that anonymous user can order movies by asceding likes. """ url = '{}?ordering={}'.format(reverse('movie-list'), 'likes_counter') # setup sample data users = get_sample_users() movies = get_sample_movies(users) set_sample_opinions(users, movies, OPINION_LIKE) # apply request response = self.client.get(url, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) # create expected response data qs = get_paginated_queryset(Movie.objects.order_by('likes_counter')) request = get_sample_request() expected_response = MovieSerializer(qs, many=True, context={ 'request': request }).data self.assertEqual(response.data['results'], expected_response)
def test_cannot_like_already_liked_movie(self): """ Ensure that user cannot like a movie already liked by him. """ users = get_sample_users() movies = get_sample_movies(users) movie = movies[0] not_owner = users[-1] set_sample_opinion(not_owner, movie, OPINION_LIKE) self.assertEqual(movie.likes_counter, 1) self.assertEqual(movie.likes.count(), 1) url = reverse('movie-opinion', kwargs={'pk': movies[0].pk}) data = {'opinion': OPINION_LIKE} self.client.force_authenticate(user=not_owner) response = self.client.post(url, data, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(MovieOpinion.objects.count(), 1) movie.refresh_from_db() request = get_sample_request(not_owner) expected_response = MovieSerializer(instance=movie, context={ 'request': request }).data self.assertEqual(response.data, expected_response) self.assertEqual(movie.likes_counter, 1) self.assertEqual(movie.likes.count(), 1)
def test_list_movies_by_undefined_user(self): """ Ensure that anonymous user can get no movies filtered by user submitted them for an username that does not exist. """ users = get_sample_users() movies = get_sample_movies(users) search_username = users[0].username + 'undefined' url = '{}?search={}'.format(reverse('movie-list'), search_username) response = self.client.get(url, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) qs = get_paginated_queryset( Movie.objects.filter(user__username=search_username)) self.assertEqual(qs.count(), 0) request = get_sample_request() expected_response = MovieSerializer(qs, many=True, context={ 'request': request }).data self.assertEqual(response.data['results'], expected_response)
def test_liked_movie_is_marked(self): """ Ensure that movie is_liked attribute is marked for liked movie. """ users = get_sample_users() movie = get_sample_movies(users)[0] user = users[-1] set_sample_opinion(user, movie, OPINION_LIKE) request = get_sample_request(user) data = MovieSerializer(instance=movie, context={ 'request': request }).data self.assertTrue(data['is_liked'])
def test_not_hated_movie_is_not_marked(self): """ Ensure that movie is_hated attribute is not marked for movie that is not hated by that user. """ users = get_sample_users() movie = get_sample_movies(users)[0] user = users[-1] other_user = users[-2] set_sample_opinion(user, movie, OPINION_HATE) request = get_sample_request(other_user) data = MovieSerializer(instance=movie, context={ 'request': request }).data self.assertFalse(data['is_hated'])
def test_list_movies(self): """ Ensure that anonymous user can get all movies. """ url = reverse('movie-list') users = get_sample_users() movies = get_sample_movies(users) response = self.client.get(url, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) qs = get_paginated_queryset(Movie.objects.all()) request = get_sample_request() expected_response = MovieSerializer(qs, many=True, context={ 'request': request }).data self.assertEqual(response.data['results'], expected_response)
def test_ordering_asceding_air_date(self): """ Ensure that anonymous user can order movies by asceding air_date. """ url = '{}?ordering={}'.format(reverse('movie-list'), 'air_date') # setup sample data users = get_sample_users() movies = get_sample_movies(users) response = self.client.get(url, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) qs = get_paginated_queryset(Movie.objects.order_by('air_date')) request = get_sample_request() expected_response = MovieSerializer(qs, many=True, context={ 'request': request }).data self.assertEqual(response.data['results'], expected_response)
def test_create_movie_authenticated_user(self): """ Ensure that authenticated user can create a new movie object. """ User = get_user_model() user = User.objects.create(username='******', first_name='F', last_name='L') publication_date = now() url = reverse('movie-list') data = {'title': 'Movie title', 'description': 'Description'} # authenticate user self.client.force_authenticate(user=user) # submit request response = self.client.post(url, data, format='json') self.assertEqual(response.status_code, status.HTTP_201_CREATED) # assert request result self.assertEqual(Movie.objects.count(), 1) movie = Movie.objects.get() # check response data request = get_sample_request(user) expected_data = MovieSerializer(instance=movie, context={ 'request': request }).data self.assertEqual(response.data, expected_data) # check inserted data self.assertEqual(movie.title, 'Movie title') self.assertEqual(movie.description, 'Description') self.assertEqual(movie.user, user) self.assertAlmostEqual(movie.publication_date, publication_date, delta=timedelta(seconds=1))