def test_submit_handler_foreignid(conn):
    values = {'format': 'json', 'client': 'app1key', 'user': '******',
        'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP, 'bitrate': 192,
        'foreignid': 'foo:123', 'fileformat': 'FLAC'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = SubmitHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {"status": "ok"}
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    query = tables.submission.select().order_by(tables.submission.c.id.desc()).limit(1)
    submission = conn.execute(query).fetchone()
    assert_equals(None, submission['mbid'])
    assert_equals(None, submission['puid'])
    assert_equals(1, submission['foreignid_id'])
    assert_equals(1, submission['format_id'])
    assert_equals(192, submission['bitrate'])
    assert_equals(TEST_1_FP_RAW, submission['fingerprint'])
    assert_equals(TEST_1_LENGTH, submission['length'])
    query = tables.foreignid_vendor.select().order_by(tables.foreignid_vendor.c.id.desc()).limit(1)
    row = conn.execute(query).fetchone()
    assert_equals(1, row['id'])
    assert_equals('foo', row['name'])
    query = tables.foreignid.select().order_by(tables.foreignid.c.id.desc()).limit(1)
    row = conn.execute(query).fetchone()
    assert_equals(1, row['id'])
    assert_equals(1, row['vendor_id'])
    assert_equals('123', row['name'])
示例#2
0
def test_submit_handler_foreignid(ctx):
    # type: (ScriptContext) -> None
    values = {
        'format': 'json',
        'client': 'app1key',
        'user': '******',
        'duration': str(TEST_1_LENGTH),
        'fingerprint': TEST_1_FP,
        'bitrate': 192,
        'foreignid': 'foo:123',
        'fileformat': 'FLAC'
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = SubmitHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        u'status': u'ok',
        u'submissions': [{
            u'status': u'pending',
            u'id': 1
        }]
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    query = tables.submission.select().order_by(
        tables.submission.c.id.desc()).limit(1)
    submission = ctx.db.get_ingest_db().execute(query).fetchone()
    assert_equals(None, submission['mbid'])
    assert_equals(None, submission['puid'])
    assert_equals('foo:123', submission['foreignid'])
    assert_equals('FLAC', submission['format'])
    assert_equals(192, submission['bitrate'])
    assert_equals(TEST_1_FP_RAW, submission['fingerprint'])
    assert_equals(TEST_1_LENGTH, submission['length'])
def test_submit_handler_with_meta(conn):
    values = {'format': 'json', 'client': 'app1key', 'user': '******',
        'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP, 'bitrate': 192,
        'mbid': 'b9c05616-1874-4d5d-b30e-6b959c922d28', 'fileformat': 'FLAC',
        'track': 'Voodoo People',
        'artist': 'The Prodigy',
        'album': 'Music For The Jitled People',
        'albumartist': 'Prodigy',
        'trackno': '2',
        'discno': '3',
        'year': '2030'
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = SubmitHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {"status": "ok"}
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    query = tables.submission.select().order_by(tables.submission.c.id.desc()).limit(1)
    submission = conn.execute(query).fetchone()
    assert_equals('b9c05616-1874-4d5d-b30e-6b959c922d28', submission['mbid'])
    assert_equals(1, submission['meta_id'])
    row = conn.execute("SELECT * FROM meta WHERE id=1").fetchone()
    expected = {
        'id': 1,
        'track': 'Voodoo People',
        'artist': 'The Prodigy',
        'album': 'Music For The Jitled People',
        'album_artist': 'Prodigy',
        'track_no': 2,
        'disc_no': 3,
        'year': 2030
    }
    assert_equals(expected, dict(row))
def test_apihandler_ws_error(conn):
    values = {'format': 'json'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = WebServiceErrorHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "error",
        "error": {
            "message": "invalid API key",
            "code": 4,
        }
    }
    assert_json_equals(expected, resp.data)
    assert_equals('400 BAD REQUEST', resp.status)
    handler = InternalErrorHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "error",
        "error": {
            "message": "internal error",
            "code": 5,
        }
    }
    assert_json_equals(expected, resp.data)
    assert_equals('500 INTERNAL SERVER ERROR', resp.status)
示例#5
0
def test_apihandler_ws_error(conn):
    values = {'format': 'json'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = WebServiceErrorHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "error",
        "error": {
            "message": "invalid API key",
            "code": 4,
        }
    }
    assert_json_equals(expected, resp.data)
    assert_equals('400 BAD REQUEST', resp.status)
    handler = InternalErrorHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "error",
        "error": {
            "message": "internal error",
            "code": 5,
        }
    }
    assert_json_equals(expected, resp.data)
    assert_equals('500 INTERNAL SERVER ERROR', resp.status)
示例#6
0
def test_submit_handler_puid(conn):
    values = {
        'format': 'json',
        'client': 'app1key',
        'user': '******',
        'duration': str(TEST_1_LENGTH),
        'fingerprint': TEST_1_FP,
        'bitrate': 192,
        'puid': 'b9c05616-1874-4d5d-b30e-6b959c922d28',
        'fileformat': 'FLAC'
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = SubmitHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {"status": "ok"}
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    query = tables.submission.select().order_by(
        tables.submission.c.id.desc()).limit(1)
    submission = conn.execute(query).fetchone()
    assert_equals(None, submission['mbid'])
    assert_equals('b9c05616-1874-4d5d-b30e-6b959c922d28', submission['puid'])
    assert_equals(1, submission['format_id'])
    assert_equals(192, submission['bitrate'])
    assert_equals(TEST_1_FP_RAW, submission['fingerprint'])
    assert_equals(TEST_1_LENGTH, submission['length'])
示例#7
0
def test_ok():
    handler = APIHandler()
    resp = handler._ok({'tracks': [{'id': 1, 'name': 'Track 1'}]}, 'json')
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {"status": "ok", "tracks": [{"id": 1, "name": "Track 1"}]}
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
示例#8
0
def test_submit_handler_with_meta(conn):
    values = {
        'format': 'json',
        'client': 'app1key',
        'user': '******',
        'duration': str(TEST_1_LENGTH),
        'fingerprint': TEST_1_FP,
        'bitrate': 192,
        'mbid': 'b9c05616-1874-4d5d-b30e-6b959c922d28',
        'fileformat': 'FLAC',
        'track': 'Voodoo People',
        'artist': 'The Prodigy',
        'album': 'Music For The Jitled People',
        'albumartist': 'Prodigy',
        'trackno': '2',
        'discno': '3',
        'year': '2030'
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = SubmitHandler.create_from_server(tests.script, conn=conn)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        u'status': u'ok',
        u'submissions': [{
            u'status': u'pending',
            u'id': 1
        }]
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    query = tables.submission.select().order_by(
        tables.submission.c.id.desc()).limit(1)
    submission = conn.execute(query).fetchone()
    assert_equals('b9c05616-1874-4d5d-b30e-6b959c922d28', submission['mbid'])
    assert_equals(3, submission['meta_id'])
    row = conn.execute("SELECT * FROM meta WHERE id=%s",
                       submission['meta_id']).fetchone()
    expected = {
        'id': submission['meta_id'],
        'track': 'Voodoo People',
        'artist': 'The Prodigy',
        'album': 'Music For The Jitled People',
        'album_artist': 'Prodigy',
        'track_no': 2,
        'disc_no': 3,
        'year': 2030
    }
    assert_equals(expected, dict(row))
示例#9
0
def test_apihandler_ws_error_500(ctx):
    # type: (ScriptContext) -> None
    values = {'format': 'json'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = InternalErrorHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "error",
        "error": {
            "message": "internal error",
            "code": 5,
        }
    }
    assert_json_equals(expected, resp.data)
    assert_equals('500 INTERNAL SERVER ERROR', resp.status)
示例#10
0
def test_apihandler_ws_error_400(ctx):
    # type: (ScriptContext) -> None
    values = {'format': 'json'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = WebServiceErrorHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "error",
        "error": {
            "message": "invalid API key",
            "code": 4,
        }
    }
    assert_json_equals(expected, resp.data)
    assert_equals('400 BAD REQUEST', resp.status)
示例#11
0
def test_error():
    handler = APIHandler()
    resp = handler._error(123, 'something is wrong', 'json')
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "error",
        "error": {
            "message": "something is wrong",
            "code": 123
        }
    }
    assert_json_equals(expected, resp.data)
    assert_equals('400 BAD REQUEST', resp.status)
    resp = handler._error(234, 'oops', 'json', status=500)
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {"status": "error", "error": {"message": "oops", "code": 234}}
    assert_json_equals(expected, resp.data)
    assert_equals('500 INTERNAL SERVER ERROR', resp.status)
示例#12
0
def test_lookup_handler(conn):
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    # no matches
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": []
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match
    prepare_database(conn, """
INSERT INTO fingerprint (length, fingerprint, track_id, submission_count)
    VALUES (%s, %s, 1, 1);
""", (TEST_1_LENGTH, TEST_1_FP_RAW))
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score": 1.0,
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match with MBIDs
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP, 'meta': '1'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score": 1.0,
            "recordings": [{"id": "b81f83ee-4da4-11e0-9ed8-0025225356f3"}],
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match with MBIDs and metadata
    prepare_database(conn, "INSERT INTO track_mbid (track_id, mbid, submission_count) VALUES (1, '373e6728-35e3-4633-aab1-bf7092ec43d8', 1)")
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP, 'meta': '2'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score": 1.0,
            "recordings": [{
                "id": "373e6728-35e3-4633-aab1-bf7092ec43d8",
            }, {
                "id": "b81f83ee-4da4-11e0-9ed8-0025225356f3",
                "duration": 123,
                "tracks": [{
                    "title": "Track A",
                    "duration": 123,
                    "position": 1,
                    "medium": {
                        "track_count": 2,
                        "position": 1,
                        "format": "DVD",
                        "release": {
                            "id": "1d4d546f-e2ec-4553-8df7-9004298924d5",
                            "title": "Album A",
                        },
                    },
                    "artists": [{
                            "id": "a64796c0-4da4-11e0-bf81-0025225356f3",
                            "name": "Artist A",
                    }],
                }, {
                    "title": "Track A",
                    "duration": 123,
                    "position": 1,
                    "medium": {
                        "track_count": 2,
                        "position": 1,
                        "format": "CD",
                        "release": {
                            "id": "dd6c2cca-a0e9-4cc4-9a5f-7170bd098e23",
                            "title": "Album A",
                        },
                    },
                    "artists": [{
                            "id": "a64796c0-4da4-11e0-bf81-0025225356f3",
                            "name": "Artist A",
                    }],
                }],
            }],
        }]
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # duplicate fingerprint
    prepare_database(conn, """
INSERT INTO fingerprint (length, fingerprint, track_id, submission_count)
    VALUES (%s, %s, 1, 1);
""", (TEST_1_LENGTH, TEST_1_FP_RAW))
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score": 1.0,
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
示例#13
0
def test_lookup_handler(ctx):
    # type: (ScriptContext) -> None
    values = {
        'format': 'json',
        'client': 'app1key',
        'duration': str(TEST_1_LENGTH),
        'fingerprint': TEST_1_FP
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(ctx)
    # no matches
    handler = LookupHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {"status": "ok", "results": []}  # type: Dict[str, Any]
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match
    prepare_database(
        ctx, """
INSERT INTO fingerprint (length, fingerprint, track_id, submission_count)
    VALUES (%s, %s, 1, 1);
""", (TEST_1_LENGTH, TEST_1_FP_RAW))
    handler = LookupHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status":
        "ok",
        "results": [{
            "id": 'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score": 1.0,
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match with MBIDs
    values = {
        'format': 'json',
        'client': 'app1key',
        'duration': str(TEST_1_LENGTH),
        'fingerprint': TEST_1_FP,
        'meta': '1'
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status":
        "ok",
        "results": [{
            "id":
            'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score":
            1.0,
            "recordings": [{
                "id": "b81f83ee-4da4-11e0-9ed8-0025225356f3"
            }],
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match with MBIDs and metadata
    prepare_database(
        ctx,
        "INSERT INTO track_mbid (track_id, mbid, submission_count) VALUES (1, '373e6728-35e3-4633-aab1-bf7092ec43d8', 1)"
    )
    values = {
        'format': 'json',
        'client': 'app1key',
        'duration': str(TEST_1_LENGTH),
        'fingerprint': TEST_1_FP,
        'meta': '2'
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status":
        "ok",
        "results": [{
            "id":
            'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score":
            1.0,
            "recordings": [{
                "id": "373e6728-35e3-4633-aab1-bf7092ec43d8",
            }, {
                "id":
                "b81f83ee-4da4-11e0-9ed8-0025225356f3",
                "duration":
                123,
                "tracks": [{
                    "title":
                    "Track A",
                    "duration":
                    123,
                    "position":
                    1,
                    "medium": {
                        "track_count": 2,
                        "position": 1,
                        "format": "DVD",
                        "release": {
                            "id": "1d4d546f-e2ec-4553-8df7-9004298924d5",
                            "title": "Album A",
                        },
                    },
                    "artists": [{
                        "id": "a64796c0-4da4-11e0-bf81-0025225356f3",
                        "name": "Artist A",
                    }],
                }, {
                    "title":
                    "Track A",
                    "duration":
                    123,
                    "position":
                    1,
                    "medium": {
                        "track_count": 2,
                        "position": 1,
                        "format": "CD",
                        "release": {
                            "id": "dd6c2cca-a0e9-4cc4-9a5f-7170bd098e23",
                            "title": "Album A",
                        },
                    },
                    "artists": [{
                        "id": "a64796c0-4da4-11e0-bf81-0025225356f3",
                        "name": "Artist A",
                    }],
                }],
            }],
        }]
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # duplicate fingerprint
    prepare_database(
        ctx, """
INSERT INTO fingerprint (length, fingerprint, track_id, submission_count)
    VALUES (%s, %s, 1, 1);
""", (TEST_1_LENGTH, TEST_1_FP_RAW))
    values = {
        'format': 'json',
        'client': 'app1key',
        'duration': str(TEST_1_LENGTH),
        'fingerprint': TEST_1_FP
    }
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(ctx)
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status":
        "ok",
        "results": [{
            "id": 'eb31d1c3-950e-468b-9e36-e46fa75b1291',
            "score": 1.0,
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
示例#14
0
def test_lookup_handler(conn):
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    # no matches
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": []
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match
    prepare_database(conn, """
INSERT INTO fingerprint (length, fingerprint, source_id, track_id)
    VALUES (%s, %s, 1, 1);
""", (TEST_1_LENGTH, TEST_1_FP_RAW))
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 1,
            "score": 1.0,
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match with MBIDs
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP, 'meta': '1'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 1,
            "score": 1.0,
            "recordings": [{"id": "b81f83ee-4da4-11e0-9ed8-0025225356f3"}],
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # one exact match with MBIDs and metadata
    prepare_database(conn, "INSERT INTO track_mbid (track_id, mbid) VALUES (1, '373e6728-35e3-4633-aab1-bf7092ec43d8')")
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP, 'meta': '2'}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 1,
            "score": 1.0,
            "recordings": [{
                "id": "373e6728-35e3-4633-aab1-bf7092ec43d8",
            }, {
                "id": "b81f83ee-4da4-11e0-9ed8-0025225356f3",
                "tracks": [{
                    "title": "Track A",
                    "duration": 123,
                    "position": 1,
                    "medium": {
                        "track_count": 2,
                        "release": {
                            "id": "dd6c2cca-a0e9-4cc4-9a5f-7170bd098e23",
                            "title": "Album A",
                        },
                    },
                    "artist": {
                        "id": "a64796c0-4da4-11e0-bf81-0025225356f3",
                        "name": "Artist A",
                    },
                }],
            }],
        }]
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)
    # duplicate fingerprint
    prepare_database(conn, """
INSERT INTO fingerprint (length, fingerprint, source_id, track_id)
    VALUES (%s, %s, 1, 1);
""", (TEST_1_LENGTH, TEST_1_FP_RAW))
    values = {'format': 'json', 'client': 'app1key', 'duration': str(TEST_1_LENGTH), 'fingerprint': TEST_1_FP}
    builder = EnvironBuilder(method='POST', data=values)
    handler = LookupHandler(connect=provider(conn))
    resp = handler.handle(Request(builder.get_environ()))
    assert_equals('application/json; charset=UTF-8', resp.content_type)
    expected = {
        "status": "ok",
        "results": [{
            "id": 1,
            "score": 1.0,
        }],
    }
    assert_json_equals(expected, resp.data)
    assert_equals('200 OK', resp.status)