Skip to content

Commit 10c07fd

Browse files
committed
tests for signals
1 parent 2d5013c commit 10c07fd

File tree

3 files changed

+94
-27
lines changed

3 files changed

+94
-27
lines changed

peewee_async/signals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from playhouse.signals import Signal
44

55
class AioSignal(Signal):
6-
async def send(self, instance, *args, **kwargs):
6+
async def send(self, instance: "AioModel", *args: Any, **kwargs: Any) -> list[tuple[Any, Any]]:
77
sender = type(instance)
88
responses = []
99
for n, r, s in self._receiver_list:

tests/models.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,72 @@
1+
from email.policy import default
12
import uuid
23

3-
import peewee
4+
import peewee as pw
45
import peewee_async
56
import peewee_async.signals
7+
import datetime as dt
68

79

810
class TestModel(peewee_async.AioModel):
911
__test__ = False # disable pytest warnings
10-
text = peewee.CharField(max_length=100, unique=True)
11-
data = peewee.TextField(default='')
12+
text = pw.CharField(max_length=100, unique=True)
13+
data = pw.TextField(default='')
1214

1315
def __str__(self) -> str:
1416
return '<%s id=%s> %s' % (self.__class__.__name__, self.id, self.text)
1517

1618

1719
class TestModelAlpha(peewee_async.AioModel):
1820
__test__ = False
19-
text = peewee.CharField()
21+
text = pw.CharField()
2022

2123
def __str__(self) -> str:
2224
return '<%s id=%s> %s' % (self.__class__.__name__, self.id, self.text)
2325

2426

2527
class TestModelBeta(peewee_async.AioModel):
2628
__test__ = False
27-
alpha = peewee.ForeignKeyField(TestModelAlpha, backref='betas')
28-
text = peewee.CharField()
29+
alpha = pw.ForeignKeyField(TestModelAlpha, backref='betas')
30+
text = pw.CharField()
2931

3032
def __str__(self) -> str:
3133
return '<%s id=%s> %s' % (self.__class__.__name__, self.id, self.text)
3234

3335

3436
class TestModelGamma(peewee_async.AioModel):
3537
__test__ = False
36-
text = peewee.CharField()
37-
beta = peewee.ForeignKeyField(TestModelBeta, backref='gammas')
38+
text = pw.CharField()
39+
beta = pw.ForeignKeyField(TestModelBeta, backref='gammas')
3840

3941
def __str__(self) -> str:
4042
return '<%s id=%s> %s' % (self.__class__.__name__, self.id, self.text)
4143

4244

4345
class UUIDTestModel(peewee_async.AioModel):
44-
id = peewee.UUIDField(primary_key=True, default=uuid.uuid4)
45-
text = peewee.CharField()
46+
id = pw.UUIDField(primary_key=True, default=uuid.uuid4)
47+
text = pw.CharField()
4648

4749
def __str__(self) -> str:
4850
return '<%s id=%s> %s' % (self.__class__.__name__, self.id, self.text)
4951

5052

5153
class CompositeTestModel(peewee_async.AioModel):
5254
"""A simple "through" table for many-to-many relationship."""
53-
task_id = peewee.IntegerField()
54-
product_type = peewee.CharField()
55+
task_id = pw.IntegerField()
56+
product_type = pw.CharField()
5557

5658
class Meta:
57-
primary_key = peewee.CompositeKey('task_id', 'product_type')
59+
primary_key = pw.CompositeKey('task_id', 'product_type')
5860

5961

6062
class IntegerTestModel(peewee_async.AioModel):
6163
__test__ = False # disable pytest warnings
62-
num = peewee.IntegerField()
64+
num = pw.IntegerField()
6365

6466

6567
class TestSignalModel(peewee_async.signals.AioModel):
6668
__test__ = False # disable pytest warnings
67-
text = peewee.CharField(max_length=100)
68-
69-
def __str__(self) -> str:
70-
return '<%s id=%s> %s' % (self.__class__.__name__, self.id, self.text)
69+
text = pw.CharField(max_length=100)
7170

7271

7372
ALL_MODELS = (

tests/test_signals.py

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,87 @@
1-
import uuid
1+
from contextlib import contextmanager
2+
from typing import Any, Callable, Coroutine, Iterator
23

34
from peewee_async.databases import AioDatabase
4-
from tests.conftest import dbs_all, dbs_postgres
5+
from tests.conftest import dbs_all
56
from tests.models import TestSignalModel
6-
from tests.utils import model_has_fields
7-
from peewee_async.signals import aio_pre_save
7+
from peewee_async.signals import AioModel, aio_pre_save, aio_post_save, aio_post_delete, aio_pre_delete, AioSignal, pre_init
88

99

1010

1111

12+
13+
@contextmanager
14+
def _connect(signal: AioSignal , receiver: Callable[..., Coroutine[Any, Any, Any]], sender: type[AioModel]) -> Iterator[None]:
15+
signal.connect(receiver=receiver, sender=sender)
16+
yield
17+
signal.disconnect(receiver=receiver, sender=sender)
18+
19+
1220
@dbs_all
1321
async def test_aio_pre_save(db: AioDatabase) -> None:
1422

15-
@aio_pre_save(sender=TestSignalModel)
16-
async def on_save_handler(model_class, instance, created):
17-
print(model_class, instance, created)
23+
24+
async def on_save_handler(model_class: type[TestSignalModel], instance: TestSignalModel, created: bool) -> None:
25+
assert await TestSignalModel.select().aio_exists() is False
26+
assert model_class is TestSignalModel
27+
assert isinstance(instance, TestSignalModel)
28+
assert created
29+
30+
with _connect(aio_pre_save, receiver=on_save_handler, sender=TestSignalModel):
31+
await TestSignalModel.aio_create(text="aio_create")
32+
33+
34+
@dbs_all
35+
async def test_aio_post_save(db: AioDatabase) -> None:
36+
37+
38+
async def on_save_handler(model_class: type[TestSignalModel], instance: TestSignalModel, created: bool) -> None:
39+
assert await TestSignalModel.select().aio_exists() is True
40+
assert model_class is TestSignalModel
41+
assert isinstance(instance, TestSignalModel)
42+
assert created
43+
44+
with _connect(aio_post_save, receiver=on_save_handler, sender=TestSignalModel):
45+
await TestSignalModel.aio_create(text="aio_create")
46+
47+
48+
@dbs_all
49+
async def test_aio_pre_delete(db: AioDatabase) -> None:
50+
51+
t = await TestSignalModel.aio_create(text="aio_create")
52+
53+
async def on_delete_handler(model_class: type[TestSignalModel], instance: TestSignalModel) -> None:
54+
assert await TestSignalModel.select().aio_exists() is True
55+
assert model_class is TestSignalModel
56+
assert isinstance(instance, TestSignalModel)
57+
58+
with _connect(aio_pre_delete, receiver=on_delete_handler, sender=TestSignalModel):
59+
await t.aio_delete_instance()
60+
61+
62+
@dbs_all
63+
async def test_aio_post_delete(db: AioDatabase) -> None:
64+
65+
t = await TestSignalModel.aio_create(text="aio_create")
66+
67+
async def on_delete_handler(model_class: type[TestSignalModel], instance: TestSignalModel) -> None:
68+
assert await TestSignalModel.select().aio_exists() is False
69+
assert model_class is TestSignalModel
70+
assert isinstance(instance, TestSignalModel)
71+
72+
with _connect(aio_post_delete, receiver=on_delete_handler, sender=TestSignalModel):
73+
await t.aio_delete_instance()
74+
75+
76+
@dbs_all
77+
def test_pre_init(db: AioDatabase) -> None:
78+
79+
def on_init_handler(model_class: type[TestSignalModel], instance: TestSignalModel) -> None:
80+
assert model_class is TestSignalModel
81+
assert instance.text == "text"
82+
83+
pre_init.connect(receiver=on_init_handler, sender=TestSignalModel)
84+
85+
TestSignalModel(text="text")
1886

19-
await TestSignalModel.aio_create(text="text")
87+
pre_init.disconnect(receiver=on_init_handler, sender=TestSignalModel)

0 commit comments

Comments
 (0)