root / elixir / trunk / tests / test_versioning.py

Revision 533, 5.0 kB (checked in by ged, 13 months ago)

refactor versioning test

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