Пример #1
0
    def test_to_influx(self):
        listen = Listen(timestamp=int(time.time()),
                        user_name='testuser',
                        artist_msid=uuid.uuid4(),
                        recording_msid=uuid.uuid4(),
                        data={
                            'artist_name': 'Radiohead',
                            'track_name': 'True Love Waits',
                            'additional_info': {
                                'release_type': ["ALBUM", "REMIX"],
                            }
                        })

        data = listen.to_influx(quote(listen.user_name))

        # Make sure every value that we don't explicitly support is a string
        for key in data['fields']:
            if key not in Listen.SUPPORTED_KEYS:
                print(key)
                self.assertIsInstance(data['fields'][key], str)

        # Check values
        self.assertEqual(data['measurement'], quote(listen.user_name))
        self.assertEqual(data['time'], listen.ts_since_epoch)
        self.assertEqual(data['tags']['user_name'], listen.user_name)
        self.assertEqual(data['fields']['artist_msid'], listen.artist_msid)
        self.assertEqual(data['fields']['recording_msid'],
                         listen.recording_msid)
        self.assertEqual(data['fields']['track_name'],
                         listen.data['track_name'])
        self.assertEqual(data['fields']['artist_name'],
                         listen.data['artist_name'])
Пример #2
0
def create_test_data_for_timescalelistenstore(user_name: str, user_id: int, test_data_file_name: str = None):
    """Create listens for timescalelistenstore tests.

    From a json file in testdata it creates Listen objects with a specified user_name for tests.

    Args:
        user_name: MusicBrainz username of a user.
        user_id: listenbrainz row id of the user
        test_data_file_name: If specified use the given file to create Listen objects.
                                   DEFAULT = 'timescale_listenstore_test_listens.json'

    Returns:
        A list of Listen objects.
    """
    if not test_data_file_name:
        test_data_file_name = 'timescale_listenstore_test_listens.json'

    test_data_file = os.path.join(TEST_DATA_PATH, test_data_file_name)
    with open(test_data_file, 'r') as f:
        listens = json.load(f)

    test_data = []
    for listen in listens['payload']:
        listen['user_name'] = user_name
        listen['user_id'] = user_id
        test_data.append(Listen().from_json(listen))

    return test_data
Пример #3
0
    def test_to_timescale(self):
        listen = Listen(
            timestamp=int(time.time()),
            user_name='testuser',
            artist_msid=str(uuid.uuid4()),
            dedup_tag=3,
            user_id=1,
            data={
                'artist_name': 'Radiohead',
                'track_name': 'True Love Waits',
                'additional_info': {
                    'release_type': ["ALBUM", "REMIX"],
                    'recording_msid': str(uuid.uuid4()),
                }
            }
        )

        listened_at, track_name, user_name, data = listen.to_timescale()

        # Check data is of type string
        self.assertIsInstance(data, str)

        # Convert returned data to json
        json_data = ujson.loads(data)

        # Check that the required fields are dumped into data
        self.assertIn('track_metadata', json_data)
        self.assertIn('additional_info', json_data['track_metadata'])

        # Check that the required fields are dumped into data
        self.assertEqual(listened_at, listen.ts_since_epoch)
        self.assertEqual(track_name, listen.data['track_name'])
        self.assertEqual(user_name, listen.user_name)
        self.assertEqual(json_data['user_id'], listen.user_id)
        self.assertEqual(json_data['track_metadata']['artist_name'], listen.data['artist_name'])
Пример #4
0
    def test_update_and_get_recent_listens(self):

        recent = self._redis.get_recent_listens()
        self.assertEqual(recent, [])

        listens = []
        t = int(time.time())
        for i in range(RedisListenStore.RECENT_LISTENS_MAX * 3):
            listen = Listen(user_id=self.testuser['id'],
                            user_name=self.testuser['musicbrainz_id'],
                            timestamp=t - i,
                            data={
                                'artist_name': str(uuid.uuid4()),
                                'track_name': str(uuid.uuid4()),
                                'additional_info': {},
                            })
            listens.append(listen)
            self._redis.update_recent_listens(listens)

        recent = self._redis.get_recent_listens()
        self.assertEqual(len(recent), RedisListenStore.RECENT_LISTENS_MAX)
        self.assertIsInstance(recent[0], Listen)
        for i, r in enumerate(recent):
            self.assertEqual(r.timestamp, listens[i].timestamp)

        recent = self._redis.get_recent_listens(5)
        self.assertEqual(len(recent), 5)
        for i, r in enumerate(recent):
            self.assertEqual(r.timestamp, listens[i].timestamp)
Пример #5
0
def generate_data(test_user_id, user_name, from_ts, num_records, inserted_ts=None):
    test_data = []
    artist_msid = str(uuid.uuid4())

    for i in range(num_records):
        if not inserted_ts:
            inserted_timestamp = datetime.utcnow()
        else:
            inserted_timestamp = datetime.utcfromtimestamp(inserted_ts)
        timestamp = datetime.utcfromtimestamp(from_ts)
        item = Listen(
            user_name=user_name,
            user_id=test_user_id,
            timestamp=timestamp,
            artist_msid=artist_msid,
            recording_msid=str(uuid.uuid4()),
            inserted_timestamp=inserted_timestamp,
            data={
                'artist_name': 'Frank Ocean',
                'track_name': 'Crack Rock',
                'additional_info': {},
            },
        )
        test_data.append(item)
        from_ts += 1   # Add one second
        if inserted_ts:
            inserted_ts += 1   # Add one second

    return test_data
Пример #6
0
def generate_data(test_user_id, user_name, from_ts, num_records):
    test_data = []
    artist_msid = str(uuid.uuid4())

    if from_ts == None:  #check for playing now listens
        timestamp = None
    else:
        from_ts += 1  # Add one second
        timestamp = datetime.utcfromtimestamp(from_ts)

    for i in range(num_records):
        item = Listen(
            user_name=user_name,
            user_id=test_user_id,
            timestamp=timestamp,
            artist_msid=artist_msid,
            recording_msid=str(uuid.uuid4()),
            data={
                'artist_name': 'Frank Ocean',
                'track_name': 'Crack Rock',
                'additional_info': {},
            },
        )
        test_data.append(item)
    return test_data
Пример #7
0
def generate_data(from_date, num_records, user_name):
    test_data = []
    current_date = to_epoch(from_date)
    artist_msid = str(uuid.uuid4())

    user = db_user.get_by_mb_id(user_name)
    if not user:
        db_user.create(user_name)
        user = db_user.get_by_mb_id(user_name)

    for i in range(num_records):
        current_date += 1   # Add one second
        item = Listen(
            user_id=user['id'],
            user_name=user_name,
            timestamp=datetime.utcfromtimestamp(current_date),
            artist_msid=artist_msid,
            recording_msid=str(uuid.uuid4()),
            release_msid=str(uuid.uuid4()),
            data={
                'artist_name': 'Test Artist Pls ignore',
                'track_name': 'Hello Goodbye',
                'additional_info': {},
            },
        )
        test_data.append(item)
    return test_data
 def _create_test_data(self, user_name):
     test_data = []
     for jdata in TEST_LISTEN_JSON:
         x = ujson.loads(jdata)
         x['user_name'] = user_name
         test_data.append(Listen().from_json(x))
     self.logstore.insert(test_data)
     return len(test_data)
Пример #9
0
 def convert_row(self, row):
     return Listen(user_id=row[1],
                   user_name=row[2],
                   timestamp=row[3],
                   artist_msid=row[4],
                   release_msid=row[5],
                   recording_msid=row[6],
                   data=row[7])
Пример #10
0
def generate_data(test_user_id, from_ts, num_records):
    test_data = []
    artist_msid = str(uuid.uuid4())

    for i in range(num_records):
        from_ts += 1  # Add one second
        item = Listen(user_id=test_user_id,
                      timestamp=datetime.utcfromtimestamp(from_ts),
                      artist_msid=artist_msid,
                      recording_msid=str(uuid.uuid4()))
        test_data.append(item)
    return test_data
Пример #11
0
def create_test_data_for_influxlistenstore(user_name):
    """Create listens for influxlistenstore tests.

    From a json file 'influx_listenstore_test_listens.json' in testdata
    it creates Listen objects with a specified user_name for tests.

    Args:
        user_name (str): MusicBrainz username of a user.

    Returns:
        A list of Listen objects.
    """
    test_data_file = os.path.join(TEST_DATA_PATH,
                                  'influx_listenstore_test_listens.json')
    with open(test_data_file, 'r') as f:
        listens = json.load(f)

    test_data = []
    for listen in listens['payload']:
        listen['user_name'] = user_name
        test_data.append(Listen().from_json(listen))

    return test_data
Пример #12
0
    def test_export_streaming(self, mock_fetch_listens):
        self.temporary_login(self.user['login_id'])

        # Three example listens, with only basic data for the purpose of this test.
        # In each listen, one of {release_artist, release_msid, recording_msid}
        # is missing.
        listens = [
            Listen(
                timestamp=1539509881,
                artist_msid='61746abb-76a5-465d-aee7-c4c42d61b7c4',
                recording_msid='6c617681-281e-4dae-af59-8e00f93c4376',
                data={
                    'artist_name': 'Massive Attack',
                    'track_name': 'The Spoils',
                    'additional_info': {},
                },
            ),
            Listen(
                timestamp=1539441702,
                release_msid='0c1d2dc3-3704-4e75-92f9-940801a1eebd',
                recording_msid='7ad53fd7-5b40-4e13-b680-52716fb86d5f',
                data={
                    'artist_name': 'Snow Patrol',
                    'track_name': 'Lifening',
                    'additional_info': {},
                },
            ),
            Listen(
                timestamp=1539441531,
                release_msid='7816411a-2cc6-4e43-b7a1-60ad093c2c31',
                artist_msid='7e2c6fe4-3e3f-496e-961d-dce04a44f01b',
                data={
                    'artist_name': 'Muse',
                    'track_name': 'Drones',
                    'additional_info': {},
                },
            ),
        ]

        # We expect three calls to fetch_listens, and we return two, one, and
        # zero listens in the batch. This tests that we fetch all batches.
        mock_fetch_listens.side_effect = [listens[0:2], listens[2:3], []]

        r = self.client.post(url_for('profile.export_data'))
        self.assert200(r)

        # r.json returns None, so we decode the response manually.
        results = ujson.loads(r.data.decode('utf-8'))

        self.assertDictEqual(
            results[0], {
                'inserted_at': 0,
                'listened_at': 1539509881,
                'recording_msid': '6c617681-281e-4dae-af59-8e00f93c4376',
                'user_name': None,
                'track_metadata': {
                    'artist_name': 'Massive Attack',
                    'track_name': 'The Spoils',
                    'additional_info': {
                        'artist_msid': '61746abb-76a5-465d-aee7-c4c42d61b7c4',
                        'release_msid': None,
                    },
                },
            })
        self.assertDictEqual(
            results[1], {
                'inserted_at': 0,
                'listened_at': 1539441702,
                'recording_msid': '7ad53fd7-5b40-4e13-b680-52716fb86d5f',
                'user_name': None,
                'track_metadata': {
                    'artist_name': 'Snow Patrol',
                    'track_name': 'Lifening',
                    'additional_info': {
                        'artist_msid': None,
                        'release_msid': '0c1d2dc3-3704-4e75-92f9-940801a1eebd',
                    },
                },
            })
        self.assertDictEqual(
            results[2], {
                'inserted_at': 0,
                'listened_at': 1539441531,
                'recording_msid': None,
                'user_name': None,
                'track_metadata': {
                    'artist_name': 'Muse',
                    'track_name': 'Drones',
                    'additional_info': {
                        'artist_msid': '7e2c6fe4-3e3f-496e-961d-dce04a44f01b',
                        'release_msid': '7816411a-2cc6-4e43-b7a1-60ad093c2c31',
                    },
                },
            })