mongoid_versioned_atomic 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +34 -0
- data/lib/mongoid_versioned_atomic.rb +4 -0
- data/lib/mongoid_versioned_atomic/v_atomic.rb +336 -0
- data/lib/mongoid_versioned_atomic/version.rb +3 -0
- data/lib/tasks/mongoid_versioned_atomic_tasks.rake +4 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/facebook.png +0 -0
- data/test/dummy/app/assets/images/keratoscope.jpg +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/entry.rb +11 -0
- data/test/dummy/app/models/thing.rb +5 -0
- data/test/dummy/app/models/user.rb +51 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +29 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +38 -0
- data/test/dummy/config/environments/production.rb +76 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/mongoid.yml +137 -0
- data/test/dummy/config/routes.rb +56 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/log/development.log +21 -0
- data/test/dummy/log/test.log +21976 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/fixtures/users.yml +9 -0
- data/test/dummy/test/models/user_test.rb +7 -0
- data/test/mongoid_versioned_atomic_test.rb +7 -0
- data/test/test_helper.rb +19 -0
- data/test/v_atomic_test.rb +569 -0
- metadata +212 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
body {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body>
|
58
|
+
<!-- This file lives in public/404.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
62
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
63
|
+
</div>
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
65
|
+
</div>
|
66
|
+
</body>
|
67
|
+
</html>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
body {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body>
|
58
|
+
<!-- This file lives in public/422.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>The change you wanted was rejected.</h1>
|
62
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
63
|
+
</div>
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
65
|
+
</div>
|
66
|
+
</body>
|
67
|
+
</html>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
body {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body>
|
58
|
+
<!-- This file lives in public/500.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>We're sorry, but something went wrong.</h1>
|
62
|
+
</div>
|
63
|
+
<p>If you are the application owner check the logs for more information.</p>
|
64
|
+
</div>
|
65
|
+
</body>
|
66
|
+
</html>
|
File without changes
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Configure Rails Environment
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
|
4
|
+
require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
|
5
|
+
require "rails/test_help"
|
6
|
+
|
7
|
+
# Filter out Minitest backtrace while allowing backtrace from other libraries
|
8
|
+
# to be shown.
|
9
|
+
Minitest.backtrace_filter = Minitest::BacktraceFilter.new
|
10
|
+
|
11
|
+
# Load support files
|
12
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
13
|
+
|
14
|
+
# Load fixtures from the engine
|
15
|
+
if ActiveSupport::TestCase.respond_to?(:fixture_path=)
|
16
|
+
ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
|
17
|
+
ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
|
18
|
+
ActiveSupport::TestCase.fixtures :all
|
19
|
+
end
|
@@ -0,0 +1,569 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CoreExtTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
User.delete_all
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def test_cross_model_callbacks
|
11
|
+
t1 = Thing.new
|
12
|
+
t1.versioned_create
|
13
|
+
e = Entry.new
|
14
|
+
e.parent_thing_id = t1.id
|
15
|
+
e.save
|
16
|
+
t1.reload
|
17
|
+
assert_equal(1, t1.entries.size, "the entry id was saved to thing entries")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_versioned_upsert_one_with_set_on_insert
|
21
|
+
a1 = User.new
|
22
|
+
a1.name = "bhargav"
|
23
|
+
a1.email = "bhargav.r.raut@gmail.com"
|
24
|
+
User.versioned_upsert_one({"_id" => a1.id},{"$setOnInsert" => {"name" => "cat"}},User)
|
25
|
+
a1_from_db = User.find(a1.id)
|
26
|
+
assert_equal 1, a1_from_db.version, "set on insert should work with version operator."
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def test_versioned_create_when_document_already_exists
|
32
|
+
|
33
|
+
a1 = User.new
|
34
|
+
a1.name = "bhargav"
|
35
|
+
a1.email = "bhargav.r.raut@gmail.com"
|
36
|
+
a1.versioned_create
|
37
|
+
assert_equal true, a1.op_success, "this op should succeed."
|
38
|
+
|
39
|
+
a2 = User.new
|
40
|
+
a2.name = "bb"
|
41
|
+
a2.email = "bhargav.r.raut@gmail.com"
|
42
|
+
a2.versioned_create({"email" => a2.email})
|
43
|
+
assert_equal true, a2.op_success, "this op should also succeed"
|
44
|
+
assert_nil a2.upserted_id,"no new doc should be upserted"
|
45
|
+
assert_equal 1, a2.matched_count, "it should match an existing doc"
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def test_versioned_upsert_one_returns_a_mongoid_document
|
50
|
+
|
51
|
+
a1 = User.new
|
52
|
+
a1.name = "bhargav"
|
53
|
+
a1.email = "bhargav.r.raut@gmail.com"
|
54
|
+
a1.versioned_create
|
55
|
+
|
56
|
+
ret = User.versioned_upsert_one({"_id" => a1.id},{"$set" => {"name" => "roxanne"}},User)
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
assert_equal true, (ret.methods.include? :attributes), "it should return a mongoid document"
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_versioned_upsert_one_increments_version_if_doc_found_but_doesnt_affect_other_docs
|
65
|
+
|
66
|
+
a1 = User.new
|
67
|
+
a1.name = "bhargav"
|
68
|
+
a1.email = "bhargav.r.raut@gmail.com"
|
69
|
+
a1.versioned_create
|
70
|
+
|
71
|
+
a2 = User.new
|
72
|
+
a2.name = "aditya"
|
73
|
+
a2.email = "aditya@gmail.com"
|
74
|
+
a2.versioned_create
|
75
|
+
|
76
|
+
User.versioned_upsert_one({"_id" => a1.id},{"$set" => {"name" => "roxanne"}},User)
|
77
|
+
|
78
|
+
a1_from_db = User.find(a1.id)
|
79
|
+
a2_from_db = User.find(a2.id)
|
80
|
+
|
81
|
+
assert_equal 2, a1_from_db.version , "the document version should be 2"
|
82
|
+
assert_equal "roxanne", a1_from_db.name, "the name should have been updated"
|
83
|
+
assert_equal 1, a2_from_db.version, "the other documents should not have been affected"
|
84
|
+
assert_equal "aditya",a2_from_db.name, "the name of the other document should be the same as before."
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_versioned_upsert_one_increments_version_if_doc_created
|
89
|
+
|
90
|
+
a1 = User.new
|
91
|
+
a1.name = "bhargav"
|
92
|
+
a1.email = "bh@gmail.com"
|
93
|
+
set_hash = {}
|
94
|
+
a1.as_document.keys.each do |k|
|
95
|
+
if k!= "version"
|
96
|
+
set_hash[k] = a1.as_document[k]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
puts "set hash is:"
|
100
|
+
puts set_hash.to_s
|
101
|
+
User.versioned_upsert_one({"_id" => a1.id},{"$set" => set_hash},User)
|
102
|
+
|
103
|
+
persisted_doc = User.find(a1.id)
|
104
|
+
assert_equal 1, persisted_doc.version, "the persisted document version should be one."
|
105
|
+
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
def test_bypass_versioning_gives_op_success_in_versioned_update
|
111
|
+
|
112
|
+
a1 = User.new
|
113
|
+
a1.name = "bhargav"
|
114
|
+
a1.email = "bh@gmail.com"
|
115
|
+
a1.versioned_create
|
116
|
+
|
117
|
+
a1 = User.find(a1.id)
|
118
|
+
a1.name = "updated name"
|
119
|
+
a1.versioned_update({},true,{},false)
|
120
|
+
|
121
|
+
updated_doc = User.find(a1.id)
|
122
|
+
assert_equal 1, updated_doc.version , "the persisted document version should be one, since we bypassed versioning."
|
123
|
+
assert_equal "updated name", updated_doc.name, "the persisted document name should be the updated name"
|
124
|
+
assert_equal true, a1.op_success, "the operation should still be successfull"
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_versioned_upsert_one_does_not_affect_all_docs_if_query_is_empty
|
129
|
+
|
130
|
+
a1 = User.new
|
131
|
+
a1.name = "bhargav"
|
132
|
+
a1.email = "bhargav.r.raut@gmail.com"
|
133
|
+
a1.versioned_create
|
134
|
+
|
135
|
+
persisted_document = User.find(a1.id)
|
136
|
+
|
137
|
+
a = User.versioned_upsert_one({},{"$set" => {"name" => "dog"}},User)
|
138
|
+
|
139
|
+
assert_equal 1, User.count, "number of documents should not change"
|
140
|
+
assert_equal 1, persisted_document.version, "the version of the only existing document should be 1"
|
141
|
+
assert_equal "bhargav", persisted_document.name, "the name of the persisted document should be the same"
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
##if the document that is searched for is found, then the setOnInsert part will not be executed, but any "inc" keys in the update hash will be.
|
147
|
+
##we test that this does not happen.
|
148
|
+
def test_does_not_increment_version_of_all_existing_document_on_create
|
149
|
+
|
150
|
+
a = User.new
|
151
|
+
a.name = "bhargav"
|
152
|
+
a.email = "u@gmail.com"
|
153
|
+
a.versioned_create
|
154
|
+
|
155
|
+
a2 = User.new
|
156
|
+
a2.name = "bb"
|
157
|
+
a2.email = "bb@gmail.com"
|
158
|
+
a2.versioned_create
|
159
|
+
|
160
|
+
##here there will be a record with this id already found, so nothing new will be inserted.
|
161
|
+
##but we assert that the versions of all the other records in the database are still maitained at one.
|
162
|
+
u1 = User.new
|
163
|
+
u1.name = "b2"
|
164
|
+
u1.email = "b2@gmail.com"
|
165
|
+
u1.versioned_create({"_id" => a.id})
|
166
|
+
|
167
|
+
assert_equal 2, User.count, "there should be only two users"
|
168
|
+
User.all.each do |user|
|
169
|
+
assert_equal 1, user.version, "the version of all docs in the database should be one."
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_query_in_create
|
176
|
+
|
177
|
+
u = User.new
|
178
|
+
u.name = "bhargav"
|
179
|
+
u.email = "u@gmail.com"
|
180
|
+
u.versioned_create
|
181
|
+
|
182
|
+
u1 = User.new
|
183
|
+
u1.name = "aditya"
|
184
|
+
u1.email = "s@gmail.com"
|
185
|
+
u1.versioned_create({"$or" =>
|
186
|
+
[
|
187
|
+
{"_id" => u1.id},
|
188
|
+
{"name" => "bhargav"}
|
189
|
+
]
|
190
|
+
})
|
191
|
+
|
192
|
+
assert_equal 1, User.count, "the user count should be one"
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
def test_create_two_users
|
198
|
+
|
199
|
+
u = User.new
|
200
|
+
u.name = "bhargav"
|
201
|
+
u.email = "t@gmail.com"
|
202
|
+
u.versioned_create
|
203
|
+
|
204
|
+
u1 = User.new
|
205
|
+
u1.name = "dog"
|
206
|
+
u1.email = "d@gmail.com"
|
207
|
+
u1.versioned_create
|
208
|
+
|
209
|
+
assert_equal 1, u.version, "the version of the first user should be one"
|
210
|
+
assert_equal 1, u1.version, "the version of the second user should be one"
|
211
|
+
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_versioned_create
|
215
|
+
u = User.new
|
216
|
+
u.name = "bhargav"
|
217
|
+
u.email = "raut@gmail.com"
|
218
|
+
u.versioned_create
|
219
|
+
|
220
|
+
##assert that attributes are set on the instance itself.
|
221
|
+
assert_equal 1, User.count, "the user count should be one"
|
222
|
+
assert_equal 1, u.version, "the version should have incremented"
|
223
|
+
assert_equal "bhargav", u.name, "the name should have been persisted"
|
224
|
+
assert_equal "raut@gmail.com",u.email, "the email should have been persisted"
|
225
|
+
assert_equal true, u.op_success, "the operation should be successfull"
|
226
|
+
|
227
|
+
##assert that attributes are set on the document in the database
|
228
|
+
u = User.find(u.id)
|
229
|
+
assert_equal 1, u.version, "(db)the version should have incremented"
|
230
|
+
assert_equal "bhargav", u.name, "(db)the name should have been persisted"
|
231
|
+
assert_equal "raut@gmail.com",u.email, "(db)the email should have been persisted"
|
232
|
+
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_versioned_create_should_return_doc_counts
|
236
|
+
a1 = User.new
|
237
|
+
a1.name = "bhargav"
|
238
|
+
a1.email = "rrphotosoft@gmail.com"
|
239
|
+
a1.versioned_create
|
240
|
+
assert_equal 0,a1.matched_count,"should not have any matched documents"
|
241
|
+
assert_not_nil(a1.upserted_id,"there should be an upserted id")
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_versioned_create_should_return_matched_count_as_one_if_doc_exists
|
245
|
+
a1 = User.new
|
246
|
+
a1.name = "bhargav"
|
247
|
+
a1.email = "rrphotosoft@gmail.com"
|
248
|
+
a1.versioned_create
|
249
|
+
|
250
|
+
a2 = User.new
|
251
|
+
a2.name = "bhargav"
|
252
|
+
a2.email = "rrphotosoft@gmail.com"
|
253
|
+
a2.versioned_create({"email" => "rrphotosoft@gmail.com"})
|
254
|
+
assert_equal 1,a2.matched_count,"the matched count should be one."
|
255
|
+
assert_equal 0,a2.modified_count, "the modified count should be zero"
|
256
|
+
assert_nil a2.upserted_id,"the upserted id should be nil"
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
def test_versioned_update_without_providing_dirty_fields
|
261
|
+
u = User.new
|
262
|
+
u.name = "bhargav"
|
263
|
+
u.email = "bhargav.r.raut@gmail.com"
|
264
|
+
u.versioned_create
|
265
|
+
|
266
|
+
##now update one field.
|
267
|
+
u.email = "c@gmail.com"
|
268
|
+
|
269
|
+
|
270
|
+
##assert that attributes are set on the provided instance.
|
271
|
+
u.versioned_update
|
272
|
+
assert_equal 2, u.version, "the document version is 2"
|
273
|
+
assert_equal "c@gmail.com", u.email, "the document email should have updated"
|
274
|
+
assert_equal true, u.op_success, "the operation should be successfull"
|
275
|
+
|
276
|
+
|
277
|
+
##assert that the attributes are set on the document in the database
|
278
|
+
u = User.find(u.id)
|
279
|
+
assert_equal 2,u.version,"(db)the version should be 2"
|
280
|
+
assert_equal "c@gmail.com",u.email, "(db)the document email should have updated"
|
281
|
+
|
282
|
+
end
|
283
|
+
|
284
|
+
|
285
|
+
|
286
|
+
def test_versioned_update_providing_dirty_fields
|
287
|
+
u = User.new
|
288
|
+
u.name = "bhargav"
|
289
|
+
u.email = "bhargav.r.raut@gmail.com"
|
290
|
+
u.versioned_create
|
291
|
+
|
292
|
+
##update two fields
|
293
|
+
u.email = "c@gmail.com"
|
294
|
+
u.name = "doggy"
|
295
|
+
|
296
|
+
##provide only one field as dirty
|
297
|
+
u.versioned_update({"email" => 1})
|
298
|
+
|
299
|
+
##assert that the attributes are set on the present instance.
|
300
|
+
assert_equal 2, u.version, "the document version is 2"
|
301
|
+
assert_equal "c@gmail.com", u.email, "the document email should have updated"
|
302
|
+
assert_equal "bhargav", u.name, "the document name should not have updated, since it was not provided as a dirty field, even if it has changed"
|
303
|
+
assert_equal true, u.op_success, "the operation should be successfull"
|
304
|
+
|
305
|
+
|
306
|
+
##assert that the document in the database is updated.
|
307
|
+
u = User.find(u.id)
|
308
|
+
assert_equal 2,u.version,"(db)the version should be 2"
|
309
|
+
assert_equal "c@gmail.com",u.email, "(db)the document email should have updated"
|
310
|
+
assert_equal "bhargav", u.name, "(db)the document name should not have updated, since it was not provided as a dirty field, even if it has changed"
|
311
|
+
|
312
|
+
end
|
313
|
+
|
314
|
+
|
315
|
+
def test_invalid_documents_are_not_created
|
316
|
+
|
317
|
+
u = User.new
|
318
|
+
u.email = "horse"
|
319
|
+
u.name = "caca"
|
320
|
+
u.versioned_create
|
321
|
+
|
322
|
+
|
323
|
+
##assert that the instance does not contain the invalid fields
|
324
|
+
assert_equal false, u.op_success, "the op should fail"
|
325
|
+
|
326
|
+
|
327
|
+
##assert that there is no such document in the database
|
328
|
+
assert_equal 0, User.count, "(db)there should be no such record in the datbase"
|
329
|
+
|
330
|
+
|
331
|
+
##assert that the error is present on the instance.
|
332
|
+
assert_not_empty u.errors.full_messages, "there are errors"
|
333
|
+
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
|
338
|
+
|
339
|
+
def test_versioned_upsert_one
|
340
|
+
u = User.new
|
341
|
+
u.name = "bhargav"
|
342
|
+
u.email = "bhargav.r.raut@gmail.com"
|
343
|
+
u.versioned_create
|
344
|
+
|
345
|
+
##update
|
346
|
+
updated_doc = User.versioned_upsert_one({"_id" => u.id,"version" => u.version},{"$set" => {"email" => "b.raut@gmail.com"}},User)
|
347
|
+
u = User.find(u.id)
|
348
|
+
assert_equal updated_doc["email"], "b.raut@gmail.com","it should return the updated document"
|
349
|
+
assert_equal u.email, "b.raut@gmail.com","the mongoid document should be updated"
|
350
|
+
|
351
|
+
end
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
def test_before_create_callbacks
|
356
|
+
|
357
|
+
u = User.new
|
358
|
+
u.name = "bhargav"
|
359
|
+
u.email = "b@gmail.com"
|
360
|
+
u.versioned_create
|
361
|
+
u = User.find(u.id)
|
362
|
+
assert_equal 1,u.before_create_field, "the before create callback should fire"
|
363
|
+
|
364
|
+
end
|
365
|
+
|
366
|
+
|
367
|
+
def test_after_create_callbacks
|
368
|
+
|
369
|
+
u = User.new
|
370
|
+
u.name = "bhargav"
|
371
|
+
u.email = "b@gmail.com"
|
372
|
+
u.versioned_create
|
373
|
+
assert_equal 1, u.after_create_field, "the after create callbacks should fire"
|
374
|
+
|
375
|
+
u = User.find(u.id)
|
376
|
+
assert_equal 0, u.after_create_field, "the after create callback should not have persisted anything during the save"
|
377
|
+
|
378
|
+
end
|
379
|
+
|
380
|
+
|
381
|
+
def test_before_update_self_callbacks
|
382
|
+
u = User.new
|
383
|
+
u.name = "bhargav"
|
384
|
+
u.email = "bhargav.r.raut@gmail.com"
|
385
|
+
u.versioned_create
|
386
|
+
u.email = "updated_email@gmail.com"
|
387
|
+
u.versioned_update
|
388
|
+
assert_equal 2, u.version, "the document version is 2"
|
389
|
+
assert_equal "updated_email@gmail.com", u.email, "the document email should be cacophony"
|
390
|
+
assert_equal 1, u.before_update_field, "the before update callback should have fired"
|
391
|
+
|
392
|
+
end
|
393
|
+
|
394
|
+
|
395
|
+
def test_version_conflict
|
396
|
+
|
397
|
+
a = User.new
|
398
|
+
a.name = "bhargav"
|
399
|
+
a.email = "b.r.raut@gmail.com"
|
400
|
+
a.versioned_create
|
401
|
+
|
402
|
+
##now we send an update, but before that we already update it using upsert.
|
403
|
+
##so that we get a version conflict.
|
404
|
+
User.versioned_upsert_one({"_id" => a.id, "version" => a.version},{"$set" => {"email" => "kkk@gmail.com"}},User,false)
|
405
|
+
|
406
|
+
a.name = "changed_name"
|
407
|
+
a.versioned_update
|
408
|
+
|
409
|
+
##if the update fails, if there is a validation error, or the document is not persisted, then
|
410
|
+
|
411
|
+
assert_equal false, a.op_success, "the op should have failed"
|
412
|
+
|
413
|
+
end
|
414
|
+
|
415
|
+
=begin
|
416
|
+
THESE THREE TESTS HAVE BEEN COMMENTED OUT BECAUSE WE HAVE BLOCKED OUT THE BEFORE_ACTION THAT USED TO PREVIOUSLY FILTER OUT THE VERSION AND OP_SUCCESS FIELDS IF THEY HAD BEEN SET, BUT WE DONT DO THAT ANYMORE, BECAUSE IT LED TO UNPREDICTABLE BEHAVIOUR WHERE FOR EG:
|
417
|
+
- FIRST A MODEL IS SAVED USED VERSIONED_CREATE
|
418
|
+
- THAT GIVES IT A VERSION
|
419
|
+
- THEN YOU MAKE SOME CHANGES ON THAT MODEL AND CALL CONVENTIONAL SAVE ON IT
|
420
|
+
- THIS WILL WIPE OUT THE VERSION
|
421
|
+
- THEN SUPPOSE YOU AGAIN WANT TO CALL A VERSIONED_CREATE/UPDATE/UPSERT ON THE SAME RECORD
|
422
|
+
- IT DOES NOT WORK BECAUSE NOW VERSION TAKES ITS DEFAULT VALUE OF ZERO.
|
423
|
+
- TO AVOID THIS PROBLEM, THIS FILTER IS NO LONGER USED, AND HENCE THESE TESTS ARE REDUNDANT.
|
424
|
+
- The filter has been commented out in the module.
|
425
|
+
def test_version_and_op_success_not_persisted_on_calling_save
|
426
|
+
|
427
|
+
a = User.new
|
428
|
+
a.email = "bhargav.r.raut@gmail.com"
|
429
|
+
a.name = "bhargav"
|
430
|
+
a.version = 10
|
431
|
+
a.op_success = true
|
432
|
+
a.save
|
433
|
+
|
434
|
+
|
435
|
+
u = User.find(a.id)
|
436
|
+
|
437
|
+
assert_equal true, a.save, "the document should get saved"
|
438
|
+
assert_nil a.version , "the version should be nil"
|
439
|
+
assert_nil a.op_success, "the op success should be nil"
|
440
|
+
assert_equal a.email, "bhargav.r.raut@gmail.com","the email should have been persisted"
|
441
|
+
|
442
|
+
end
|
443
|
+
|
444
|
+
def test_version_and_op_success_not_persisted_on_calling_create
|
445
|
+
|
446
|
+
q = User.create(:email => "bhargav.r.raut@gmail.com", :name => "ten", :version => 10, :op_success => false)
|
447
|
+
assert_nil q.version, "the version should be nil"
|
448
|
+
assert_nil q.op_success, "the op success shoudl be nil"
|
449
|
+
assert_equal 1, User.count, "there should be one user document"
|
450
|
+
|
451
|
+
end
|
452
|
+
|
453
|
+
|
454
|
+
def test_version_and_op_success_not_persisted_on_calling_update
|
455
|
+
|
456
|
+
a = User.new
|
457
|
+
a.email = "bhargav.r.raut@gmail.com"
|
458
|
+
a.name = "bhargav"
|
459
|
+
a.save
|
460
|
+
|
461
|
+
a.version = 10
|
462
|
+
a.op_success = true
|
463
|
+
a.email = "bharg@gmail.com"
|
464
|
+
a.update_attributes
|
465
|
+
|
466
|
+
r = User.find(a.id)
|
467
|
+
|
468
|
+
assert_nil a.version, "the version on update should be nil"
|
469
|
+
assert_nil a.op_success, "the op success on update should be nil"
|
470
|
+
assert_equal a.email, "bharg@gmail.com"
|
471
|
+
assert_equal r.email, "bharg@gmail.com"
|
472
|
+
|
473
|
+
end
|
474
|
+
=end
|
475
|
+
|
476
|
+
def test_image_versioned_create
|
477
|
+
|
478
|
+
a = User.new
|
479
|
+
a.image = File.new("/home/bhargav/Github/mongoid_versioned_atomic/test/dummy/app/assets/images/facebook.png")
|
480
|
+
a.name = "bhargav"
|
481
|
+
a.email = "test@gmail.com"
|
482
|
+
|
483
|
+
a.versioned_create
|
484
|
+
assert_not_nil a.image
|
485
|
+
|
486
|
+
end
|
487
|
+
|
488
|
+
def test_image_versioned_update
|
489
|
+
|
490
|
+
a = User.new
|
491
|
+
a.image = File.new("/home/bhargav/Github/mongoid_versioned_atomic/test/dummy/app/assets/images/facebook.png")
|
492
|
+
a.name = "bhargav"
|
493
|
+
a.email = "vitesse@gmail.com"
|
494
|
+
a.versioned_create
|
495
|
+
|
496
|
+
a.image = File.new("/home/bhargav/Github/mongoid_versioned_atomic/test/dummy/app/assets/images/keratoscope.jpg")
|
497
|
+
|
498
|
+
a.versioned_update(Hash[User.image_attributes.zip([])])
|
499
|
+
assert_not_nil a.image
|
500
|
+
|
501
|
+
end
|
502
|
+
|
503
|
+
|
504
|
+
def test_bypass_versioning_on_update
|
505
|
+
|
506
|
+
a = User.new
|
507
|
+
a.email = "bhargav.r.raut@gmail.com"
|
508
|
+
a.name = "bhargav"
|
509
|
+
a.versioned_create
|
510
|
+
|
511
|
+
a.name = "changed"
|
512
|
+
query,update,options = a.versioned_update({},true)
|
513
|
+
|
514
|
+
assert_equal 1 , a.version, "the version should be one."
|
515
|
+
assert_equal "changed", a.name, "the name should have been persisted"
|
516
|
+
assert_equal true, query["version"] == nil, "there should be no version parameter in the query."
|
517
|
+
|
518
|
+
a = User.find(a.id)
|
519
|
+
|
520
|
+
assert_equal 1, a.version, "(db) the version in the db should be one"
|
521
|
+
assert_equal "changed", a.name, "(db) the name in the db should be one."
|
522
|
+
|
523
|
+
end
|
524
|
+
|
525
|
+
|
526
|
+
def test_passing_optional_update_hash
|
527
|
+
|
528
|
+
a = User.new
|
529
|
+
a.email = "bhargav.r.raut@gmail.com"
|
530
|
+
a.name = "bhargav"
|
531
|
+
a.versioned_create
|
532
|
+
|
533
|
+
query,options,update = a.versioned_update({},false,{"$inc" => {"likes" => 1}, "$set" => {"name" => "changed"}})
|
534
|
+
|
535
|
+
assert_equal 1, a.likes, "the likes should be one."
|
536
|
+
assert_equal "changed",a.name, "the name should be changed"
|
537
|
+
assert_equal 2, a.version, "the document version is 1"
|
538
|
+
|
539
|
+
|
540
|
+
a = User.find(a.id)
|
541
|
+
assert_equal 1, a.likes, "(db)the likes should be one."
|
542
|
+
assert_equal "changed",a.name, "(db)the name should be changed"
|
543
|
+
assert_equal 2, a.version, "(db)the document version is 1"
|
544
|
+
|
545
|
+
end
|
546
|
+
|
547
|
+
def test_passing_optional_update_hash_and_bypass_versioning
|
548
|
+
|
549
|
+
a = User.new
|
550
|
+
a.email = "bhargav.r.raut@gmail.com"
|
551
|
+
a.name = "bhargav"
|
552
|
+
a.versioned_create
|
553
|
+
|
554
|
+
query,options,update = a.versioned_update({},true,{"$inc" => {"likes" => 1}, "$set" => {"name" => "changed"}})
|
555
|
+
|
556
|
+
assert_equal 1, a.likes, "the likes should be one."
|
557
|
+
assert_equal "changed",a.name, "the name should be changed"
|
558
|
+
assert_equal 1, a.version, "the document version is 1"
|
559
|
+
assert_equal true, query["version"] == nil, "there should be no version parameter in the query."
|
560
|
+
|
561
|
+
a = User.find(a.id)
|
562
|
+
assert_equal 1, a.likes, "(db)the likes should be one."
|
563
|
+
assert_equal "changed",a.name, "(db)the name should be changed"
|
564
|
+
assert_equal 1, a.version, "(db)the document version is 1"
|
565
|
+
|
566
|
+
|
567
|
+
end
|
568
|
+
|
569
|
+
end
|