class TestUserRepository(unittest.TestCase):
    def setUp(self):
        self.repository = UserRepository()
        self.repository.register("maija", "Ahlie8oh")

    def test_register_user(self):
        user = self.repository.register("matti", "salasana123")
        assert user is not None

    def test_contains_username_existing(self):
        result = self.repository.contains_username("maija")
        assert result

    def test_check_login_correct(self):
        result = self.repository.check_login("maija", "Ahlie8oh")
        self.assertEqual(result.username, "maija")

    def test_check_login_incorrect_password(self):
        result = self.repository.check_login("maija", "Ahlie8ohe")
        assert result is None

    def test_check_login_incorrect_username(self):
        result = self.repository.check_login("maije", "Ahlie8oh")
        assert result is None
class TestReadingTip(unittest.TestCase):
    def setUp(self):
        self.user_repository = UserRepository()
        self.user = self.user_repository.register("maija", "Tiothee6")
        self.repository = ReadingTipRepository()

    def test_create_tip(self):
        tags = [Tag("kirjat"), Tag("maksulliset")]
        self.repository.create_tip(
            ReadingTip("Hyvä kirja", "kirjakauppa.fi/123", self.user, tags))
        tips = self.repository.get_tips(self.user, "all")
        self.assertEqual(tips[0].title, "Hyvä kirja")
        self.assertEqual(tips[0].tags[0].name, "kirjat")
        self.assertEqual(tips[0].tags[1].name, "maksulliset")

    def test_contains_title_if_not_present(self):
        assert not self.repository.contains_title(self.user, "Hyvä kirja")

    def test_contains_title_if_present(self):
        tags = [Tag("kirjat"), Tag("maksulliset")]
        self.repository.create_tip(
            ReadingTip("Hyvä kirja", "kirjakauppa.fi/123", self.user, tags))
        assert self.repository.contains_title(self.user, "Hyvä kirja")

    def test_deletes_tip(self):
        tags = [Tag("kirjat"), Tag("maksulliset")]
        self.repository.create_tip(
            ReadingTip("Hyvä kirja", "kirjakauppa.fi/123", self.user, tags))
        tip = self.repository.get_tips(self.user, "all")[0]
        self.repository.delete_tip(tip)
        self.assertEqual(self.repository.get_tips(self.user, "all"), [])

    def test_cannot_see_others_tip(self):
        tags = [Tag("kirjat"), Tag("maksulliset")]
        second_user = self.user_repository.register("mikko", "oko7Aeko")
        self.repository.create_tip(
            ReadingTip("Hyvä kirja", "kirjakauppa.fi/123", second_user, tags))

        assert not self.repository.contains_title(self.user, "Hyvä kirja")
        self.assertEqual(self.repository.get_tips(self.user, "all"), [])

    def test_can_get_tips_based_on_tags(self):
        tags = [Tag("Hyvä")]
        self.repository.create_tip(
            ReadingTip("Hyvä kirja", "kirjakauppa.fi/123", self.user, tags))
        second_tags = [Tag("Huono")]
        self.repository.create_tip(
            ReadingTip("Huono kirja", "kirjakauppa.fi/123", self.user,
                       second_tags))
        self.assertEqual(len(self.repository.get_tips(self.user, "all")), 2)
        self.assertEqual(len(self.repository.get_tips(self.user, "Hyvä")), 1)

    def test_update_tip(self):
        tags = [Tag("kirjat"), Tag("maksulliset")]
        self.repository.create_tip(
            ReadingTip("Hyvä kirja", "kirjakauppa.fi/123", self.user, tags))
        tags.append(Tag("uusi"))
        self.repository.update_tip(1, "Muutettu kirja", "kirjakauppa.fi/123",
                                   tags)
        self.assertEqual(
            self.repository.get_tips(self.user)[0].title, "Muutettu kirja")
        self.assertEqual(
            self.repository.get_tips(self.user)[0].tags[2].name, "uusi")

    def test_get_tip(self):
        tags = [Tag("kirjat"), Tag("maksulliset")]
        self.repository.create_tip(
            ReadingTip("Uusi kirja", "kirjakauppa.fi/123", self.user, tags))
        tip = self.repository.get_tip(1)
        self.assertEqual(tip.title, "Uusi kirja")

    def test_marks_tip_as_read(self):
        tags = [Tag("kirjat"), Tag("maksulliset")]
        self.repository.create_tip(
            ReadingTip("Hyvä kirja", "kirjakauppa.fi/123", self.user, tags))
        assert self.repository.get_tips(self.user)[0].read is None
        self.repository.read_tip(
            self.repository.get_tips(self.user)[0], "2021")
        assert self.repository.get_tips(self.user)[0].read is not None