root / elixir / trunk / tests / test_versioning.py @ 218

Revision 218, 3.8 kB (checked in by ged, 7 years ago)
  • Applied patch from Stou Sandalski to add an "ignore" option to the
    versioning ext.
  • Minor improvements to the versioning ext.
  • updated TODO
Line 
1from elixir import *
2from elixir.ext.versioned import acts_as_versioned
3from datetime import datetime, timedelta
4
5import time
6
7
8def setup():
9    global Director, Movie, Actor
10
11    class Director(Entity):
12        has_field('name', Unicode(60))
13        has_many('movies', of_kind='Movie', inverse='director')
14        using_options(tablename='directors')
15
16
17    class Movie(Entity):
18        has_field('id', Integer, primary_key=True)
19        has_field('title', Unicode(60), primary_key=True)
20        has_field('description', Unicode(512))
21        has_field('releasedate', DateTime)
22        has_field('ignoreme', Integer, default=0)
23        belongs_to('director', of_kind='Director', inverse='movies')
24        has_and_belongs_to_many('actors', of_kind='Actor', inverse='movies', tablename='movie_casting')
25        using_options(tablename='movies')
26        acts_as_versioned(ignore=['ignoreme'])
27
28
29    class Actor(Entity):
30        has_field('name', Unicode(60))
31        has_and_belongs_to_many('movies', of_kind='Movie', inverse='actors', tablename='movie_casting')
32        using_options(tablename='actors')
33
34    metadata.bind = 'sqlite:///'
35
36
37def teardown():
38    cleanup_all()
39
40
41class TestVersioning(object):
42    def setup(self):
43        create_all()
44   
45    def teardown(self):
46        drop_all()
47        objectstore.clear()
48   
49    def test_versioning(self):   
50        gilliam = Director(name='Terry Gilliam')
51        monkeys = Movie(id=1, title='12 Monkeys', description='draft description', director=gilliam)
52        bruce = Actor(name='Bruce Willis', movies=[monkeys])
53        objectstore.flush(); objectstore.clear()
54   
55        time.sleep(1)
56        after_create = datetime.now()
57        time.sleep(1)
58   
59        movie = Movie.get_by(title='12 Monkeys')
60        assert movie.version == 1
61        assert movie.title == '12 Monkeys'
62        assert movie.director.name == 'Terry Gilliam'
63        movie.description = 'description two'
64        objectstore.flush(); objectstore.clear()
65   
66        time.sleep(1)
67        after_update_one = datetime.now()
68        time.sleep(1)
69   
70        movie = Movie.get_by(title='12 Monkeys')
71        movie.description = 'description three'
72        objectstore.flush(); objectstore.clear()
73   
74        # Edit the ignored field, this shouldn't change the version
75        monkeys = Movie.get_by(title='12 Monkeys')
76        monkeys.ignoreme = 1
77        objectstore.flush(); objectstore.clear()
78   
79        time.sleep(1)
80        after_update_two = datetime.now()
81        time.sleep(1)
82   
83        movie = Movie.get_by(title='12 Monkeys')
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
89   
90        assert oldest_version.version == 1
91        assert oldest_version.description == 'draft description'
92        assert oldest_version.ignoreme == 0
93   
94        assert middle_version.version == 2
95        assert middle_version.description == 'description two'
96   
97        assert latest_version.version == 3
98        assert latest_version.description == 'description three'
99        assert latest_version.ignoreme == 1
100   
101        differences = latest_version.compare_with(oldest_version)
102        assert differences['description'] == ('description three', 'draft description')
103   
104        assert len(movie.versions) == 3
105        assert movie.versions[0] == oldest_version
106        assert movie.versions[1] == middle_version
107   
108        movie.revert_to(1)
109        objectstore.flush(); objectstore.clear()
110   
111        movie = Movie.get_by(title='12 Monkeys')
112        assert movie.version == 1
113        assert movie.timestamp == initial_timestamp
114        assert movie.title == '12 Monkeys'
115        assert movie.director.name == 'Terry Gilliam'
Note: See TracBrowser for help on using the browser.