def test_entity(self):
     id = 618
     name = "Course 1"
     url = "/path/to/course"
     difficult = 234
     num_things = 123
     num_levels = 2
     difficult_url = "/path/to/difficult/words"
     is_disable = True
     ce = CourseEntity(
         id=id,
         name=name,
         url=url,
         difficult=difficult,
         num_words=num_things,
         num_levels=num_levels,
         difficult_url=difficult_url,
         is_disable=is_disable,
     )
     course_as_dict = ce.dict()
     expected = {
         "id": 618,
         "name": "Course 1",
         "url": "/path/to/course",
         "difficult": 234,
         "num_words": 123,
         "num_levels": 2,
         "difficult_url": "/path/to/difficult/words",
         "levels_url": [],
         "levels": [],
         "is_disable": True,
     }
     self.assertDictEqual(course_as_dict, expected)
 def test_add_courses(self):
     course_1 = CourseEntity(
         id=1,
         name="Course 1",
         url="/path/to/course",
         difficult=111,
         num_words=121,
         num_levels=11,
         difficult_url="/path/to/difficult/words",
     )
     course_2 = CourseEntity(
         id=2,
         name="Course 2",
         url="/path/to/course",
         difficult=222,
         num_words=122,
         num_levels=12,
         difficult_url="/path/to/difficult/words",
     )
     course_3 = CourseEntity(
         id=3,
         name="Course 3",
         url="/path/to/course",
         difficult=333,
         num_words=123,
         num_levels=13,
         difficult_url="/path/to/difficult/words",
     )
     courses = [course_1, course_2, course_3]
     self.assertEqual(self.de.get_courses(), [])
     self.de.add_courses(courses)
     stored_courses = self.de.get_courses()
     self.assertEqual(len(courses), 3)
     self.assertListEqual(stored_courses, courses)
    def test_create(self):
        fresh_entities = [
            CourseEntity(
                id=1,
                name="course 1",
                url="/course/1",
                difficult=1,
                num_words=1,
                num_levels=1,
                difficult_url="/difficult/1",
            ),
            CourseEntity(
                id=2,
                name="course 2",
                url="/course/2",
                difficult=2,
                num_words=2,
                num_levels=2,
                difficult_url="/difficult/2",
            ),
            CourseEntity(
                id=3,
                name="course 3",
                url="/course/3",
                difficult=3,
                num_words=3,
                num_levels=3,
                difficult_url="/difficult/3",
            ),
            CourseEntity(
                id=4,
                name="course 4",
                url="/course/4",
                difficult=4,
                num_words=4,
                num_levels=4,
                difficult_url="/difficult/4",
            ),
            CourseEntity(
                id=5,
                name="course 5",
                url="/course/5",
                difficult=5,
                num_words=5,
                num_levels=5,
                difficult_url="/difficult/5",
            ),
        ]
        before_courses = Course.objects.all()
        expected_before_num_courses = 5
        self.assertEqual(len(before_courses), expected_before_num_courses)
        dca = DBCourseActions(reporter=CourseReporter())
        dca.create(fresh_entities)

        after_courses = Course.objects.all()
        expected_after_num_courses = expected_before_num_courses + len(
            fresh_entities)
        self.assertEqual(len(after_courses), expected_after_num_courses)
    def test_get_courses(self):
        ce5 = CourseEntity(
            id=5,
            name="Course 5",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )
        ce1 = CourseEntity(
            id=1,
            name="Course 1",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )

        ce3 = CourseEntity(
            id=3,
            name="Course 3",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )

        ce8 = CourseEntity(
            id=8,
            name="Course 8",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )
        courses_entity = [ce5, ce3, ce1, ce8]
        for course_entity in courses_entity:
            self.de.add_course(course_entity)

        courses = self.de.get_courses()
        self.assertEqual(len(courses), 4)
        ids = [course.id for course in courses]
        expected = [1, 3, 5, 8]
        self.assertEqual(ids, expected)
    def test_purge(self):
        ce5 = CourseEntity(
            id=5,
            name="Course 5",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )
        ce1 = CourseEntity(
            id=1,
            name="Course 1",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )

        ce3 = CourseEntity(
            id=3,
            name="Course 3",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )

        ce8 = CourseEntity(
            id=8,
            name="Course 8",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )
        courses_entity = [ce5, ce3, ce1, ce8]
        for course_entity in courses_entity:
            self.de.add_course(course_entity)

        courses = self.de.get_courses()
        self.assertEqual(len(courses), 4)
        self.de.purge()
        self.assertEqual(self.de.get_courses(), [])
    def make(
            self, items: Generator[CoursesMakerT, None,
                                   None]) -> List[CourseEntity]:
        for item in items:
            attrs = {
                "id": item.id,
                "name": item.name,
                "url": item.url,
                "difficult": item.difficult,
                "num_words": item.num_things,
                "num_levels": item.num_levels,
                "difficult_url": urljoin(item.url, DIFFICULT_ITEMS_URL),
                "is_disable": item.is_disable,
            }
            ce = CourseEntity(**attrs)
            ce.generate_levels_url()

            self._append(ce)

        return self.data
    def test_add_levels(self):
        course_id = 1
        ce = CourseEntity(
            id=course_id,
            name="Course 1",
            url="/path/to/course",
            difficult=234,
            num_words=123,
            num_levels=2,
            difficult_url="/path/to/difficult/words",
        )
        level1 = LevelEntity(number=1,
                             course_id=ce.id,
                             name="TestLevel1",
                             id=1)
        level2 = LevelEntity(number=2,
                             course_id=ce.id,
                             name="TestLevel2",
                             id=2)
        levels = [level1, level2]
        ce.add_levels(levels)

        self.assertListEqual(ce.levels, levels)
    def test_add_course(self):
        id = random.getrandbits(10)
        name = "Course 1"
        url = "/path/to/course"
        difficult = 234
        num_things = 123
        num_levels = 2
        difficult_url = "/path/to/difficult/words"
        ce = CourseEntity(
            id=id,
            name=name,
            url=url,
            difficult=difficult,
            num_words=num_things,
            num_levels=num_levels,
            difficult_url=difficult_url,
        )

        self.assertEqual(self.de.get_courses(), [])
        self.de.add_course(ce)
        courses = self.de.get_courses()
        self.assertEqual(len(courses), 1)
        for course in courses:
            self.assertEqual(course, ce)
 def test_course_match(self):
     fresh_entities = [
         CourseEntity(
             id=1,
             name="course 1",
             url="/course/1",
             difficult=1,
             num_words=1,
             num_levels=1,
             difficult_url="/difficult/1",
         ),
         CourseEntity(
             id=2,
             name="course 2",
             url="/course/2",
             difficult=2,
             num_words=2,
             num_levels=2,
             difficult_url="/difficult/2",
         ),
         CourseEntity(
             id=3,
             name="course 3",
             url="/course/3",
             difficult=3,
             num_words=3,
             num_levels=3,
             difficult_url="/difficult/3",
         ),
         CourseEntity(
             id=4,
             name="course 4",
             url="/course/4",
             difficult=4,
             num_words=4,
             num_levels=4,
             difficult_url="/difficult/4",
         ),
         CourseEntity(
             id=5,
             name="course 5",
             url="/course/5",
             difficult=5,
             num_words=5,
             num_levels=5,
             difficult_url="/difficult/5",
         ),
     ]
     actual_entities = [
         CourseEntity(
             id=1,
             name="course 1",
             url="/course/1",
             difficult=1,
             num_words=1,
             num_levels=1,
             difficult_url="/difficult/1",
         ),
         CourseEntity(
             id=2,
             name="course 2",
             url="/course/2",
             difficult=2,
             num_words=2,
             num_levels=2,
             difficult_url="/difficult/2",
         ),
         CourseEntity(
             id=20,
             name="course 20",
             url="/course/20",
             difficult=20,
             num_words=20,
             num_levels=20,
             difficult_url="/difficult/20",
         ),
         CourseEntity(
             id=5,
             name="course 5",
             url="/course/5",
             difficult=5,
             num_words=5,
             num_levels=5,
             difficult_url="/difficult/50",
         ),
     ]
     diff = CourseSelector().match(fresh_entities=fresh_entities,
                                   actual_entities=actual_entities)
     self.assertEqual(len(diff.create), 2)
     self.assertEqual(len(diff.delete), 1)
     self.assertEqual(len(diff.equal), 2)
     self.assertEqual(len(diff.update), 1)
 def test_fetch_levels(self, mock_get) -> None:
     courses = [
         CourseEntity(
             id=1987730,
             name="Adjective Complex",
             url="/course/1987730/adjective-complex/",
             difficult=6,
             num_words=19,
             num_levels=7,
             difficult_url=
             "/course/1987730/adjective-complex/difficult-items/",
             levels_url=["/course/1987730/adjective-complex/1"],
         )
     ]
     repo = UpdateMemriseContainer.origin_repo
     self.set_get_mock_response(mock_get, 200, {"test": True})
     result = repo.get_levels(courses)
     expected = [
         LevelEntity(
             id=7365190,
             number=1,
             course_id=1987730,
             name="New level",
             words=[
                 WordEntity(
                     id=204850790,
                     level_id=7365190,
                     word_a="fair",
                     word_b="справедливый, честный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204850795,
                     level_id=7365190,
                     word_a="nasty",
                     word_b="мерзкий, противный, неприятный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204850798,
                     level_id=7365190,
                     word_a="rough",
                     word_b="грубый",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204850806,
                     level_id=7365190,
                     word_a="tense",
                     word_b="напряженный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204850807,
                     level_id=7365190,
                     word_a="vital",
                     word_b="жизненно важный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204850811,
                     level_id=7365190,
                     word_a="deprecated",
                     word_b="устаревший, исключенный, не рекомендуемый",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852805,
                     level_id=7365190,
                     word_a="joyful",
                     word_b="радостный, ликующий",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852806,
                     level_id=7365190,
                     word_a="startled",
                     word_b="испуганный, пораженный, встревоженный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852807,
                     level_id=7365190,
                     word_a="humiliated",
                     word_b="униженный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852809,
                     level_id=7365190,
                     word_a="remarkable",
                     word_b="замечательный, выдающийся",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852812,
                     level_id=7365190,
                     word_a="odd",
                     word_b="странный, необычный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852813,
                     level_id=7365190,
                     word_a="awkward",
                     word_b="неловкий, неуклюжий (момент, поведение)",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852815,
                     level_id=7365190,
                     word_a="mere",
                     word_b="простой, всего лишь",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852818,
                     level_id=7365190,
                     word_a="pleased",
                     word_b="довольный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852819,
                     level_id=7365190,
                     word_a="familiar",
                     word_b="привычный, знакомый",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204852822,
                     level_id=7365190,
                     word_a="certain",
                     word_b="определенный, уверенный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204857071,
                     level_id=7365190,
                     word_a="essential",
                     word_b="существенный, обязательный (вещь)",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=190320331,
                     level_id=7365190,
                     word_a="immediate",
                     word_b="немедленный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204857072,
                     level_id=7365190,
                     word_a="fluent",
                     word_b="беглый, плавный",
                     is_learned=True,
                 ),
                 WordEntity(
                     id=204857073,
                     level_id=7365190,
                     word_a="appropriate",
                     word_b="соответствующий, подходящий",
                     is_learned=True,
                 ),
             ],
         )
     ]
     self.assertEqual(result, expected)