Skip to content

Commit ea7aff2

Browse files
committed
first test passing
1 parent 52efc8a commit ea7aff2

8 files changed

Lines changed: 151 additions & 42 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
.mypy_cache
33
__pycache__
44
*.egg-info
5+
src/djangoproject/db.sqlite3

pytest.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[pytest]
2+
django_find_project = false
3+
#DJANGO_SETTINGS_MODULE=djangoproject.django_project.settings
4+

src/allocation/adapters/repository.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,18 @@ def get(self, reference) -> model.Batch:
1212
raise NotImplementedError
1313

1414

15-
class SqlAlchemyRepository(AbstractRepository):
16-
def __init__(self, session):
17-
self.session = session
15+
class DjangoRepository(AbstractRepository):
16+
def __init__(self):
17+
from djangoproject.alloc import models
18+
19+
self.django_models = models
1820

1921
def add(self, batch):
20-
self.session.add(batch)
22+
self.django_models.Batch.from_domain(batch).save()
2123

2224
def get(self, reference):
23-
return self.session.query(model.Batch).filter_by(reference=reference).one()
24-
25-
def list(self):
26-
return self.session.query(model.Batch).all()
25+
return (
26+
self.django_models.Batch.objects.filter(reference=reference)
27+
.first()
28+
.to_domain()
29+
)
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Generated by Django 2.2.1 on 2019-05-02 15:38
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
initial = True
10+
11+
dependencies = []
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name="Batch",
16+
fields=[
17+
(
18+
"id",
19+
models.AutoField(
20+
auto_created=True,
21+
primary_key=True,
22+
serialize=False,
23+
verbose_name="ID",
24+
),
25+
),
26+
("reference", models.CharField(max_length=255)),
27+
("sku", models.CharField(max_length=255)),
28+
("qty", models.IntegerField()),
29+
("eta", models.DateField(blank=True, null=True)),
30+
],
31+
),
32+
migrations.CreateModel(
33+
name="OrderLine",
34+
fields=[
35+
(
36+
"id",
37+
models.AutoField(
38+
auto_created=True,
39+
primary_key=True,
40+
serialize=False,
41+
verbose_name="ID",
42+
),
43+
),
44+
("orderid", models.CharField(max_length=255)),
45+
("sku", models.CharField(max_length=255)),
46+
("qty", models.IntegerField()),
47+
],
48+
),
49+
migrations.CreateModel(
50+
name="Allocation",
51+
fields=[
52+
(
53+
"id",
54+
models.AutoField(
55+
auto_created=True,
56+
primary_key=True,
57+
serialize=False,
58+
verbose_name="ID",
59+
),
60+
),
61+
(
62+
"batch",
63+
models.ForeignKey(
64+
on_delete=django.db.models.deletion.CASCADE, to="alloc.Batch"
65+
),
66+
),
67+
(
68+
"line",
69+
models.ForeignKey(
70+
on_delete=django.db.models.deletion.CASCADE,
71+
to="alloc.OrderLine",
72+
),
73+
),
74+
],
75+
),
76+
]

src/djangoproject/alloc/models.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,34 @@
11
from django.db import models
2+
from allocation.domain import model as domain_model
3+
4+
5+
class Batch(models.Model):
6+
reference = models.CharField(max_length=255)
7+
sku = models.CharField(max_length=255)
8+
qty = models.IntegerField()
9+
eta = models.DateField(blank=True, null=True)
10+
11+
@classmethod
12+
def from_domain(self, batch: domain_model.Batch):
13+
try:
14+
b = Batch.objects.get(reference=batch.reference)
15+
except Batch.DoesNotExist:
16+
b = Batch(reference=batch.reference)
17+
b.sku = batch.sku
18+
b.qty = batch._purchased_quantity
19+
b.eta = batch.eta
20+
return b
21+
22+
def to_domain(self):
23+
return domain_model.Batch(ref=self.reference, sku=self.sku, qty=self.qty)
24+
25+
26+
class OrderLine(models.Model):
27+
orderid = models.CharField(max_length=255)
28+
sku = models.CharField(max_length=255)
29+
qty = models.IntegerField()
30+
31+
32+
class Allocation(models.Model):
33+
batch = models.ForeignKey(Batch, on_delete=models.CASCADE)
34+
line = models.ForeignKey(OrderLine, on_delete=models.CASCADE)

src/djangoproject/django_project/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"django.contrib.sessions",
3838
"django.contrib.messages",
3939
"django.contrib.staticfiles",
40+
"djangoproject.alloc",
4041
]
4142

4243
MIDDLEWARE = [

tests/conftest.py

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,9 @@
55
import pytest
66
import requests
77
from requests.exceptions import ConnectionError
8-
from sqlalchemy.exc import OperationalError
9-
from sqlalchemy import create_engine
10-
from sqlalchemy.orm import sessionmaker, clear_mappers
118

12-
from allocation.adapters.orm import metadata, start_mappers
139
from allocation import config
14-
15-
16-
@pytest.fixture
17-
def in_memory_db():
18-
engine = create_engine("sqlite:///:memory:")
19-
metadata.create_all(engine)
20-
return engine
21-
22-
23-
@pytest.fixture
24-
def session_factory(in_memory_db):
25-
start_mappers()
26-
yield sessionmaker(bind=in_memory_db)
27-
clear_mappers()
28-
29-
30-
@pytest.fixture
31-
def session(session_factory):
32-
return session_factory()
10+
from allocation.adapters.orm import metadata, start_mappers
3311

3412

3513
def wait_for_postgres_to_come_up(engine):

tests/integration/test_repository.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,45 @@
11
# pylint: disable=protected-access
2+
from datetime import date
3+
import pytest
24
from allocation.domain import model
35
from allocation.adapters import repository
4-
from allocation import django_model
56

67

7-
def test_repository_can_save_a_batch(session):
8+
@pytest.fixture
9+
def django_models(django_db_setup):
10+
from djangoproject.alloc import models
11+
12+
return models
13+
14+
15+
@pytest.mark.django_db
16+
def test_repository_can_save_a_batch(django_models):
817
batch = model.Batch("batch1", "RUSTY-SOAPDISH", 100, eta=date(2011, 12, 25))
918

10-
repo = repository.SqlAlchemyRepository(session)
19+
repo = repository.DjangoRepository()
1120
repo.add(batch)
1221

13-
[saved_batch] = django_model.Batch.objects.all()
22+
[saved_batch] = django_models.Batch.objects.all()
1423
assert saved_batch.reference == batch.reference
1524
assert saved_batch.sku == batch.sku
16-
assert saved_batch.qty == batch.qty
25+
assert saved_batch.qty == batch._purchased_quantity
1726
assert saved_batch.eta == batch.eta
1827

1928

20-
def test_repository_can_retrieve_a_batch_with_allocations(session):
29+
@pytest.mark.skip("foo")
30+
@pytest.mark.django_db
31+
def test_repository_can_retrieve_a_batch_with_allocations(django_models):
2132
sku = "PONY-STATUE"
22-
line = django_model.OrderLine.objects.create(orderid="order1", sku=sku, qty=12)
23-
django_model.Batch.objects.create(reference="batch1", sku=sku, qty=100, eta=None)
24-
django_model.Batch.objects.create(reference="batch2", sku=sku, qty=100, eta=None)
25-
django_model.Allocation.objects.create(
33+
d_line = django_models.OrderLine.objects.create(orderid="order1", sku=sku, qty=12)
34+
d_batch1 = django_models.Batch.objects.create(
35+
reference="batch1", sku=sku, qty=100, eta=None
36+
)
37+
d_batch2 = django_models.Batch.objects.create(
2638
reference="batch2", sku=sku, qty=100, eta=None
2739
)
40+
django_models.Allocation.objects.create(line=d_line, batch=d_batch1)
2841

29-
repo = repository.SqlAlchemyRepository(session)
42+
repo = repository.DjangoRepository()
3043
retrieved = repo.get("batch1")
3144

3245
expected = model.Batch("batch1", sku, 100, eta=None)

0 commit comments

Comments
 (0)