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