kilt-cms 0.9.13 → 1.0.0
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 +4 -4
- data/README.rdoc +3 -5
- data/app/controllers/kilt/kilt_controller.rb +1 -1
- data/app/views/kilt/form/{boolean.html.erb → _boolean.html.erb} +0 -0
- data/app/views/kilt/form/{datetime.html.erb → _datetime.html.erb} +0 -0
- data/app/views/kilt/form/{file.html.erb → _file.html.erb} +1 -1
- data/app/views/kilt/form/{html.html.erb → _html.html.erb} +0 -0
- data/app/views/kilt/form/{image.html.erb → _image.html.erb} +1 -1
- data/app/views/kilt/form/{longtext.html.erb → _longtext.html.erb} +0 -0
- data/app/views/kilt/form/{number.html.erb → _number.html.erb} +0 -0
- data/app/views/kilt/form/{select_one.html.erb → _select_one.html.erb} +0 -0
- data/app/views/kilt/form/{text.html.erb → _text.html.erb} +0 -0
- data/app/views/kilt/form/{vimeo.html.erb → _vimeo.html.erb} +0 -0
- data/app/views/kilt/form/{youtube.html.erb → _youtube.html.erb} +0 -0
- data/app/views/kilt/kilt/_form.html.erb +12 -10
- data/app/views/kilt/kilt/edit.html.erb +1 -1
- data/app/views/kilt/kilt/index.html.erb +3 -2
- data/app/views/kilt/kilt/list.html.erb +6 -9
- data/app/views/kilt/kilt/new.html.erb +1 -1
- data/app/views/layouts/kilt/cms/_menu.html.erb +2 -6
- data/lib/generators/kilt/backend_generator.rb +28 -6
- data/lib/generators/kilt/templates/backend/create_kilt_objects.rb +13 -0
- data/lib/generators/kilt/templates/backend/creds.yml.example +10 -5
- data/lib/generators/kilt/templates/backend/creds.yml.rethinkdb.example +22 -0
- data/lib/kilt.rb +34 -54
- data/lib/kilt/base.rb +3 -2
- data/lib/kilt/db/active_record.rb +50 -0
- data/lib/kilt/db/rethink_db.rb +108 -0
- data/lib/kilt/form.rb +7 -5
- data/lib/kilt/formatting.rb +39 -0
- data/lib/kilt/object.rb +32 -31
- data/lib/kilt/utils.rb +32 -39
- data/lib/kilt_object.rb +3 -0
- data/test/dummy/config/application.rb +1 -1
- data/test/dummy/config/database.yml +5 -0
- data/test/dummy/config/initializers/kilt.rb +1 -1
- data/test/dummy/config/kilt/config.yml +4 -13
- data/test/dummy/config/kilt/creds.yml +16 -11
- data/test/dummy/config/kilt/creds.yml.rethinkdb.example +22 -0
- data/test/dummy/config/routes.rb +1 -1
- data/test/dummy/db/migrate/20140519110428_create_kilt_objects.rb +13 -0
- data/test/dummy/db/schema.rb +29 -0
- data/test/dummy/log/development.log +551 -0
- data/test/dummy/public/uploads/image/timbo.jpg +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/18837248cb3274df9b7c6b0a5dcd56a5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/20dffc9385ea740ceca470ee4e4b2197 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/23733156ea27da67211ba7ff763d76f0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3148655edeef1c319d57d0f9570acfd5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/32ab48c63ad3bb6ddc1f419e51adb5db +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/36715e644093cfcb33ac795f3c9d66fe +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/36f9a7f6f43adb582ac6eec43b58eb30 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3d8ca1585ee95c5efb388645d66cf377 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/413be9c73d25c7febe933f4619da7cf8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4a935342c0113b534ad7622234965544 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4b5c4a1edd3823a6a6c39e06b6eb230a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4c5736bf0bd429296d1a32930364897e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4f26158b7a804a3e3c47ce0ceff2798c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/542fc810f9cd36e7bed9a3e5e9670995 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/56f1e7d57d31bf3315e1e33732d57faa +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5bea4c2d87ec725262213ed51575b485 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6b6e86e81f5e8f80bb2b3d1e8f7ed7f3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6c2ddc22c04321c269de383e37cb519b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7035e5c60f5da3b7fc12c472677483d0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/704c682957c2beb38a1927ddb66cc557 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/74b6c3e00222b8bf31b0ecf50fcb0d38 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/91021bdb7ebb3d4f6fdf4e49909d4c07 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/914095efd3b33401a7f29f9fb05d72d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9dd98bca318fb820a8451cafce020588 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9f2c00a36b5b8c713a797b508c778a65 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a88ab4e49bb7203b8e0586c38efdd2b0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/acfc15d25fde8b933b06c91324755751 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c0671678b70011547b80da0669d031cc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d6973c1d43f8ca41b98a6b640fda2616 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/dc676330961fd22be77c48cb77ec065f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ddc29f2c13cd99d017fd526b61dcb951 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/de45247cb814cafe20e9e46c79e470fe +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/df0b7c3ac590a286561806e813c2974f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/dfa8b85e3c1273b7e69839e4e607c3e1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e22d705d0c889ec4837f183a9beec0f3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e3a4ad3549e1e57d03698a36daeff406 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ef7c8ce46dfc9e9087ce84dbdfdd0011 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f4b5dd06a6113950c0f481cbc5a31a66 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/data/meta_request/1c3d4a4b-d7e1-4126-8bfc-572acbc2f675.json +1 -0
- data/test/dummy/tmp/data/meta_request/449ff78e-30d2-4cc5-bbb7-3397d04a4c46.json +1 -0
- data/test/dummy/tmp/data/meta_request/5974cfb9-99bd-4d5c-a4e1-6e352ecd2dd8.json +1 -0
- data/test/dummy/tmp/data/meta_request/960de12b-b1c5-4d44-937b-e3d8c00d682c.json +1 -0
- data/test/dummy/tmp/data/meta_request/9df9ad77-1b70-4fb7-ad18-f31f28c60c6c.json +1 -0
- data/test/dummy/tmp/data/meta_request/a5374758-4e16-487a-ab11-9a69a1abed2e.json +1 -0
- data/test/dummy/tmp/data/meta_request/a65d97b2-df1f-445e-99d5-615c4db5c4e1.json +1 -0
- data/test/dummy/tmp/data/meta_request/b3693c6f-23cd-4afe-ae82-38078eaa643a.json +1 -0
- data/test/dummy/tmp/data/meta_request/daa1c80a-bad3-4bc1-8f67-d586979cbedc.json +1 -0
- data/test/dummy/tmp/data/meta_request/e2e7621f-08e5-46dd-83c2-b87eb6d5fd45.json +1 -0
- data/test/empty.sqlite3 +0 -0
- data/test/generators/kilt/backend_generator_spec.rb +70 -0
- data/test/kilt/form_spec.rb +40 -51
- data/test/kilt/formatting_spec.rb +66 -0
- data/test/kilt/object_spec.rb +204 -0
- data/test/kilt/utils_spec.rb +147 -0
- data/test/kilt_object_spec.rb +12 -0
- data/test/kilt_spec.rb +422 -0
- data/test/minitest_helper.rb +58 -0
- metadata +164 -66
- data/test/dummy/tmp/data/meta_request/191f094a-5e87-4654-bc80-5acb51d3f903.json +0 -1
- data/test/dummy/tmp/data/meta_request/1eb9499d-2e84-47df-ac0a-da308031aa3a.json +0 -1
- data/test/dummy/tmp/data/meta_request/300cabd2-6e51-4b1b-ab55-a072049c2a0f.json +0 -1
- data/test/dummy/tmp/data/meta_request/3ec7ea74-e7a7-4f4d-9434-e08edfc12b8a.json +0 -1
- data/test/dummy/tmp/data/meta_request/5bb81411-321e-4cba-9ffa-87fcd8105ef4.json +0 -1
- data/test/dummy/tmp/data/meta_request/9d6e10c1-5b14-4199-852e-9f1e97132b8f.json +0 -1
- data/test/dummy/tmp/data/meta_request/a6403ed9-21f1-4a00-9725-4a1c544214f6.json +0 -1
- data/test/dummy/tmp/data/meta_request/b4487e0b-0a08-40a3-a364-e715e6765631.json +0 -1
- data/test/dummy/tmp/data/meta_request/d399f913-d3a5-4de3-b012-848377a702fc.json +0 -1
- data/test/dummy/tmp/data/meta_request/dcf95267-1855-4062-85c8-e880f8d62443.json +0 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../minitest_helper')
|
|
2
|
+
|
|
3
|
+
describe Kilt::Utils do
|
|
4
|
+
|
|
5
|
+
describe "setting up the database" do
|
|
6
|
+
it "should call setup on the current database" do
|
|
7
|
+
|
|
8
|
+
database = Object.new
|
|
9
|
+
Kilt::Utils.stubs(:database).returns database
|
|
10
|
+
|
|
11
|
+
database.expects(:setup!)
|
|
12
|
+
|
|
13
|
+
Kilt::Utils.setup_db
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "database" do
|
|
19
|
+
|
|
20
|
+
['test', 'development', 'production'].each do |environment|
|
|
21
|
+
|
|
22
|
+
describe "when current environment is #{environment}" do
|
|
23
|
+
|
|
24
|
+
before do
|
|
25
|
+
Kilt::Utils.instance_eval { @database = nil; @db_type = nil }
|
|
26
|
+
ENV.stubs(:[]).with('RAILS_ENV').returns environment
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
after { Kilt::Utils.instance_eval { @database = nil; @db_type = nil } }
|
|
30
|
+
|
|
31
|
+
it "should return a new Kilt database" do
|
|
32
|
+
|
|
33
|
+
database = Object.new
|
|
34
|
+
|
|
35
|
+
Kilt.stubs(:config).returns Object.new
|
|
36
|
+
Kilt.config.stubs(:[]).with(environment.to_sym).returns Object.new
|
|
37
|
+
Kilt.config[environment.to_sym].stubs(:[]).with(:db).returns Object.new
|
|
38
|
+
|
|
39
|
+
Kilt::DB::RethinkDb.stubs(:new)
|
|
40
|
+
.with(Kilt.config[environment.to_sym][:db])
|
|
41
|
+
.returns database
|
|
42
|
+
|
|
43
|
+
Kilt::Utils.database.must_be_same_as database
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should return the same Kilt database everytime it is called" do
|
|
48
|
+
|
|
49
|
+
database = Object.new
|
|
50
|
+
|
|
51
|
+
Kilt.stubs(:config).returns Object.new
|
|
52
|
+
Kilt.config.stubs(:[]).with(environment.to_sym).returns Object.new
|
|
53
|
+
Kilt.config[environment.to_sym].stubs(:[]).with(:db).returns Object.new
|
|
54
|
+
|
|
55
|
+
Kilt::DB::RethinkDb.expects(:new)
|
|
56
|
+
.with(Kilt.config[environment.to_sym][:db])
|
|
57
|
+
.returns database
|
|
58
|
+
|
|
59
|
+
Kilt::Utils.database.must_be_same_as Kilt::Utils.database
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "when config is done the old Kilt way, with a single 'db'" do
|
|
64
|
+
|
|
65
|
+
it "should return a new Kilt database with the development config" do
|
|
66
|
+
|
|
67
|
+
database = Object.new
|
|
68
|
+
|
|
69
|
+
Kilt.stubs(:config).returns Object.new
|
|
70
|
+
Kilt.config.stubs(:[]).returns nil
|
|
71
|
+
Kilt.config.stubs(:[]).with(:db).returns Object.new
|
|
72
|
+
|
|
73
|
+
Kilt::DB::RethinkDb.stubs(:new)
|
|
74
|
+
.with(Kilt.config[:db])
|
|
75
|
+
.returns database
|
|
76
|
+
|
|
77
|
+
Kilt::Utils.database.must_be_same_as database
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
['', nil].each do |environment|
|
|
88
|
+
|
|
89
|
+
describe "when current environment is #{environment}" do
|
|
90
|
+
|
|
91
|
+
before do
|
|
92
|
+
Kilt::Utils.instance_eval { @database = nil; @db_type = nil }
|
|
93
|
+
ENV.stubs(:[]).with('RAILS_ENV').returns environment
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
after { Kilt::Utils.instance_eval { @database = nil; @db_type = nil } }
|
|
97
|
+
|
|
98
|
+
it "should return a new Kilt database with the development config" do
|
|
99
|
+
|
|
100
|
+
database = Object.new
|
|
101
|
+
|
|
102
|
+
Kilt.stubs(:config).returns Object.new
|
|
103
|
+
Kilt.config.stubs(:[]).with(:development).returns Object.new
|
|
104
|
+
Kilt.config[:development].stubs(:[]).with(:db).returns Object.new
|
|
105
|
+
|
|
106
|
+
Kilt::DB::RethinkDb.stubs(:new)
|
|
107
|
+
.with(Kilt.config[:development][:db])
|
|
108
|
+
.returns database
|
|
109
|
+
|
|
110
|
+
Kilt::Utils.database.must_be_same_as database
|
|
111
|
+
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "slugify a string" do
|
|
121
|
+
it "should replace spaces with dashes" do
|
|
122
|
+
Kilt::Utils.slugify("this works").must_equal "this-works"
|
|
123
|
+
end
|
|
124
|
+
it "should remove apostrophes" do
|
|
125
|
+
Kilt::Utils.slugify("this's working").must_equal "thiss-working"
|
|
126
|
+
end
|
|
127
|
+
it "should replace @ and & with at and and" do
|
|
128
|
+
Kilt::Utils.slugify("hands @ two & ten").must_equal "hands-at-two-and-ten"
|
|
129
|
+
end
|
|
130
|
+
it "should replace all non alphanumeric characters with dash" do
|
|
131
|
+
Kilt::Utils.slugify("a!b@c#d$e%f^g&h*i(j)k_l.m,n<o>p[q]r/s|t?u;v~w{x}y+z").must_equal "a-b-at-c-d-e-f-g-and-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z"
|
|
132
|
+
end
|
|
133
|
+
it "should replace periods and underscores with dashes" do
|
|
134
|
+
Kilt::Utils.slugify("this_works.now").must_equal "this-works-now"
|
|
135
|
+
end
|
|
136
|
+
it "should convert double dash to single" do
|
|
137
|
+
Kilt::Utils.slugify("this--works").must_equal "this-works"
|
|
138
|
+
end
|
|
139
|
+
it "should strip leading and trailing dashes" do
|
|
140
|
+
Kilt::Utils.slugify("-this-works-").must_equal "this-works"
|
|
141
|
+
end
|
|
142
|
+
it "should downcase the string" do
|
|
143
|
+
Kilt::Utils.slugify("THIS WORKS").must_equal "this-works"
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
end
|
data/test/kilt_spec.rb
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/minitest_helper')
|
|
2
|
+
|
|
3
|
+
describe Kilt do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
clear_out_the_database
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "types" do
|
|
10
|
+
|
|
11
|
+
it "should return the keys from the objects in the Kilt config" do
|
|
12
|
+
keys = default_test_config.objects.map { |k, _| k }
|
|
13
|
+
Kilt.types.must_equal keys
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
persistence_models_to_test = [['using active record for persistence', :active_record]]
|
|
19
|
+
unless ENV['TRAVIS']
|
|
20
|
+
persistence_models_to_test << ['using rethinkdb for persistence', :rethinkdb]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
persistence_models_to_test.map { |args| Struct.new(:description, :db_type).new(*args) }.each do |persistence|
|
|
24
|
+
|
|
25
|
+
describe persistence.description do
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
Kilt::Utils.use_db persistence.db_type
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe "creating an object" do
|
|
32
|
+
|
|
33
|
+
[
|
|
34
|
+
['1/1/2014', 'cat', 'Apple', Time.parse('1/1/2014').to_i.to_s + "000", 'apple' ],
|
|
35
|
+
['2/2/2016', 'dog', 'Orange', Time.parse('2/2/2016').to_i.to_s + "000", 'orange'],
|
|
36
|
+
].map { |v| Struct.new(:today, :type, :name, :unique_id, :slug).new *v }.each do |scenario|
|
|
37
|
+
|
|
38
|
+
describe "basic scenarios" do
|
|
39
|
+
|
|
40
|
+
let(:values) { {} }
|
|
41
|
+
|
|
42
|
+
let(:object) do
|
|
43
|
+
Kilt::Object.new(scenario.type, values)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
before do
|
|
47
|
+
Timecop.freeze Time.parse(scenario.today)
|
|
48
|
+
values['name'] = scenario.name
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should set a unique id based on time" do
|
|
52
|
+
Kilt.create(object)
|
|
53
|
+
object['unique_id'].must_equal scenario.unique_id
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should set the name" do
|
|
57
|
+
Kilt.create(object)
|
|
58
|
+
object['name'].must_equal scenario.name
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should create an object that can be retrieved out of the database again" do
|
|
62
|
+
Kilt.create(object)
|
|
63
|
+
fresh = Kilt.get(object['slug'])
|
|
64
|
+
fresh['unique_id'].must_equal object['unique_id']
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "should set the type of the object" do
|
|
68
|
+
Kilt.create(object)
|
|
69
|
+
object['type'].must_equal scenario.type
|
|
70
|
+
Kilt.get(object['slug'])['type'].must_equal scenario.type
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "should set the created_at" do
|
|
74
|
+
Kilt.create(object)
|
|
75
|
+
object['created_at'].must_equal Time.parse(scenario.today)
|
|
76
|
+
Kilt.get(object['slug'])['created_at'].must_equal Time.parse(scenario.today)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should set the updated_at" do
|
|
80
|
+
Kilt.create(object)
|
|
81
|
+
object['updated_at'].must_equal Time.parse(scenario.today)
|
|
82
|
+
Kilt.get(object['slug'])['updated_at'].must_equal Time.parse(scenario.today)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "should set a slug on the object" do
|
|
86
|
+
Kilt.create(object)
|
|
87
|
+
object['slug'].must_equal scenario.slug
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
if persistence.db_type == :active_record
|
|
91
|
+
it "should set the unique_id for the object" do
|
|
92
|
+
Kilt.create(object)
|
|
93
|
+
KiltObject.first.unique_id.must_equal object['unique_id']
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
describe "creating the record twice" do
|
|
98
|
+
|
|
99
|
+
it "should keep the slugs unique by appending the id to the second record" do
|
|
100
|
+
|
|
101
|
+
first = Kilt::Object.new(scenario.type, values)
|
|
102
|
+
second = Kilt::Object.new(scenario.type, values.clone)
|
|
103
|
+
|
|
104
|
+
Kilt.create(first)
|
|
105
|
+
Timecop.freeze(Time.now + 5)
|
|
106
|
+
Kilt.create(second)
|
|
107
|
+
|
|
108
|
+
first['slug'].must_equal scenario.slug
|
|
109
|
+
second['slug'].must_equal "#{scenario.slug}-#{second['unique_id']}"
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
[1, 2, 3, 4].each do |error_count|
|
|
120
|
+
|
|
121
|
+
describe "when creating a record fails" do
|
|
122
|
+
if persistence.db_type == :active_record
|
|
123
|
+
it "should return false" do
|
|
124
|
+
KiltObject.stubs(:create!).raises 'error'
|
|
125
|
+
object = Kilt::Object.new('dog', { 'name' => 'A name.' } )
|
|
126
|
+
Kilt.create(object).must_equal false
|
|
127
|
+
end
|
|
128
|
+
else
|
|
129
|
+
it "should return false" do
|
|
130
|
+
Kilt::DB::RethinkDb.any_instance.stubs(:execute).returns( { 'errors' => error_count } )
|
|
131
|
+
object = Kilt::Object.new('dog', { 'name' => 'A name.' } )
|
|
132
|
+
Kilt.create(object).must_equal false
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
describe "updating an object" do
|
|
142
|
+
|
|
143
|
+
[
|
|
144
|
+
['1/1/2012', '2/3/2012', 'cat', 'test', 'something_else', 'A', 'B', 'test'],
|
|
145
|
+
['2/3/2014', '5/3/2015', 'dog', 'apple', 'orange', 'L', 'S', 'apple'],
|
|
146
|
+
].map do |values|
|
|
147
|
+
Struct.new(:created_at, :updated_at, :type, :original_name, :new_name, :original_size, :new_size, :original_slug).new *values
|
|
148
|
+
end.each do |scenario|
|
|
149
|
+
|
|
150
|
+
describe "basic scenarios" do
|
|
151
|
+
|
|
152
|
+
let(:values) { {
|
|
153
|
+
'name' => scenario.original_name,
|
|
154
|
+
'size' => scenario.original_size
|
|
155
|
+
} }
|
|
156
|
+
|
|
157
|
+
let(:object) do
|
|
158
|
+
Kilt::Object.new(scenario.type, values)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
before do
|
|
162
|
+
Kilt.create(object)
|
|
163
|
+
Timecop.freeze Time.parse(scenario.created_at)
|
|
164
|
+
values['name'] = scenario.new_name
|
|
165
|
+
values['size'] = scenario.new_size
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "should use the updated at date" do
|
|
169
|
+
new_date = Time.parse(scenario.updated_at)
|
|
170
|
+
|
|
171
|
+
Timecop.freeze new_date
|
|
172
|
+
Kilt.update object.slug, object
|
|
173
|
+
object['updated_at'].must_equal new_date
|
|
174
|
+
Kilt.get(object['slug'])['updated_at'].must_equal new_date
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "should update the name" do
|
|
178
|
+
Kilt.update object.slug, object
|
|
179
|
+
|
|
180
|
+
object['name'].must_equal scenario.new_name
|
|
181
|
+
Kilt.get(object['slug'])['name'].must_equal scenario.new_name
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "should update the size" do
|
|
185
|
+
Kilt.update object.slug, object
|
|
186
|
+
|
|
187
|
+
object['size'].must_equal scenario.new_size
|
|
188
|
+
Kilt.get(object['slug'])['size'].must_equal scenario.new_size
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "should NOT update the slug" do
|
|
192
|
+
Kilt.update object.slug, object
|
|
193
|
+
|
|
194
|
+
object['slug'].must_equal scenario.original_slug
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
describe "updating the slug" do
|
|
202
|
+
|
|
203
|
+
describe "when the slug is unique" do
|
|
204
|
+
|
|
205
|
+
it "should update the slug" do
|
|
206
|
+
|
|
207
|
+
object = Kilt::Object.new('cat', { 'name' => 'test' } )
|
|
208
|
+
Kilt.create object
|
|
209
|
+
|
|
210
|
+
original_slug = object['slug']
|
|
211
|
+
|
|
212
|
+
object['slug'] = 'different'
|
|
213
|
+
Kilt.update original_slug, object
|
|
214
|
+
|
|
215
|
+
Kilt.get(object['slug'])['unique_id'].must_equal object['unique_id']
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
describe "when the slug is not unique" do
|
|
221
|
+
|
|
222
|
+
before do
|
|
223
|
+
Timecop.freeze Time.parse('1/1/2014')
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "should change the slug to a unique value" do
|
|
227
|
+
|
|
228
|
+
first = Kilt::Object.new('cat', { 'name' => 'first' } )
|
|
229
|
+
Kilt.create first
|
|
230
|
+
|
|
231
|
+
# have to update the time, as the unique id is time-based
|
|
232
|
+
Timecop.freeze Time.now + 1
|
|
233
|
+
|
|
234
|
+
second = Kilt::Object.new('cat', { 'name' => 'second' } )
|
|
235
|
+
Kilt.create second
|
|
236
|
+
|
|
237
|
+
slug = first['slug']
|
|
238
|
+
|
|
239
|
+
first['slug'] = second['slug']
|
|
240
|
+
Kilt.update 'first', first
|
|
241
|
+
|
|
242
|
+
first['slug'].must_equal 'second-' + Time.now.to_i.to_s + "000"
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
[
|
|
248
|
+
['do_not_clear_me', nil],
|
|
249
|
+
['do_not_clear_me', ''],
|
|
250
|
+
['do_not_clear_me', ' '],
|
|
251
|
+
].map { |a| Struct.new(:name, :invalid_value).new *a }.each do |scenario|
|
|
252
|
+
|
|
253
|
+
describe "when the slug is removed" do
|
|
254
|
+
|
|
255
|
+
before do
|
|
256
|
+
Timecop.freeze Time.parse('1/1/2014')
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "should keep a valid slug" do
|
|
260
|
+
|
|
261
|
+
clear_out_the_database
|
|
262
|
+
|
|
263
|
+
first = Kilt::Object.new('cat', { 'name' => scenario.name } )
|
|
264
|
+
Kilt.create first
|
|
265
|
+
|
|
266
|
+
slug = first['slug']
|
|
267
|
+
|
|
268
|
+
first['slug'] = scenario.invalid_value
|
|
269
|
+
Kilt.update slug, first
|
|
270
|
+
|
|
271
|
+
first['slug'].must_equal slug
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
describe "when the slug is removed and the slug will collide with another" do
|
|
277
|
+
|
|
278
|
+
before do
|
|
279
|
+
Timecop.freeze Time.parse('1/1/2014')
|
|
280
|
+
clear_out_the_database
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "should keep a valid slug" do
|
|
284
|
+
|
|
285
|
+
clear_out_the_database
|
|
286
|
+
|
|
287
|
+
first = Kilt::Object.new('dog', { 'name' => 'a unique value' } )
|
|
288
|
+
Kilt.create first
|
|
289
|
+
|
|
290
|
+
Timecop.freeze Time.now + 1
|
|
291
|
+
|
|
292
|
+
second = Kilt::Object.new('dog', { 'name' => scenario.name } )
|
|
293
|
+
Kilt.create second
|
|
294
|
+
|
|
295
|
+
slug = first['slug']
|
|
296
|
+
|
|
297
|
+
first['name'] = scenario.name
|
|
298
|
+
first['slug'] = scenario.invalid_value
|
|
299
|
+
Kilt.update slug, first
|
|
300
|
+
|
|
301
|
+
first['slug'].must_equal second['slug'] + '-' + Time.now.to_i.to_s + "000"
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
[
|
|
313
|
+
['dog', 'rover'],
|
|
314
|
+
['cat', 'fluffy'],
|
|
315
|
+
['dog', 'x'],
|
|
316
|
+
['cat', 'y']
|
|
317
|
+
].map { |args| Struct.new(:type, :name).new(*args) }.each do |scenario|
|
|
318
|
+
|
|
319
|
+
describe "getting an object" do
|
|
320
|
+
|
|
321
|
+
it "should return the object" do
|
|
322
|
+
object = Kilt::Object.new(scenario.type, { 'name' => scenario.name } )
|
|
323
|
+
Kilt.create object
|
|
324
|
+
|
|
325
|
+
result = Kilt.get object['slug']
|
|
326
|
+
|
|
327
|
+
result['unique_id'].must_equal object['unique_id']
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
it "should return a kilt object" do
|
|
331
|
+
object = Kilt::Object.new(scenario.type, { 'name' => scenario.name } )
|
|
332
|
+
Kilt.create object
|
|
333
|
+
|
|
334
|
+
result = Kilt.get object['slug']
|
|
335
|
+
|
|
336
|
+
result.is_a? Kilt::Object
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
describe "no match" do
|
|
340
|
+
it "should return nil" do
|
|
341
|
+
Kilt.get(scenario.name).nil?.must_equal true
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
describe "get collection" do
|
|
350
|
+
|
|
351
|
+
it "should return an object collection" do
|
|
352
|
+
Kilt.get_collection('cat').is_a?(Kilt::ObjectCollection).must_equal true
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
[
|
|
356
|
+
['cat', 'cat'],
|
|
357
|
+
['dog', 'dog'],
|
|
358
|
+
['cats', 'cat'],
|
|
359
|
+
['dogs', 'dog'],
|
|
360
|
+
].map { |args| Struct.new(:type, :singular_type).new(*args) }.each do |scenario|
|
|
361
|
+
|
|
362
|
+
describe "objects exist" do
|
|
363
|
+
before do
|
|
364
|
+
Timecop.freeze Time.parse('3/4/2018')
|
|
365
|
+
['dog', 'cat'].each do |type|
|
|
366
|
+
(1..4).map { |x| Kilt::Object.new(type, { 'name' => "#{type}#{x}" } ) }
|
|
367
|
+
.each do |object|
|
|
368
|
+
Timecop.freeze Time.now + 5
|
|
369
|
+
Kilt.create object
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
it "should return only the objects tied to this type" do
|
|
375
|
+
results = Kilt.get_collection scenario.type
|
|
376
|
+
results.count.must_equal 4
|
|
377
|
+
results.each { |x| x['type'].must_equal scenario.singular_type }
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
describe "delete" do
|
|
387
|
+
|
|
388
|
+
let(:object) do
|
|
389
|
+
o = Kilt::Object.new('cat', { 'name' => 'Anthem' })
|
|
390
|
+
Kilt.create o
|
|
391
|
+
o
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
it "should remove the record from the database" do
|
|
395
|
+
Kilt.delete object['slug']
|
|
396
|
+
|
|
397
|
+
Kilt.get(object['slug']).nil?.must_equal true
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
it "should return true if the delete did not error" do
|
|
401
|
+
Kilt.delete(object['slug']).must_equal true
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
if persistence.db_type == :active_record
|
|
405
|
+
it "should return false if the delete returned errors" do
|
|
406
|
+
KiltObject.any_instance.stubs(:delete).raises 'error'
|
|
407
|
+
Kilt.delete(object['slug']).must_equal false
|
|
408
|
+
end
|
|
409
|
+
else
|
|
410
|
+
it "should return false if the delete returned errors" do
|
|
411
|
+
Kilt::DB::RethinkDb.any_instance.stubs(:execute).returns( { 'errors' => 1 } )
|
|
412
|
+
Kilt.delete(object['slug']).must_equal false
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
end
|