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)
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"])
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"])
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)