| 1 | """ |
|---|
| 2 | simple test case |
|---|
| 3 | """ |
|---|
| 4 | |
|---|
| 5 | from elixir import * |
|---|
| 6 | |
|---|
| 7 | def setup(): |
|---|
| 8 | global Director, Movie, Actor, Media |
|---|
| 9 | |
|---|
| 10 | class Director(Entity): |
|---|
| 11 | with_fields( |
|---|
| 12 | name = Field(Unicode(60)) |
|---|
| 13 | ) |
|---|
| 14 | |
|---|
| 15 | has_many('movies', of_kind='Movie', inverse='director') |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | class Movie(Entity): |
|---|
| 19 | """ |
|---|
| 20 | simple movie class |
|---|
| 21 | """ |
|---|
| 22 | |
|---|
| 23 | # columns |
|---|
| 24 | with_fields( |
|---|
| 25 | title = Field(Unicode(50)), |
|---|
| 26 | year = Field(Integer) |
|---|
| 27 | ) |
|---|
| 28 | |
|---|
| 29 | # relationships |
|---|
| 30 | belongs_to('director', of_kind="Director", inverse='movies') |
|---|
| 31 | |
|---|
| 32 | has_and_belongs_to_many('actors', of_kind="Actor", inverse='movies') |
|---|
| 33 | has_one('media', of_kind='Media', inverse='movie') |
|---|
| 34 | |
|---|
| 35 | |
|---|
| 36 | class Actor(Entity): |
|---|
| 37 | with_fields( |
|---|
| 38 | name = Field(Unicode(60)) |
|---|
| 39 | ) |
|---|
| 40 | |
|---|
| 41 | has_and_belongs_to_many('movies', of_kind="Movie", inverse="actors") |
|---|
| 42 | |
|---|
| 43 | |
|---|
| 44 | class Media(Entity): |
|---|
| 45 | with_fields( |
|---|
| 46 | number = Field(Integer, primary_key=True) |
|---|
| 47 | ) |
|---|
| 48 | |
|---|
| 49 | belongs_to('movie', of_kind='Movie', inverse='media') |
|---|
| 50 | |
|---|
| 51 | metadata.bind = 'sqlite:///' |
|---|
| 52 | |
|---|
| 53 | def teardown(): |
|---|
| 54 | cleanup_all() |
|---|
| 55 | |
|---|
| 56 | |
|---|
| 57 | class TestMovies(object): |
|---|
| 58 | def setup(self): |
|---|
| 59 | create_all() |
|---|
| 60 | |
|---|
| 61 | def teardown(self): |
|---|
| 62 | drop_all() |
|---|
| 63 | session.clear() |
|---|
| 64 | |
|---|
| 65 | def test_backref(self): |
|---|
| 66 | swars = Movie(title="Star Wars", year=1977) |
|---|
| 67 | glucas = Director(name="George Lucas") |
|---|
| 68 | swars.director = glucas |
|---|
| 69 | |
|---|
| 70 | # does it work before a flush? |
|---|
| 71 | assert swars in glucas.movies |
|---|
| 72 | |
|---|
| 73 | def test_bidirectional(self): |
|---|
| 74 | brunner = Movie(title="Blade Runner", year=1982) |
|---|
| 75 | alien = Movie(title="Alien", year=1979) |
|---|
| 76 | swars = Movie(title="Star Wars", year=1977) |
|---|
| 77 | |
|---|
| 78 | brunner.media = Media(number=1) |
|---|
| 79 | m = Media(number=7) |
|---|
| 80 | m.movie = alien |
|---|
| 81 | |
|---|
| 82 | rscott = Director(name="Ridley Scott") |
|---|
| 83 | glucas = Director(name="George Lucas") |
|---|
| 84 | |
|---|
| 85 | hford = Actor(name="Harrison Ford") |
|---|
| 86 | mhamill = Actor(name="Mark Hamill") |
|---|
| 87 | sweaver = Actor(name="Sigourney Weaver") |
|---|
| 88 | |
|---|
| 89 | rscott.movies.append(brunner) |
|---|
| 90 | rscott.movies.append(alien) |
|---|
| 91 | swars.director = glucas |
|---|
| 92 | |
|---|
| 93 | swars.actors.append(hford) |
|---|
| 94 | swars.actors.append(mhamill) |
|---|
| 95 | alien.actors.append(sweaver) |
|---|
| 96 | brunner.actors.append(hford) |
|---|
| 97 | |
|---|
| 98 | session.flush() |
|---|
| 99 | session.clear() |
|---|
| 100 | |
|---|
| 101 | # directors |
|---|
| 102 | assert Movie.get_by(title="Alien").director is Director.get_by(name="Ridley Scott") |
|---|
| 103 | assert Director.get_by(name="Ridley Scott").name == "Ridley Scott" |
|---|
| 104 | assert Movie.get_by(title="Alien").director.name == "Ridley Scott" |
|---|
| 105 | assert Movie.get_by(title="Star Wars").director is Director.get_by(name="George Lucas") |
|---|
| 106 | |
|---|
| 107 | # movie |
|---|
| 108 | assert Movie.get_by(title="Blade Runner").year == 1982 |
|---|
| 109 | assert Movie.get_by(title="Alien").year == 1979 |
|---|
| 110 | |
|---|
| 111 | # actors |
|---|
| 112 | assert Actor.get_by(name="Harrison Ford") in Movie.get_by(title="Blade Runner").actors |
|---|
| 113 | assert Actor.get_by(name="Harrison Ford") in Movie.get_by(title="Star Wars").actors |
|---|
| 114 | assert Movie.get_by(title="Star Wars") in Actor.get_by(name="Mark Hamill").movies |
|---|
| 115 | assert Movie.get_by(title="Blade Runner") in Actor.get_by(name="Harrison Ford").movies |
|---|
| 116 | |
|---|
| 117 | # media |
|---|
| 118 | assert Movie.get_by(title="Blade Runner").media is Media.get_by(number=1) |
|---|
| 119 | assert Movie.get_by(title="Blade Runner").media.number is Media.get_by(number=1).number |
|---|
| 120 | assert Actor.get_by(name="Sigourney Weaver") in Media.get_by(number=7).movie.actors |
|---|
| 121 | |
|---|
| 122 | if __name__ == '__main__': |
|---|
| 123 | setup() |
|---|
| 124 | test = TestMovies() |
|---|
| 125 | test.setup() |
|---|
| 126 | test.test_bidirectional() |
|---|
| 127 | test.teardown() |
|---|
| 128 | teardown() |
|---|