def test_update_rating_when_feedback_already_exits(self):
        update_fb = self.sample_feedback[0]

        self.insert_test_data()
        result = db_feedback.get_feedback_for_user(user_id=self.user["id"], limit=25, offset=0)
        self.assertEqual(len(result), 1)
        self.assertEqual(result[0].recording_mbid, update_fb['recording_mbid'])
        self.assertEqual(result[0].rating, 'love')

        new_rating = "like"  # change the score to -1

        # update a record by inserting a record with updated score value
        db_feedback.insert(
            RecommendationFeedbackSubmit(
                user_id=self.user["id"],
                recording_mbid=update_fb["recording_mbid"],
                rating=new_rating
            )
        )

        result = db_feedback.get_feedback_for_user(user_id=self.user["id"], limit=25, offset=0)
        self.assertEqual(len(result), 1)

        self.assertEqual(result[0].recording_mbid, update_fb["recording_mbid"])
        self.assertEqual(result[0].rating, 'like')
    def insert_test_data(self):
        """ Insert test data into the database """

        for fb in self.sample_feedback:
            db_feedback.insert(
                RecommendationFeedbackSubmit(
                    user_id=fb['user_id'],
                    recording_mbid=fb["recording_mbid"],
                    rating=fb["rating"]
                )
            )
Example #3
0
    def test_create_feedback(self, mock_notify):

        self.user = db_user.get_or_create(1, "ernie")
        self.user2 = db_user.get_or_create(2, "bert")
        sample_feedback = [{
            "user_id": self.user['id'],
            "recording_msid": "d23f4719-9212-49f0-ad08-ddbfbfc50d6f",
            "score": 1
        }, {
            "user_id": self.user2['id'],
            "recording_msid": "222eb00d-9ead-42de-aec9-8f8c1509413d",
            "score": -1
        }]
        for fb in sample_feedback:
            db_feedback.insert(
                Feedback(user_id=fb["user_id"],
                         recording_msid=fb["recording_msid"],
                         score=fb["score"]))

        rec_feedback = [{
            "recording_mbid": "d23f4719-9212-49f0-ad08-ddbfbfc50d6f",
            "rating": 'love',
            'user_id': self.user['id']
        }, {
            "recording_mbid": "222eb00d-9ead-42de-aec9-8f8c1509413d",
            "rating": 'bad_recommendation',
            "user_id": self.user['id']
        }, {
            "recording_mbid": "922eb00d-9ead-42de-aec9-8f8c1509413d",
            "rating": 'hate',
            "user_id": self.user2['id']
        }]
        for fb in rec_feedback:
            db_rec_feedback.insert(
                RecommendationFeedbackSubmit(
                    user_id=fb['user_id'],
                    recording_mbid=fb["recording_mbid"],
                    rating=fb["rating"]))

        # create a feedback dump
        self.runner.invoke(dump_manager.create_feedback,
                           ['--location', self.tempdir])
        self.assertEqual(len(os.listdir(self.tempdir)), 1)
        dump_name = os.listdir(self.tempdir)[0]
        mock_notify.assert_called_with(dump_name, 'feedback')

        # make sure that the dump contains a feedback dump
        archive_count = 0
        for file_name in os.listdir(os.path.join(self.tempdir, dump_name)):
            if file_name.endswith('.tar.xz'):
                archive_count += 1
        self.assertEqual(archive_count, 1)
def submit_recommendation_feedback():
    """
    Submit recommendation feedback. A user token (found on  https://listenbrainz.org/profile/ )
    must be provided in the Authorization header! Each request should contain only one feedback in the payload.

    A sample feedback may look like:

    .. code-block:: json

        {
            "recording_mbid": "d23f4719-9212-49f0-ad08-ddbfbfc50d6f",
            "rating": "love"
        }

    :reqheader Authorization: Token <user token>
    :statuscode 200: feedback accepted.
    :statuscode 400: invalid JSON sent, see error message for details.
    :statuscode 401: invalid authorization. See error message for details.
    :resheader Content-Type: *application/json*
    """
    user = validate_auth_header()

    data = request.json

    if 'recording_mbid' not in data or 'rating' not in data:
        log_raise_400("JSON document must contain recording_mbid and rating",
                      data)

    if 'recording_mbid' in data and 'rating' in data and len(data) > 2:
        log_raise_400(
            "JSON document must only contain recording_mbid and rating", data)

    try:
        feedback_submit = RecommendationFeedbackSubmit(
            user_id=user["id"],
            recording_mbid=data["recording_mbid"],
            rating=data["rating"])
    except ValidationError as e:
        log_raise_400(
            "Invalid JSON document submitted: %s" %
            str(e).replace("\n ", ":").replace("\n", " "), data)

    try:
        db_feedback.insert(feedback_submit)
    except Exception as e:
        current_app.logger.error(
            "Error while inserting recommendation feedback: {}".format(e))
        raise APIInternalServerError("Something went wrong. Please try again.")

    return jsonify({'status': 'ok'})
Example #5
0
    def insert_test_data(self):
        sample_feedback = [{
            "recording_mbid": "222eb00d-9ead-42de-aec9-8f8c1509413d",
            "rating": 'bad_recommendation',
            "user_id": self.user1['id']
        }, {
            "recording_mbid": "922eb00d-9ead-42de-aec9-8f8c1509413d",
            "rating": 'hate',
            "user_id": self.user1['id']
        }]

        for fb in sample_feedback:
            db_feedback.insert(
                RecommendationFeedbackSubmit(
                    user_id=fb['user_id'],
                    recording_mbid=fb["recording_mbid"],
                    rating=fb["rating"]))

        return sample_feedback
Example #6
0
    def test_get_feedback_for_user_for_count_and_offset(self):
        """ Test to make sure valid response is received when count rating is passed """
        feedback_love = []
        for i in range(110):
            rec_mbid = str(uuid.uuid4())
            db_feedback.insert(
                RecommendationFeedbackSubmit(user_id=self.user2['id'],
                                             recording_mbid=rec_mbid,
                                             rating='love'))

            # prepended to the list since ``get_feedback_for_users`` returns data in descending
            # order of creation.
            feedback_love.insert(0, {
                'recording_mbid': rec_mbid,
                'rating': 'love'
            })
        # check for count
        response = self.client.get(url_for(
            "recommendation_feedback_api_v1.get_feedback_for_user",
            user_name=self.user2["musicbrainz_id"]),
                                   query_string={"count": 10})
        self.assert200(response)
        data = json.loads(response.data)

        self.assertEqual(data["count"], 10)
        self.assertEqual(data["total_count"], 110)
        self.assertEqual(data["offset"], 0)
        self.assertEqual(data["user_name"], self.user2['musicbrainz_id'])

        feedback = data["feedback"]
        self.assertEqual(len(feedback), 10)
        for i in range(10):
            self.assertEqual(feedback[i]['recording_mbid'],
                             feedback_love[i]['recording_mbid'])
            self.assertEqual(feedback[i]['rating'], feedback_love[i]['rating'])

        # check for offset
        response = self.client.get(url_for(
            "recommendation_feedback_api_v1.get_feedback_for_user",
            user_name=self.user2["musicbrainz_id"]),
                                   query_string={"offset": 90})
        self.assert200(response)
        data = json.loads(response.data)

        self.assertEqual(data["count"], 20)
        self.assertEqual(data["total_count"], 110)
        self.assertEqual(data["offset"], 90)
        self.assertEqual(data["user_name"], self.user2['musicbrainz_id'])

        feedback = data[
            "feedback"]  # sorted in descending order of their creation
        self.assertEqual(len(feedback), 20)
        for i in range(10):
            self.assertEqual(feedback[i]['recording_mbid'],
                             feedback_love[i + 90]['recording_mbid'])
            self.assertEqual(feedback[i]['rating'],
                             feedback_love[i + 90]['rating'])
        # check for feedback, too many
        response = self.client.get(url_for(
            "recommendation_feedback_api_v1.get_feedback_for_user",
            user_name=self.user2["musicbrainz_id"]),
                                   query_string={"count": 110})
        self.assert200(response)
        data = json.loads(response.data)

        self.assertEqual(data["count"], 100)
        self.assertEqual(data["total_count"], 110)
        self.assertEqual(data["offset"], 0)
        self.assertEqual(data["user_name"], self.user2['musicbrainz_id'])

        feedback = data[
            "feedback"]  # sorted in descending order of their creation
        self.assertEqual(len(feedback), 100)
        for i in range(100):
            self.assertEqual(feedback[i]['recording_mbid'],
                             feedback_love[i]['recording_mbid'])
            self.assertEqual(feedback[i]['rating'], feedback_love[i]['rating'])
    def test_get_feedback_for_user(self):
        self.insert_test_data()
        result = db_feedback.get_feedback_for_user(user_id=self.user["id"], limit=25, offset=0)
        self.assertEqual(len(result), 1)

        self.assertEqual(result[0].user_id, self.user["id"])
        self.assertEqual(result[0].recording_mbid, self.sample_feedback[0]["recording_mbid"])
        self.assertEqual(result[0].rating, self.sample_feedback[0]["rating"])

        feedback_love = []
        for i in range(60):
            submit_obj = RecommendationFeedbackSubmit(
                user_id=self.user2['id'],
                recording_mbid=str(uuid.uuid4()),
                rating='love'
            )

            db_feedback.insert(submit_obj)
            # prepended to the list since ``get_feedback_for_users`` returns data in descending
            # order of creation.
            feedback_love.insert(0, submit_obj)

        feedback_hate = []
        for i in range(50):
            submit_obj = RecommendationFeedbackSubmit(
                user_id=self.user2['id'],
                recording_mbid=str(uuid.uuid4()),
                rating='hate'
            )

            db_feedback.insert(submit_obj)
            # prepended to the list since ``get_feedback_for_users`` returns data in descending
            # order of creation.
            feedback_hate.insert(0, submit_obj)
        # ``get_feddback_for_user`` will return feedback_hate data followed by feedback_love
        # data
        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=120, offset=0)
        self.assertEqual(len(result), 110)

        # test the rating argument
        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=70, offset=0, rating='love')
        self.assertEqual(len(result), 60)
        for i in range(60):
            self.assertEqual(result[i].user_id, feedback_love[i].user_id)
            self.assertEqual(result[i].recording_mbid, feedback_love[i].recording_mbid)
            self.assertEqual(result[i].rating, feedback_love[i].rating)

        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=70, offset=0, rating='hate')
        self.assertEqual(len(result), 50)
        for i in range(50):
            self.assertEqual(result[i].user_id, feedback_hate[i].user_id)
            self.assertEqual(result[i].recording_mbid, feedback_hate[i].recording_mbid)
            self.assertEqual(result[i].rating, feedback_hate[i].rating)

        # test the limit argument
        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=20, offset=0, rating='love')
        self.assertEqual(len(result), 20)
        for i in range(20):
            self.assertEqual(result[i].user_id, feedback_love[i].user_id)
            self.assertEqual(result[i].recording_mbid, feedback_love[i].recording_mbid)
            self.assertEqual(result[i].rating, feedback_love[i].rating)

        # test the offset argument
        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=25, offset=10)
        self.assertEqual(len(result), 25)
        for i in range(25):
            self.assertEqual(result[i].user_id, feedback_hate[i+10].user_id)
            self.assertEqual(result[i].recording_mbid, feedback_hate[i+10].recording_mbid)
            self.assertEqual(result[i].rating, feedback_hate[i+10].rating)

        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=25, offset=100)
        self.assertEqual(len(result), 10)
        for i in range(10):
            self.assertEqual(result[i].user_id, feedback_love[i+50].user_id)
            self.assertEqual(result[i].recording_mbid, feedback_love[i+50].recording_mbid)
            self.assertEqual(result[i].rating, feedback_love[i+50].rating)

        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=30, offset=110)
        self.assertEqual(len(result), 0)

        result = db_feedback.get_feedback_for_user(user_id=self.user2['id'], limit=30, offset=30, rating='hate')
        self.assertEqual(len(result), 20)
        for i in range(20):
            self.assertEqual(result[i].user_id, feedback_hate[i+30].user_id)
            self.assertEqual(result[i].recording_mbid, feedback_hate[i+30].recording_mbid)
            self.assertEqual(result[i].rating, feedback_hate[i+30].rating)