Coverage for tests/test_db_sql.py: 100%

49 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-09-28 09:38 +0200

1import pytest 

2from unittest.mock import MagicMock, patch 

3from art_studio_tz import DBsql 

4from sqlalchemy import create_engine 

5from sqlalchemy.orm import sessionmaker 

6from art_studio_tz.db_sql import QuoteModel, Base 

7 

8 

9@pytest.fixture 

10def dbsql(): 

11 engine = create_engine("sqlite:///:memory:", echo=False, future=True) 

12 Base.metadata.create_all(engine) 

13 Session = sessionmaker(bind=engine) 

14 

15 class TestDBsql(DBsql): 

16 def __init__(self): 

17 self.engine = engine 

18 self.Session = Session 

19 

20 return TestDBsql() 

21 

22def test_create_and_read_all(dbsql): 

23 item = {"text": "Hello", "author": "Someone"} 

24 new_id = dbsql.create(item) 

25 

26 # В SQLite in-memory ID присвоится только после commit, поэтому new_id может быть None 

27 # Для теста проверяем наличие текста и автора 

28 all_rows = dbsql.read_all() 

29 assert len(all_rows) == 1 

30 assert all_rows[0]["text"] == "Hello" 

31 assert all_rows[0]["author"] == "Someone" 

32 # Проверяем, что id существует 

33 assert "id" in all_rows[0] 

34 

35def test_get_latest(dbsql): 

36 import datetime 

37 items = [ 

38 {"text": "A", "author": "X", "timestep": datetime.datetime(2025, 1, 1)}, 

39 {"text": "B", "author": "Y", "timestep": datetime.datetime(2025, 1, 2)}, 

40 {"text": "C", "author": "Z", "timestep": datetime.datetime(2025, 1, 3)}, 

41 ] 

42 for item in items: 

43 dbsql.create(item) 

44 

45 latest_2 = dbsql.get_latest(2) 

46 assert len(latest_2) == 2 

47 assert latest_2[0]["text"] == "C" 

48 assert latest_2[1]["text"] == "B" 

49 

50def test_create_multiple(dbsql): 

51 ids = [] 

52 for i in range(5): 

53 new_id = dbsql.create({"text": f"Quote {i}", "author": f"Author {i}"}) 

54 ids.append(new_id) 

55 all_rows = dbsql.read_all() 

56 assert len(all_rows) == 5 

57 # Проверяем, что у всех есть id 

58 assert all("id" in r for r in all_rows) 

59 

60def test_get_latest_default_number(dbsql): 

61 import datetime 

62 for i in range(10): 

63 dbsql.create({ 

64 "text": f"Q{i}", 

65 "author": f"A{i}", 

66 "timestep": datetime.datetime(2025, 1, i+1) 

67 }) 

68 latest = dbsql.get_latest() # по умолчанию 5 

69 assert len(latest) == 5 

70 assert latest[0]["text"] == "Q9" 

71 assert latest[-1]["text"] == "Q5"