def test_another_user_cannot_CRUD_the_users_synonyms(self): self.client.force_login(self.user) sneaky_user = create_user("sneakster") create_profile(sneaky_user, "any key", 5) # Lets have the client create their own synonym. synonym = {"review": self.review.id, "text": "My fancy synonym"} response = self.client.post(reverse("api:meaning-synonym-list"), data=synonym) self.assertEqual(response.status_code, 201) # Make sure that the sneaky user CANNOT read it. self.client.force_login(sneaky_user) synonym_id = self.review.meaning_synonyms.first().id response = self.client.get( reverse("api:meaning-synonym-detail", args=(synonym_id,)) ) self.assertEqual(response.status_code, 404) response = self.client.delete( reverse("api:meaning-synonym-detail", args=(synonym_id,)) ) self.assertEqual(response.status_code, 404) response = self.client.put( reverse("api:meaning-synonym-detail", args=(synonym_id,)) ) self.assertEqual(response.status_code, 404)
def test_another_user_cannot_CRUD_the_users_synonyms(self): self.client.force_login(self.user) sneaky_user = create_user("sneakster") create_profile(sneaky_user, "any key", 5) # Lets have the client create their own synonym. synonym = {'review': self.review.id, 'text': "My fancy synonym"} response = self.client.post(reverse("api:meaning-synonym-list"), data=synonym) self.assertEqual(response.status_code, 201) # Make sure that the sneaky user CANNOT read it. self.client.force_login(sneaky_user) synonym_id = self.review.meaning_synonyms.first().id response = self.client.get( reverse("api:meaning-synonym-detail", args=(synonym_id, ))) self.assertEqual(response.status_code, 404) response = self.client.delete( reverse("api:meaning-synonym-detail", args=(synonym_id, ))) self.assertEqual(response.status_code, 404) response = self.client.put( reverse("api:meaning-synonym-detail", args=(synonym_id, ))) self.assertEqual(response.status_code, 404)
def setUp(self): self.user = create_user("Tadgh") create_profile(self.user, "any_key", 5) self.vocabulary = create_vocab("radioactive bat") self.reading = create_reading(self.vocabulary, "ねこ", "猫", 2) self.review = create_review(self.vocabulary, self.user) self._vocab_api_regex = re.compile("https://www\.wanikani\.com/api/user/.*")
def setUp(self): self.user = create_user("Tadgh") create_profile(self.user, "any_key", 5) self.vocabulary = create_vocab("radioactive bat") self.reading = create_reading(self.vocabulary, "ねこ", "猫", 2) self.review = create_review(self.vocabulary, self.user) self._vocab_api_regex = re.compile("https://www\.wanikani\.com/api/user/.*")
def setUp(self): self.user = create_user("Tadgh") create_profile(self.user, "any_key", 5) self.prepLocalVocabulary() self.reading = create_reading(self.v, "ねこ", "猫", 1) self.review = create_review(self.v, self.user) self._vocab_api_regex = re.compile( r"https://www\.wanikani\.com/api/user/.*")
def setUp(self): self.user = create_user("Tadgh") self.user.set_password("password") create_profile(self.user, "any key", 1) self.user.save() self.vocabulary = create_vocab("cat") self.review = create_review(self.vocabulary, self.user) self.review.meaning_synonyms.get_or_create(text="minou")
def setUp(self): self.user = create_user("Tadgh") self.user.set_password("password") create_profile(self.user, "any key", 1) self.user.save() self.vocabulary = create_vocab("cat") self.review = create_review(self.vocabulary, self.user) self.review.meaning_synonyms.get_or_create(text="minou")
def test_update_all_users_only_gets_active_users(self): user2 = create_user("sup") create_profile(user2, "any_key", 5) user2.profile.last_visit = past_time(24 * 6) self.user.profile.last_visit = past_time(24 * 8) user2.profile.save() self.user.profile.save() affected_count = sync_all_users_to_wk() self.assertEqual(affected_count, 1)
def test_update_all_users_only_gets_active_users(self): user2 = create_user("sup") create_profile(user2, "any_key", 5) user2.profile.last_visit = past_time(24 * 6) self.user.profile.last_visit = past_time(24 * 8) user2.profile.save() self.user.profile.save() affected_count = sync_all_users_to_wk() self.assertEqual(affected_count, 1)
def test_toggling_review_hidden_ownershp_fails_on_wrong_user(self): user2 = create_user("eve") user2.set_password("im_a_hacker") create_profile(user2, "any_key", 1) user2.save() relevant_review_id = UserSpecific.objects.get( user=self.user, vocabulary=self.vocabulary).id if self.client.login(username="******", password="******"): response = self.client.post(path="/kw/togglevocab/", data={"review_id": relevant_review_id}) self.assertIsInstance(response, HttpResponseForbidden)
def test_meaning_contains_doesnt_check_another_user_synonyms(self): create_vocab_with_meaning_synonym("bioluminescent", "shiny animal", self.user) sneaky_user = create_user("sneakster") create_profile(sneaky_user, "any key", 5) self.client.force_login(sneaky_user) response = self.client.get( reverse("api:vocabulary-list") + "?meaning_contains=shiny") data = response.data assert len(data["results"]) == 0
def setUp(self): self.user = create_user("user1") self.user.set_password("password") self.user.save() create_profile(self.user, "some_key", 5) # create a piece of vocab with one reading. self.vocabulary = create_vocab("cat") self.cat_reading = create_reading(self.vocabulary, "kana", "kanji", 5) self.review = create_userspecific(self.vocabulary, self.user) self.factory = RequestFactory()
def test_toggling_review_hidden_ownership_fails_on_wrong_user(self): user2 = create_user("eve") user2.set_password("im_a_hacker") create_profile(user2, "any_key", 1) user2.save() relevant_review_id = UserSpecific.objects.get( user=self.user, vocabulary=self.vocabulary).id self.client.force_login(user2) response = self.client.post( reverse("api:review-hide", args=(relevant_review_id, ))) self.assertIsInstance(response, HttpResponseForbidden)
def setUp(self): self.user = create_user("user1") self.user.set_password("password") self.user.save() create_profile(self.user, "some_key", 5) # create a piece of vocab with one reading. self.vocabulary = create_vocab("radioactive bat") self.cat_reading = create_reading(self.vocabulary, "ねこ", "猫", 5) # setup a review with two synonyms self.review = create_review(self.vocabulary, self.user) self.client = Client() self.client.login(username="******", password="******")
def test_toggling_review_hidden_ownership_fails_on_wrong_user(self): user2 = create_user("eve") user2.set_password("im_a_hacker") create_profile(user2, "any_key", 1) user2.save() relevant_review_id = UserSpecific.objects.get( user=self.user, vocabulary=self.vocabulary ).id self.client.force_login(user2) response = self.client.post( reverse("api:review-hide", args=(relevant_review_id,)) ) self.assertIsInstance(response, HttpResponseForbidden)
def setUp(self): self.user = create_user("user1") self.user.set_password("password") self.user.save() create_profile(self.user, "some_key", 5) # create a piece of vocab with one reading. self.vocabulary = create_vocab("radioactive bat") self.cat_reading = create_reading(self.vocabulary, "ねこ", "猫", 5) # setup a review with two synonyms self.review = create_review(self.vocabulary, self.user) self.client = Client() self.client.login(username="******", password="******")
def setUp(self): self.user = create_user("user1") self.user.set_password("password") self.user.save() create_profile(self.user, "some_key", 5) # create a piece of vocab with one reading. self.vocabulary = create_vocab("radioactive bat") self.cat_reading = create_reading(self.vocabulary, "kana", "kanji", 5) # setup a review with two synonyms self.review = create_userspecific(self.vocabulary, self.user) self.client = Client() self.client.login(username="******", password="******") self._vocab_api_regex = re.compile( "https://www\.wanikani\.com/api/user/.*")
def test_one_time_script_for_vocabulary_merging_works(self): # Merger should: # 1) Pull entire Wanikani vocabulary set. # 2) For each vocabulary, check kanji. # Option A: # 3) If multiple vocab that have a reading with that kanji are returned, Create *one* new vocab for that kanji, # with current info from API. # 3.5) Make sure to copy over the various metadata on the reading we have previously pulled (sentences etc) # 4) Find all Reviews that point to any of the previous vocabulary objects. # 5) Find maximum of all the reviews when grouped by user. Which has highest SRS, etc. This will be the user's # original vocab. Probably best to confirm by checking creation date. # 6) Point the review's Vocabulary to the newly created vocabulary object from step 3. # 7) Delete all other Vocabulary that are now out of date. This should cascade deletion # down to the other reviews. # Option B: 3) If only one vocab is found for a particular kanji, we have successfully *not* created # duplicates, meaning the WK vocab has never changed meaning. 4) We do not have to do anything here. Woohoo! # Create two vocab, identical kanji, different meanings. v1 = create_vocab("dog") # < -- vestigial vocab. v2 = create_vocab("dog, woofer, pupper") # < -- real, current vocab. create_reading(v1, "doggo1", "犬", 5) create_reading(v2, "doggo2", "犬", 5) # Make it so that review 1 has overall better SRS score for the user. review_1 = create_review(v1, self.user) review_1.streak = 4 review_1.correct = 4 review_1.incorrect = 2 review_1.save() review_2 = create_review(v2, self.user) review_2.streak = 2 review_2.correct = 4 review_2.incorrect = 3 review_2.save() MeaningSynonym.objects.create(review=review_1, text="flimflammer") MeaningSynonym.objects.create(review=review_2, text="shazwopper") AnswerSynonym.objects.create(review=review_1, character="CHS1", kana="KS1") AnswerSynonym.objects.create(review=review_2, character="CHS2", kana="KS2") # Assign another user an old version of the vocab. user2 = create_user("asdf") review_3 = create_review(v1, user2) review_3.streak = 5 review_3.correct = 5 review_3.incorrect = 0 review_3.save() # User now has two different vocab, each with their own meaning, however kanji are identical. # Pull fake "current" vocab. this response, wherein we fetch the data from WK, and it turns out we already # have a local vocabulary with an identical meaning (i.e., we have already stored the correct and # currently active vocabulary. responses.add(responses.GET, "https://www.wanikani.com/api/user/{}/vocabulary/{}".format(constants.API_KEY, self.user.profile.level), json=sample_api_responses.single_vocab_existing_meaning_and_should_now_merge, status=200, content_type='application/json') old_vocab = Vocabulary.objects.filter(readings__character="犬") self.assertEqual(old_vocab.count(), 2) generate_user_stats(self.user) one_time_merge_level(self.user.profile.level) generate_user_stats(self.user) new_vocab = Vocabulary.objects.filter(readings__character="犬") self.assertEqual(new_vocab.count(), 1) new_review = UserSpecific.objects.filter(user=self.user, vocabulary__readings__character="犬") self.assertEqual(new_review.count(), 1) new_review = new_review[0] self.assertEqual(new_review.streak, review_1.streak) self.assertEqual(new_review.correct, review_1.correct) self.assertEqual(new_review.incorrect, review_1.incorrect) self.assertEqual(new_review.next_review_date, review_1.next_review_date) self.assertEqual(new_review.last_studied, review_1.last_studied) # Should have smashed together all the synonyms too. self.assertEqual(len(new_review.synonyms_list()), 2) self.assertEqual(len(new_review.reading_synonyms.all()), 2) second_users_reviews = UserSpecific.objects.filter(user=user2) self.assertEqual(second_users_reviews.count(), 1) user_two_review = second_users_reviews[0] self.assertEqual(user_two_review.streak, 5) self.assertTrue(user_two_review.vocabulary.meaning == "dog, woofer, pupper")
def setUp(self): self.user = create_user("Tadgh") create_profile(self.user, "any_key", 5) self.vocabulary = create_vocab("radioactive bat") self.reading = create_reading(self.vocabulary, "ねこ", "猫", 5) self.review = create_review(self.vocabulary, self.user)
def test_report_counts_endpoint(self): # Report a vocab. self.client.force_login(user=self.user) # This should only ever create ONE report, as we continually update the same one. We do not allow users to # multi-report a single vocab. self.client.post( reverse("api:report-list"), data={ "reading": self.reading.id, "reason": "This still makes no sense!!!", }, ) self.client.post( reverse("api:report-list"), data={ "reading": self.reading.id, "reason": "ahhh!!!" }, ) self.client.post( reverse("api:report-list"), data={ "reading": self.reading.id, "reason": "Help!" }, ) self.client.post( reverse("api:report-list"), data={ "reading": self.reading.id, "reason": "asdf!!!" }, ) self.client.post( reverse("api:report-list"), data={ "reading": self.reading.id, "reason": "fdsa!!!" }, ) self.client.post( reverse("api:report-list"), data={ "reading": self.reading.id, "reason": "Final report!!!!" }, ) # Have another user report it user = create_user("test2") create_profile(user, "test", 5) self.client.force_login(user=user) self.client.post( reverse("api:report-list"), data={ "reading": self.reading.id, "reason": "This still makes no sense!!!", }, ) # Report another vocab, but only once new_vocab = create_vocab("some other vocab") reading = create_reading(new_vocab, "reading", "reading_char", 1) self.client.post( reverse("api:report-list"), data={ "reading": reading.id, "reason": "This still makes no sense!!!", }, ) # Login with admin self.client.force_login(self.admin) resp = self.client.get(reverse("api:report-counts")) assert resp.data[0]["report_count"] > resp.data[1]["report_count"] assert resp.data[0]["report_count"] == 2 assert resp.data[0]["reading"] == self.reading.id assert resp.data[1]["report_count"] == 1 assert resp.data[1]["reading"] == reading.id resp = self.client.get(reverse("api:report-list")) assert resp.data["count"] == 3
def test_one_time_script_for_vocabulary_merging_works(self): # Merger should: # 1) Pull entire Wanikani vocabulary set. # 2) For each vocabulary, check kanji. # Option A: # 3) If multiple vocab that have a reading with that kanji are returned, Create *one* new vocab for that kanji, # with current info from API. # 3.5) Make sure to copy over the various metadata on the reading we have previously pulled (sentences etc) # 4) Find all Reviews that point to any of the previous vocabulary objects. # 5) Find maximum of all the reviews when grouped by user. Which has highest SRS, etc. This will be the user's # original vocab. Probably best to confirm by checking creation date. # 6) Point the review's Vocabulary to the newly created vocabulary object from step 3. # 7) Delete all other Vocabulary that are now out of date. This should cascade deletion # down to the other reviews. # Option B: 3) If only one vocab is found for a particular kanji, we have successfully *not* created # duplicates, meaning the WK vocab has never changed meaning. 4) We do not have to do anything here. Woohoo! # Create two vocab, identical kanji, different meanings. v1 = create_vocab("dog") # < -- vestigial vocab. v2 = create_vocab("dog, woofer, pupper") # < -- real, current vocab. create_reading(v1, "doggo1", "犬", 5) create_reading(v2, "doggo2", "犬", 5) # Make it so that review 1 has overall better SRS score for the user. review_1 = create_review(v1, self.user) review_1.streak = 4 review_1.correct = 4 review_1.incorrect = 2 review_1.save() review_2 = create_review(v2, self.user) review_2.streak = 2 review_2.correct = 4 review_2.incorrect = 3 review_2.save() MeaningSynonym.objects.create(review=review_1, text="flimflammer") MeaningSynonym.objects.create(review=review_2, text="shazwopper") AnswerSynonym.objects.create(review=review_1, character="CHS1", kana="KS1") AnswerSynonym.objects.create(review=review_2, character="CHS2", kana="KS2") # Assign another user an old version of the vocab. user2 = create_user("asdf") review_3 = create_review(v1, user2) review_3.streak = 5 review_3.correct = 5 review_3.incorrect = 0 review_3.save() # User now has two different vocab, each with their own meaning, however kanji are identical. # Pull fake "current" vocab. this response, wherein we fetch the data from WK, and it turns out we already # have a local vocabulary with an identical meaning (i.e., we have already stored the correct and # currently active vocabulary. responses.add( responses.GET, "https://www.wanikani.com/api/user/{}/vocabulary/{}".format( constants.API_KEY, self.user.profile.level ), json=sample_api_responses.single_vocab_existing_meaning_and_should_now_merge, status=200, content_type="application/json", ) old_vocab = Vocabulary.objects.filter(readings__character="犬") self.assertEqual(old_vocab.count(), 2) generate_user_stats(self.user) one_time_merge_level(self.user.profile.level) generate_user_stats(self.user) new_vocab = Vocabulary.objects.filter(readings__character="犬") self.assertEqual(new_vocab.count(), 1) new_review = UserSpecific.objects.filter( user=self.user, vocabulary__readings__character="犬" ) self.assertEqual(new_review.count(), 1) new_review = new_review[0] self.assertEqual(new_review.streak, review_1.streak) self.assertEqual(new_review.correct, review_1.correct) self.assertEqual(new_review.incorrect, review_1.incorrect) self.assertEqual(new_review.next_review_date, review_1.next_review_date) self.assertEqual(new_review.last_studied, review_1.last_studied) # Should have smashed together all the synonyms too. self.assertEqual(len(new_review.synonyms_list()), 2) self.assertEqual(len(new_review.reading_synonyms.all()), 2) second_users_reviews = UserSpecific.objects.filter(user=user2) self.assertEqual(second_users_reviews.count(), 1) user_two_review = second_users_reviews[0] self.assertEqual(user_two_review.streak, 5) self.assertTrue(user_two_review.vocabulary.meaning == "dog, woofer, pupper")
def setUp(self): self.user = create_user("Tadgh") create_profile(self.user, "any_key", 5) self.vocabulary = create_vocab("radioactive bat") self.reading = create_reading(self.vocabulary, "ねこ", "猫", 5) self.review = create_review(self.vocabulary, self.user)
def test_report_counts_endpoint(self): # Report a vocab. self.client.force_login(user=self.user) # This should only ever create ONE report, as we continually update the same one. We do not allow users to # multi-report a single vocab. self.client.post( reverse("api:report-list"), data={"reading": self.reading.id, "reason": "This still makes no sense!!!"}, ) self.client.post( reverse("api:report-list"), data={"reading": self.reading.id, "reason": "ahhh!!!"}, ) self.client.post( reverse("api:report-list"), data={"reading": self.reading.id, "reason": "Help!"}, ) self.client.post( reverse("api:report-list"), data={"reading": self.reading.id, "reason": "asdf!!!"}, ) self.client.post( reverse("api:report-list"), data={"reading": self.reading.id, "reason": "fdsa!!!"}, ) self.client.post( reverse("api:report-list"), data={"reading": self.reading.id, "reason": "Final report!!!!"}, ) # Have another user report it user = create_user("test2") create_profile(user, "test", 5) self.client.force_login(user=user) self.client.post( reverse("api:report-list"), data={"reading": self.reading.id, "reason": "This still makes no sense!!!"}, ) # Report another vocab, but only once new_vocab = create_vocab("some other vocab") reading = create_reading(new_vocab, "reading", "reading_char", 1) self.client.post( reverse("api:report-list"), data={"reading": reading.id, "reason": "This still makes no sense!!!"}, ) # Login with admin self.client.force_login(self.admin) resp = self.client.get(reverse("api:report-counts")) assert resp.data[0]["report_count"] > resp.data[1]["report_count"] assert resp.data[0]["report_count"] == 2 assert resp.data[0]["reading"] == self.reading.id assert resp.data[1]["report_count"] == 1 assert resp.data[1]["reading"] == reading.id resp = self.client.get(reverse("api:report-list")) assert resp.data["count"] == 3