def test_question_playlist_tracks_not_enough_tracks(self):
        """
        question_playlist_tracks() should return None when there are no
        available public playlists with at least 4 tracks.
        """
        u = UserData(None)

        artists = create_artists(3)
        json_add_field(artists, 'name', ['Cash', 'Ben', 'Julia'])

        albums = create_albums(1)
        json_add_to_field(albums, 'images', create_image())

        tracks = create_tracks(13)
        json_add_name(tracks, 't')
        json_add_field(tracks, 'album', albums[0])
        json_add_to_field(tracks[0:3], 'artists', artists[0])
        json_add_to_field(tracks[3:6], 'artists', artists[1])
        json_add_to_field(tracks[6:13], 'artists', artists[2])

        u._playlists = create_playlists(4)
        json_add_field(u._playlists[0:3], 'public', True)
        json_add_field(u._playlists[3:4], 'public', False)
        playlist_add_track(u._playlists[0], tracks[0:3])
        playlist_add_track(u._playlists[1], tracks[3:6])
        playlist_add_track(u._playlists[2], tracks[6:9])
        playlist_add_track(u._playlists[3], tracks[9:13])

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_playlist_tracks(quiz, u)

        self.assertIsNone(question)
    def test_question_popular_playlist_0_followers(self):
        """
        question_popular_playlists() should return None when the
        maximum follower count is 0.
        """
        u = UserData(None)
        u._playlists = []

        u._playlists = create_playlists(3)
        json_add_name(u._playlists, 'p')
        json_add_field(u._playlists[0:3], 'public', True)
        json_add_field(u._playlists[3:6], 'public', False)
        json_add_field(u._playlists, 'followers', create_followers(0))
        json_add_to_field(u._playlists, 'images', create_image())

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_popular_playlist(quiz, u)

        self.assertIsNone(question)
    def test_question_playlist_tracks_just_enough_tracks(self):
        """
        question_playlist_tracks() should work when there is only one
        public playlists with at least 4 tracks.
        """
        u = UserData(None)
        artists = create_artists(4)
        json_add_field(artists,
                       'name', ['Cash', 'Ben', 'Julia', 'Jim'],
                       arr=True)

        albums = create_albums(1)
        json_add_to_field(albums, 'images', create_image())

        tracks = create_tracks(13)
        json_add_name(tracks, 't')
        json_add_field(tracks, 'album', albums[0])
        json_add_to_field(tracks[0:3], 'artists', artists[0])
        json_add_to_field(tracks[3:6], 'artists', artists[1])
        json_add_to_field(tracks[6:9], 'artists', artists[2])
        json_add_to_field(tracks[9:13], 'artists', artists[3])

        u._playlists = create_playlists(4)
        json_add_name(u._playlists, 'playlist')
        json_add_field(u._playlists, 'public', True)
        playlist_add_track(u._playlists[0], tracks[0:3])
        playlist_add_track(u._playlists[1], tracks[3:6])
        playlist_add_track(u._playlists[2], tracks[6:9])
        playlist_add_track(u._playlists[3], tracks[9:13])

        artists = create_artists(1, id=4)
        json_add_field(artists, 'name', 'Velma')

        u._music_taste = create_tracks(4, id=13)
        json_add_name(u._music_taste, 'track')
        json_add_to_field(u._music_taste, 'artists', artists[0])
        json_add_field(u._music_taste, 'album', albums[0])

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_playlist_tracks(quiz, u)

        self.assertGreaterEqual(question.answers().count(), 1)
        self.assertLessEqual(question.answers().count(), 4)
        self.assertEqual(question.incorrect_answers().count(),
                         4 - question.answers().count())

        self.assertIn('playlist3', question.text)

        for a in question.answers():
            self.assertEqual(a.secondary_text, 'Jim')
            self.assertEqual(a.image_url, '200url')
        for a in question.incorrect_answers():
            self.assertEqual(a.secondary_text, 'Velma')
            self.assertEqual(a.image_url, '200url')
    def test_question_popular_playlist_none_followers(self):
        """
        question_popular_playlists() should return None when there
        aren't enough playlists with non-None follower counts.
        """
        u = UserData(None)
        u._playlists = []

        follower_counts = [4, 2, 5, None]
        u._playlists = create_playlists(len(follower_counts))
        json_add_name(u._playlists, 'p')
        json_add_field(u._playlists, 'public', True)
        json_add_field(u._playlists,
                       'followers',
                       [create_followers(f) for f in follower_counts],
                       arr=True)
        json_add_to_field(u._playlists, 'images', create_image())

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_popular_playlist(quiz, u)

        self.assertIsNone(question)
    def test_question_popular_playlist(self):
        """
        question_popular_playlist() should return a question asking
        which playlist is the user's most popular one, by number of
        followers.
        """
        u = UserData(None)
        u._playlists = []

        follower_counts = [8, 2, 4, 7, 1, 0, 6]
        u._playlists = create_playlists(len(follower_counts))
        json_add_name(u._playlists, 'p')
        json_add_field(u._playlists, 'public', True)
        json_add_field(u._playlists,
                       'followers',
                       [create_followers(f) for f in follower_counts],
                       arr=True)
        json_add_to_field(u._playlists, 'images', create_image())

        follower_counts = follower_counts[1:]

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_popular_playlist(quiz, u)

        self.assertEqual(question.answers().count(), 1)
        self.assertEqual(question.answers()[0].primary_text, 'p0')

        self.assertEqual(question.incorrect_answers().count(), 3)
        for c in question.incorrect_answers():
            found = False
            for p in u._playlists:
                if c.primary_text == p['name']:
                    found = True
                    break
            self.assertTrue(found)

        for c in question.choices.all():
            self.assertEqual(c.image_url, '200url')
    def test_question_popular_playlist_not_enough_less_than_max(self):
        """
        question_popular_playlists() should return None when there are
        fewer than 3 playlists that have a follower count less than the
        max number of followers.
        """
        u = UserData(None)
        u._playlists = []

        follower_counts = [5, 5, 1, 2]
        u._playlists = create_playlists(len(follower_counts))
        json_add_name(u._playlists, 'p')
        json_add_field(u._playlists, 'public', True)
        json_add_field(u._playlists,
                       'followers',
                       [create_followers(f) for f in follower_counts],
                       arr=True)
        json_add_to_field(u._playlists, 'images', create_image())

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_popular_playlist(quiz, u)

        self.assertIsNone(question)
    def test_question_popular_playlist_not_enough_public_playlists(self):
        """
        question_popular_playlist() should return None when there are
        not enough public playlists to form a question with.
        """
        u = UserData(None)
        u._playlists = []

        follower_counts = [8, 2, 4, 1, 2, 3]
        u._playlists = create_playlists(6)
        json_add_name(u._playlists, 'p')
        json_add_field(u._playlists[0:3], 'public', True)
        json_add_field(u._playlists[3:6], 'public', False)
        json_add_field(u._playlists,
                       'followers',
                       [create_followers(f) for f in follower_counts],
                       arr=True)
        json_add_to_field(u._playlists, 'images', create_image())

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_popular_playlist(quiz, u)

        self.assertIsNone(question)
    def test_question_playlist_tracks(self):
        """
        question_playlist_tracks() should return a question asking
        which tracks are in one of the user's playlists.
        """
        u = UserData(None)

        artists = create_artists(3)
        json_add_field(artists, 'name', ['Cash', 'Ben', 'Julia'], arr=True)

        album = create_albums(1)
        json_add_to_field(album, 'images', create_image())

        tracks = create_tracks(15)
        json_add_name(tracks, 't')
        json_add_to_field(tracks[0:5], 'artists', artists[0])
        json_add_to_field(tracks[5:10], 'artists', artists[1])
        json_add_to_field(tracks[10:15], 'artists', artists[2])
        json_add_field(tracks, 'album', album[0])

        u._playlists = create_playlists(3)
        json_add_name(u._playlists, 'playlist')
        json_add_field(u._playlists, 'public', True)
        playlist_add_track(u._playlists[0], tracks[0:5])
        playlist_add_track(u._playlists[1], tracks[5:10])
        playlist_add_track(u._playlists[2], tracks[10:15])

        u._music_taste = [
            u._playlists[0]['tracks']['items'][4]['track'],
            u._playlists[1]['tracks']['items'][4]['track'],
            u._playlists[2]['tracks']['items'][4]['track'],
        ]

        tracks = create_tracks(4, id=15)
        json_add_name(tracks, 't4')
        artist = create_artists(1, id=3)
        json_add_field(artist, 'name', 'Velma')
        json_add_to_field(tracks, 'artists', artist[0])
        json_add_field(tracks, 'album', album[0])

        u._music_taste.extend(tracks)

        quiz = Quiz.objects.create(user_id='Cassius')
        question = question_playlist_tracks(quiz, u)

        self.assertLessEqual(question.answers().count(), 4)
        self.assertGreaterEqual(question.answers().count(), 1)
        self.assertEqual(question.incorrect_answers().count(),
                         4 - question.answers().count())

        found = False
        for p in u._playlists:
            if p['name'] in question.text:
                found = True
        self.assertTrue(found)

        artist_name = question.answers()[0].secondary_text
        for a in question.answers():
            self.assertEqual(a.secondary_text, artist_name)
            self.assertEqual(a.image_url, '200url')

        for a in question.incorrect_answers():
            self.assertNotEqual(a.secondary_text, artist_name)
            self.assertEqual(a.image_url, '200url')