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 test_insert(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)

        result = db_feedback.get_feedback_for_user(user_id=self.user1['id'], limit=25, offset=0)
        self.assertEqual(len(result), 2)
コード例 #3
0
    def test_recommendation_feedback_update_rating(self):
        """
        Test to check that rating gets updated when a user changes feedback rating for a recording_mbid
        """
        feedback = {
            "recording_mbid": "7babc9be-ca2b-4544-b932-7c9ab38770d6",
            "rating": "love"
        }

        response = self.client.post(url_for(
            "recommendation_feedback_api_v1.submit_recommendation_feedback"),
                                    data=json.dumps(feedback),
                                    headers={
                                        "Authorization":
                                        "Token {}".format(
                                            self.user["auth_token"])
                                    },
                                    content_type="application/json")
        self.assert200(response)
        self.assertEqual(response.json["status"], "ok")

        result = db_feedback.get_feedback_for_user(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, feedback["recording_mbid"])
        self.assertEqual(result[0].rating, feedback["rating"])

        # submit an updated feedback for the same recording_mbid with new rating = "bad_recommendation"
        updated_feedback = {
            "recording_mbid": "7babc9be-ca2b-4544-b932-7c9ab38770d6",
            "rating": "bad_recommendation"
        }

        response = self.client.post(url_for(
            "recommendation_feedback_api_v1.submit_recommendation_feedback"),
                                    data=json.dumps(updated_feedback),
                                    headers={
                                        "Authorization":
                                        "Token {}".format(
                                            self.user["auth_token"])
                                    },
                                    content_type="application/json")
        self.assert200(response)
        self.assertEqual(response.json["status"], "ok")

        # check that the record gets updated
        result = db_feedback.get_feedback_for_user(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,
                         updated_feedback["recording_mbid"])
        self.assertEqual(result[0].rating, updated_feedback["rating"])
コード例 #4
0
    def test_recommendation_feedback_delete(self):
        """ Test for submission of valid feedback """
        feedback = {
            "recording_mbid": "7babc9be-ca2b-4544-b932-7c9ab38770d6",
            "rating": 'love'
        }

        response = self.client.post(url_for(
            "recommendation_feedback_api_v1.submit_recommendation_feedback"),
                                    data=json.dumps(feedback),
                                    headers={
                                        "Authorization":
                                        "Token {}".format(
                                            self.user["auth_token"])
                                    },
                                    content_type="application/json")
        self.assert200(response)
        self.assertEqual(response.json["status"], "ok")

        result = db_feedback.get_feedback_for_user(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, feedback["recording_mbid"])
        self.assertEqual(result[0].rating, feedback["rating"])

        response = self.client.post(url_for(
            "recommendation_feedback_api_v1.delete_recommendation_feedback"),
                                    data=json.dumps({
                                        "recording_mbid":
                                        "7babc9be-ca2b-4544-b932-7c9ab38770d6",
                                    }),
                                    headers={
                                        "Authorization":
                                        "Token {}".format(
                                            self.user["auth_token"])
                                    },
                                    content_type="application/json")
        self.assert200(response)
        self.assertEqual(response.json["status"], "ok")

        # check that the record gets deleted
        result = db_feedback.get_feedback_for_user(self.user["id"],
                                                   limit=25,
                                                   offset=0)
        self.assertEqual(len(result), 0)
    def test_delete(self):
        del_fb = self.sample_feedback[1]

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

        db_feedback.delete(
            RecommendationFeedbackDelete(
                user_id=self.user1["id"],
                recording_mbid=del_fb["recording_mbid"],
            )
        )

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

        self.assertNotEqual(result[0].recording_mbid, del_fb["recording_mbid"])
コード例 #6
0
def get_feedback_for_user(user_name):
    """
    Get feedback given by user ``user_name``.

    A sample response may look like:

    .. code-block:: json

        {
            "count": 1,
            "feedback": [
                {
                    "created": "1345679998",
                    "recording_mbid": "d23f4719-9212-49f0-ad08-ddbfbfc50d6f",
                    "rating": "love"
                },
                "-- more feedback data here ---"
            ],
            "offset": 0,
            "total_count": 1,
            "user_name": "Vansika"
        }

    If the optional argument ``rating`` is not given, this endpoint will return all the feedback submitted by the user.
    Otherwise filters the feedback to be returned by rating.

    :param rating: Optional, refer to db/model/recommendation_feedback.py for allowed rating values.
    :type rating: ``str``
    :param count: Optional, number of feedback items to return, Default: :data:`~webserver.views.api.DEFAULT_ITEMS_PER_GET`
        Max: :data:`~webserver.views.api.MAX_ITEMS_PER_GET`.
    :type count: ``int``
    :param offset: Optional, number of feedback items to skip from the beginning, for pagination.
        Ex. An offset of 5 means the top 5 feedback will be skipped, defaults to 0.
    :type offset: ``int``
    :statuscode 200: Yay, you have data!
    :statuscode 404: User not found.
    :statuscode 400: Bad request, check ``response['error']`` for more details
    :resheader Content-Type: *application/json*
    """
    user = db_user.get_by_mb_id(user_name)
    if user is None:
        raise APINotFound("Cannot find user: {}".format(user_name))

    rating = request.args.get('rating')

    if rating:
        expected_rating = get_allowed_ratings()
        if rating not in expected_rating:
            log_raise_400("Rating must be in {}".format(expected_rating), request.args)

    offset = get_non_negative_param('offset', default=0)
    count = get_non_negative_param('count', default=DEFAULT_ITEMS_PER_GET)

    count = min(count, MAX_ITEMS_PER_GET)

    feedback = db_feedback.get_feedback_for_user(user_id=user["id"], limit=count, offset=offset, rating=rating)
    total_count = db_feedback.get_feedback_count_for_user(user["id"])

    feedback = [_format_feedback(fb) for fb in feedback]

    return jsonify({
        "feedback": feedback,
        "count": len(feedback),
        "total_count": total_count,
        "offset": offset,
        "user_name": user["musicbrainz_id"]
    })
    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)