kilt-cms 0.9.13 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|