Explorar o código

Add tests for users db output

theenglishway (time) %!s(int64=7) %!d(string=hai) anos
pai
achega
86a365b8e2
Modificáronse 2 ficheiros con 72 adicións e 1 borrados
  1. 10 0
      tests/fixtures/users/users_1.yaml
  2. 62 1
      tests/output/test_db.py

+ 10 - 0
tests/fixtures/users/users_1.yaml

@@ -0,0 +1,10 @@
+- !!python/object:twhatter.parser.user.User
+  followers_nb: 10
+  following_nb: 30
+  fullname: theenglishway
+  id: 943804775942033408
+  join_date: 2017-12-21 00:00:00
+  likes_nb: 17
+  username: the_english_way
+  soup: null
+  tweets_nb: 83

+ 62 - 1
tests/output/test_db.py

@@ -2,7 +2,7 @@ import pytest
 from dataclasses import fields
 
 from twhatter.output import Database
-from twhatter.output.sqlalchemy import Tweet
+from twhatter.output.sqlalchemy import Tweet, User as DbUser
 from twhatter.parser import *
 
 
@@ -90,3 +90,64 @@ class TestTweetsOutput:
         for t in tweets:
             db_tweet = session.query(Tweet).filter(Tweet.id == t.id).one()
             assert getattr(db_tweet, field_name) == getattr(t, field_name)
+
+
+class TestUsersOutput:
+    testdata = [
+        pytest.param('tests/fixtures/users/users_1.yaml', User,
+                     id="users"),
+    ]
+
+    @pytest.fixture(scope="function")
+    def users_output_factory(self, users_factory, output):
+        """Factory for users that have been output"""
+        def _users_output_factory(fixtures_file):
+            users = users_factory(fixtures_file)
+            output.start()
+            output.output_users(users)
+            output.stop()
+            return users
+
+        return _users_output_factory
+
+    @pytest.mark.parametrize("fixtures_file, raw_class", testdata)
+    def test_presence(self, users_factory, output, fixtures_file, session, raw_class):
+        users = users_factory(fixtures_file)
+        output.start()
+        output.output_users(users)
+        output.stop()
+
+        for u in users:
+            assert session.query(DbUser).filter(DbUser.id == u.id).one()
+
+
+    @pytest.mark.parametrize("fixtures_file, raw_class", testdata)
+    def test_twice(self, users_factory, output, fixtures_file, session, raw_class):
+        users = users_factory(fixtures_file)
+        output.start()
+        output.output_users(users)
+        output.stop()
+
+        output.start()
+        output.output_users(users)
+        output.stop()
+
+        for u in users:
+            assert session.query(DbUser).filter(DbUser.id == u.id).one()
+
+
+    @pytest.mark.parametrize("field_name, fixtures_file, raw_tweet_cls", [
+        pytest.param(
+            field.name,
+            *td.values,
+            id="{}-{}".format(td.id, field.name)
+        )
+        for td in testdata
+        for field in fields(User)
+    ])
+    def test_attributes(self, users_output_factory, fixtures_file, session, raw_tweet_cls, field_name):
+        users = users_output_factory(fixtures_file)
+
+        for u in users:
+            db_tweet = session.query(DbUser).filter(DbUser.id == u.id).one()
+            assert getattr(db_tweet, field_name) == getattr(u, field_name)