Skip to content

Commit d0d328e

Browse files
committed
Replace requirements.txt with pyproject.toml, add tests for models and update development documentation
1 parent e4d465f commit d0d328e

4 files changed

Lines changed: 195 additions & 4 deletions

File tree

DEVELOPMENT.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ This document provides information for developers who want to contribute to the
1919

2020
2. Install dependencies:
2121
```bash
22-
pip install -r requirements.txt
22+
pip install -e .
2323
```
2424

2525
3. Set up environment variables as described in the `README.md`.
@@ -53,3 +53,17 @@ If migrations fail due to the `data/` directory missing, ensure it exists:
5353
```bash
5454
mkdir -p data
5555
```
56+
57+
## Running Tests
58+
59+
Testing is highly recommended for validating model relationships and ensuring data integrity.
60+
61+
1. Install development dependencies:
62+
```bash
63+
pip install -e ".[dev]"
64+
```
65+
66+
2. Run tests using `pytest`:
67+
```bash
68+
pytest
69+
```

pyproject.toml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[build-system]
2+
requires = ["setuptools>=61.0"]
3+
build-backend = "setuptools.build_meta"
4+
5+
[project]
6+
name = "open-cinema-index"
7+
version = "0.1.0"
8+
description = "A movie index database"
9+
readme = "README.md"
10+
requires-python = ">=3.10"
11+
dependencies = [
12+
"alembic",
13+
"sqlalchemy",
14+
"typer",
15+
]
16+
17+
[project.optional-dependencies]
18+
dev = [
19+
"pytest",
20+
]
21+
22+
[tool.setuptools.packages.find]
23+
where = ["src"]
24+
25+
[tool.pytest.ini_options]
26+
pythonpath = ["src"]
27+
testpaths = ["tests"]

requirements.txt

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/test_models.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
import pytest
2+
from sqlalchemy import create_engine
3+
from sqlalchemy.orm import sessionmaker
4+
from open_cinema_index.models.base import Base
5+
from open_cinema_index.models.movie import Movie
6+
from open_cinema_index.models.person import Person
7+
from open_cinema_index.models.credit import Credit
8+
from open_cinema_index.models.attribute import Attribute, MovieAttribute
9+
from open_cinema_index.models.award import AwardCeremony, Award, MovieAward
10+
from open_cinema_index.models.movie import MovieAttributeUpdate
11+
12+
@pytest.fixture
13+
def session():
14+
# Use an in-memory SQLite database for testing
15+
engine = create_engine("sqlite:///:memory:")
16+
Base.metadata.create_all(engine)
17+
with sessionmaker(bind=engine)() as session:
18+
yield session
19+
session.close()
20+
21+
def test_create_movie(session):
22+
movie = Movie(title="Inception", release_year=2010)
23+
session.add(movie)
24+
session.commit()
25+
26+
saved_movie = session.query(Movie).filter_by(title="Inception").first()
27+
assert saved_movie is not None
28+
assert saved_movie.title == "Inception"
29+
assert saved_movie.release_year == 2010
30+
31+
def test_create_person(session):
32+
person = Person(name="Christopher Nolan")
33+
session.add(person)
34+
session.commit()
35+
36+
saved_person = session.query(Person).filter_by(name="Christopher Nolan").first()
37+
assert saved_person is not None
38+
assert saved_person.name == "Christopher Nolan"
39+
40+
def test_movie_credit_relationship(session):
41+
movie = Movie(title="Interstellar", release_year=2014)
42+
person = Person(name="Matthew McConaughey")
43+
session.add(movie)
44+
session.add(person)
45+
session.commit()
46+
47+
credit = Credit(movie_id=movie.id, person_id=person.id, role="actor", character_name="Cooper")
48+
session.add(credit)
49+
session.commit()
50+
51+
assert len(movie.credits) == 1
52+
assert movie.credits[0].person.name == "Matthew McConaughey"
53+
assert person.credits[0].movie.title == "Interstellar"
54+
55+
def test_movie_attribute_relationship(session):
56+
movie = Movie(title="The Matrix", release_year=1999)
57+
attribute = Attribute(attribute_type="genre", value="Sci-Fi")
58+
session.add(movie)
59+
session.add(attribute)
60+
session.commit()
61+
62+
movie_attr = MovieAttribute(movie_id=movie.id, attribute_id=attribute.id)
63+
session.add(movie_attr)
64+
session.commit()
65+
66+
assert len(movie.attributes) == 1
67+
assert movie.attributes[0].attribute.value == "Sci-Fi"
68+
assert len(attribute.movie_links) == 1
69+
assert attribute.movie_links[0].movie.title == "The Matrix"
70+
71+
def test_award_relationships(session):
72+
ceremony = AwardCeremony(ceremony_name="Academy Awards")
73+
award = Award(award_name="Best Picture", ceremony=ceremony)
74+
movie = Movie(title="Parasite", release_year=2019)
75+
person = Person(name="Bong Joon-ho")
76+
77+
session.add_all([ceremony, award, movie, person])
78+
session.commit()
79+
80+
movie_award = MovieAward(
81+
movie_id=movie.id,
82+
person_id=person.id,
83+
award_id=award.id,
84+
status="won",
85+
year=2020
86+
)
87+
session.add(movie_award)
88+
session.commit()
89+
90+
assert len(movie.awards) == 1
91+
assert movie.awards[0].award.award_name == "Best Picture"
92+
assert movie.awards[0].person.name == "Bong Joon-ho"
93+
assert len(ceremony.awards) == 1
94+
assert ceremony.awards[0].award_name == "Best Picture"
95+
96+
def test_movie_attribute_update(session):
97+
movie = Movie(title="Tenet", release_year=2020)
98+
session.add(movie)
99+
session.commit()
100+
101+
update = MovieAttributeUpdate(movie_id=movie.id, attribute_type="genre")
102+
session.add(update)
103+
session.commit()
104+
105+
assert len(movie.attribute_updates) == 1
106+
assert movie.attribute_updates[0].attribute_type == "genre"
107+
108+
def test_attribute_unique_constraint(session):
109+
from sqlalchemy.exc import IntegrityError
110+
attr1 = Attribute(attribute_type="color", value="Red")
111+
session.add(attr1)
112+
session.commit()
113+
114+
attr2 = Attribute(attribute_type="color", value="Red")
115+
session.add(attr2)
116+
with pytest.raises(IntegrityError):
117+
session.commit()
118+
119+
def test_cascade_delete_movie(session):
120+
movie = Movie(title="Inception", release_year=2010)
121+
person = Person(name="Leonardo DiCaprio")
122+
session.add_all([movie, person])
123+
session.commit()
124+
125+
credit = Credit(movie_id=movie.id, person_id=person.id, role="actor")
126+
session.add(credit)
127+
session.commit()
128+
129+
assert session.query(Credit).count() == 1
130+
131+
session.delete(movie)
132+
session.commit()
133+
134+
assert session.query(Credit).count() == 0
135+
assert session.query(Person).count() == 1
136+
137+
def test_cascade_delete_person(session):
138+
movie = Movie(title="Inception", release_year=2010)
139+
person = Person(name="Leonardo DiCaprio")
140+
session.add_all([movie, person])
141+
session.commit()
142+
143+
credit = Credit(movie_id=movie.id, person_id=person.id, role="actor")
144+
session.add(credit)
145+
session.commit()
146+
147+
assert session.query(Credit).count() == 1
148+
149+
session.delete(person)
150+
session.commit()
151+
152+
assert session.query(Credit).count() == 0
153+
assert session.query(Movie).count() == 1

0 commit comments

Comments
 (0)