コード例 #1
0
ファイル: test_meaningsynonym_api.py プロジェクト: tadgh/KW
    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)
コード例 #2
0
    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)
コード例 #3
0
ファイル: test_tasks.py プロジェクト: ddaws/kw-backend
 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/.*")
コード例 #4
0
ファイル: test_tasks.py プロジェクト: tadgh/KW
 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/.*")
コード例 #5
0
ファイル: test_sync.py プロジェクト: amirdib/kw-backend
 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/.*")
コード例 #6
0
ファイル: test_models.py プロジェクト: amirdib/kw-backend
 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")
コード例 #7
0
ファイル: test_models.py プロジェクト: tadgh/KW
 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")
コード例 #8
0
ファイル: test_tasks.py プロジェクト: tadgh/KW
    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)
コード例 #9
0
    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)
コード例 #10
0
ファイル: test_models.py プロジェクト: jtenclay/kw-backend
 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)
コード例 #11
0
ファイル: test_vocabulary.py プロジェクト: amirdib/kw-backend
    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
コード例 #12
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()
コード例 #13
0
ファイル: test_models.py プロジェクト: amirdib/kw-backend
    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)
コード例 #14
0
ファイル: test_views.py プロジェクト: gavia/kw-backend
    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="******")
コード例 #15
0
ファイル: test_models.py プロジェクト: tadgh/KW
    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)
コード例 #16
0
ファイル: test_views.py プロジェクト: tadgh/KW
    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="******")
コード例 #17
0
ファイル: test_views.py プロジェクト: jtenclay/kw-backend
    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/.*")
コード例 #18
0
ファイル: test_tasks.py プロジェクト: ddaws/kw-backend
    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")
コード例 #19
0
ファイル: test_meaningsynonym_api.py プロジェクト: tadgh/KW
 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)
コード例 #20
0
    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
コード例 #21
0
ファイル: test_tasks.py プロジェクト: tadgh/KW
    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")
コード例 #22
0
 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)
コード例 #23
0
ファイル: test_report.py プロジェクト: tadgh/KW
    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