root / elixir / tags / 0.7.0 / tests / test_versioning.py

Revision 485, 5.0 kB (checked in by ged, 3 years ago)

fix a few cosmetic issues reported by pyflakes (mostly unused imports)

Line 
1from elixir import *
2from elixir.ext.versioned import acts_as_versioned
3from datetime import datetime
4
5import time
6
7nextOneValue = 0
8def nextOne():
9    global nextOneValue
10    nextOneValue += 2
11    return nextOneValue
12
13def setup():
14    global Director, Movie, Actor
15
16    class Director(Entity):
17        name = Field(String(60))
18        movies = OneToMany('Movie', inverse='director')
19        using_options(tablename='directors')
20
21
22    class Movie(Entity):
23        id = Field(Integer, primary_key=True)
24        title = Field(String(60), primary_key=True)
25        description = Field(String(512))
26        releasedate = Field(DateTime)
27        ignoreme = Field(Integer, default=0)
28        autoupd = Field(Integer, default=nextOne, onupdate=nextOne)
29        director = ManyToOne('Director', inverse='movies')
30        actors = ManyToMany('Actor', inverse='movies',
31                            tablename='movie_casting')
32        using_options(tablename='movies')
33        acts_as_versioned(ignore=['ignoreme', 'autoupd'],
34                          column_names=['version_no', 'timestamp_value'])
35
36
37    class Actor(Entity):
38        name = Field(String(60))
39        movies = ManyToMany('Movie', inverse='actors',
40                            tablename='movie_casting')
41        using_options(tablename='actors')
42
43    setup_all()
44    metadata.bind = 'sqlite://'
45
46
47def teardown():
48    cleanup_all()
49
50
51class TestVersioning(object):
52    def setup(self):
53        create_all()
54
55    def teardown(self):
56        drop_all()
57        session.close()
58
59    def test_versioning(self):
60        gilliam = Director(name='Terry Gilliam')
61        monkeys = Movie(id=1, title='12 Monkeys',
62                        description='draft description', director=gilliam)
63        bruce = Actor(name='Bruce Willis', movies=[monkeys])
64        session.commit(); session.clear()
65
66        time.sleep(1)
67        after_create = datetime.now()
68        time.sleep(1)
69
70        movie = Movie.get_by(title='12 Monkeys')
71        assert movie.version_no == 1
72        assert movie.title == '12 Monkeys'
73        assert movie.director.name == 'Terry Gilliam'
74        assert movie.autoupd == 2, movie.autoupd
75        movie.description = 'description two'
76        session.commit(); session.clear()
77
78        time.sleep(1)
79        after_update_one = datetime.now()
80        time.sleep(1)
81
82        movie = Movie.get_by(title='12 Monkeys')
83        movie.description = 'description three'
84        session.commit(); session.clear()
85
86        # Edit the ignored field, this shouldn't change the version
87        monkeys = Movie.get_by(title='12 Monkeys')
88        monkeys.ignoreme = 1
89        session.commit(); session.clear()
90
91        time.sleep(1)
92        after_update_two = datetime.now()
93        time.sleep(1)
94
95        movie = Movie.get_by(title='12 Monkeys')
96        assert movie.autoupd == 8, movie.autoupd
97        oldest_version = movie.get_as_of(after_create)
98        middle_version = movie.get_as_of(after_update_one)
99        latest_version = movie.get_as_of(after_update_two)
100
101        initial_timestamp = oldest_version.timestamp_value
102
103        assert oldest_version.version_no == 1
104        assert oldest_version.description == 'draft description'
105        assert oldest_version.ignoreme == 0
106        assert oldest_version.autoupd is not None
107        assert oldest_version.autoupd > 0
108
109        assert middle_version.version_no == 2
110        assert middle_version.description == 'description two'
111        assert middle_version.autoupd > oldest_version.autoupd
112
113        assert latest_version.version_no == 3, \
114               'version=%i' % latest_version.version_no
115        assert latest_version.description == 'description three'
116        assert latest_version.ignoreme == 1
117        assert latest_version.autoupd > middle_version.autoupd
118
119        differences = latest_version.compare_with(oldest_version)
120        assert differences['description'] == \
121               ('description three', 'draft description')
122
123        assert len(movie.versions) == 3
124        assert movie.versions[0] == oldest_version
125        assert movie.versions[1] == middle_version
126        assert [v.version_no for v in movie.versions] == [1, 2, 3]
127
128        movie.description = 'description four'
129
130        movie.revert_to(2)
131        session.commit(); session.clear()
132
133        movie = Movie.get_by(title='12 Monkeys')
134        assert movie.version_no == 2, \
135               "version=%i, should be 2" % movie.version_no
136        assert movie.description == 'description two', movie.description
137
138        movie.description = "description 3"
139        session.commit(); session.clear()
140
141        movie = Movie.get_by(title='12 Monkeys')
142        movie.description = "description 4"
143        session.commit(); session.clear()
144
145        movie = Movie.get_by(title='12 Monkeys')
146        assert movie.version_no == 4
147        movie.revert_to(movie.versions[-2])
148        movie.description = "description 5"
149        session.commit(); session.clear()
150
151        movie = Movie.get_by(title='12 Monkeys')
152        assert movie.version_no == 4
153        assert movie.versions[-2].description == "description 3"
Note: See TracBrowser for help on using the browser.