sinicum 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +19 -0
  3. data/.gitignore +14 -0
  4. data/.rubocop.yml +30 -0
  5. data/.travis.yml +14 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +327 -0
  9. data/Rakefile +37 -0
  10. data/app/assets/javascripts/sinicum/magnolia_client.js.coffee +233 -0
  11. data/app/controllers/sinicum/controller_base.rb +173 -0
  12. data/app/controllers/sinicum/controllers/cache_aware.rb +16 -0
  13. data/app/controllers/sinicum/controllers/global_state_cache.rb +83 -0
  14. data/app/helpers/sinicum/helper_utils.rb +152 -0
  15. data/app/helpers/sinicum/mgnl_helper.rb +145 -0
  16. data/app/helpers/sinicum/mgnl_helper5.rb +7 -0
  17. data/app/helpers/sinicum/mgnl_image_helper.rb +26 -0
  18. data/app/helpers/sinicum/taglib_helper5.rb +166 -0
  19. data/gemfiles/Gemfile-3.2 +6 -0
  20. data/gemfiles/Gemfile-4.0 +6 -0
  21. data/lib/generators/sinicum/install_generator.rb +162 -0
  22. data/lib/generators/sinicum/templates/VersionHandler.java +18 -0
  23. data/lib/generators/sinicum/templates/config/default/log4j-development.xml +203 -0
  24. data/lib/generators/sinicum/templates/config/default/log4j.xml +200 -0
  25. data/lib/generators/sinicum/templates/config/default/magnolia-author.properties +63 -0
  26. data/lib/generators/sinicum/templates/config/default/magnolia-public01.properties +63 -0
  27. data/lib/generators/sinicum/templates/config/default/magnolia.properties +63 -0
  28. data/lib/generators/sinicum/templates/config/repo-conf/jackrabbit-bundle-postgres-search-author.xml +73 -0
  29. data/lib/generators/sinicum/templates/config/repo-conf/jackrabbit-bundle-postgres-search-public01.xml +73 -0
  30. data/lib/generators/sinicum/templates/config/repo-conf/jackrabbit-bundle-postgres-search.xml +70 -0
  31. data/lib/generators/sinicum/templates/magnolia/config.modules.myproject.dialogs.xml +1625 -0
  32. data/lib/generators/sinicum/templates/magnolia/config.modules.myproject.templates.xml +247 -0
  33. data/lib/generators/sinicum/templates/module-config.xml +13 -0
  34. data/lib/generators/sinicum/templates/module-pom.xml +67 -0
  35. data/lib/generators/sinicum/templates/project-pom.xml +104 -0
  36. data/lib/generators/sinicum/templates/rails/_article.html.haml +15 -0
  37. data/lib/generators/sinicum/templates/rails/_content.html.haml +2 -0
  38. data/lib/generators/sinicum/templates/rails/_meta.html.haml +9 -0
  39. data/lib/generators/sinicum/templates/rails/application.html.haml +11 -0
  40. data/lib/generators/sinicum/templates/rails/content_controller.rb +5 -0
  41. data/lib/generators/sinicum/templates/rails/imaging.yml +8 -0
  42. data/lib/generators/sinicum/templates/rails/sinicum_server.yml +15 -0
  43. data/lib/sinicum.rb +53 -0
  44. data/lib/sinicum/content/aggregator.rb +173 -0
  45. data/lib/sinicum/content/website_content_resolver.rb +10 -0
  46. data/lib/sinicum/engine.rb +23 -0
  47. data/lib/sinicum/imaging.rb +29 -0
  48. data/lib/sinicum/imaging/config.rb +133 -0
  49. data/lib/sinicum/imaging/converter.rb +81 -0
  50. data/lib/sinicum/imaging/default_converter.rb +20 -0
  51. data/lib/sinicum/imaging/image_size_converter.rb +52 -0
  52. data/lib/sinicum/imaging/imaging.rb +171 -0
  53. data/lib/sinicum/imaging/imaging_file.rb +115 -0
  54. data/lib/sinicum/imaging/imaging_middleware.rb +56 -0
  55. data/lib/sinicum/imaging/max_size_converter.rb +39 -0
  56. data/lib/sinicum/imaging/resize_crop_converter.rb +35 -0
  57. data/lib/sinicum/jcr/api_client.rb +50 -0
  58. data/lib/sinicum/jcr/api_queries.rb +37 -0
  59. data/lib/sinicum/jcr/cache/global_cache.rb +26 -0
  60. data/lib/sinicum/jcr/dam/document.rb +57 -0
  61. data/lib/sinicum/jcr/dam/image.rb +40 -0
  62. data/lib/sinicum/jcr/jcr_configuration.rb +67 -0
  63. data/lib/sinicum/jcr/mgnl4_compatibility.rb +11 -0
  64. data/lib/sinicum/jcr/node.rb +268 -0
  65. data/lib/sinicum/jcr/node_initializer.rb +16 -0
  66. data/lib/sinicum/jcr/node_queries.rb +101 -0
  67. data/lib/sinicum/jcr/query_sanitizer.rb +24 -0
  68. data/lib/sinicum/jcr/type_translator.rb +38 -0
  69. data/lib/sinicum/jcr/type_translators/component_translator.rb +28 -0
  70. data/lib/sinicum/jcr/type_translators/dam_translator.rb +33 -0
  71. data/lib/sinicum/jcr/type_translators/data_translator.rb +31 -0
  72. data/lib/sinicum/jcr/type_translators/default_translator.rb +13 -0
  73. data/lib/sinicum/jcr/type_translators/translator_base.rb +40 -0
  74. data/lib/sinicum/logger.rb +28 -0
  75. data/lib/sinicum/navigation/default_navigation_element.rb +30 -0
  76. data/lib/sinicum/navigation/navigation_element.rb +39 -0
  77. data/lib/sinicum/navigation/navigation_element_list.rb +33 -0
  78. data/lib/sinicum/navigation/navigation_handler.rb +95 -0
  79. data/lib/sinicum/navigation/navigation_status.rb +27 -0
  80. data/lib/sinicum/templating/area_handler.rb +33 -0
  81. data/lib/sinicum/templating/dialog_resolver.rb +26 -0
  82. data/lib/sinicum/templating/templating_utils.rb +24 -0
  83. data/lib/sinicum/util.rb +12 -0
  84. data/lib/sinicum/version.rb +3 -0
  85. data/script/cibuild +31 -0
  86. data/sinicum.gemspec +29 -0
  87. data/spec/controllers/sinicum/controller_base_spec.rb +53 -0
  88. data/spec/controllers/sinicum/controllers/global_state_cache_spec.rb +35 -0
  89. data/spec/dummy/REVISION +1 -0
  90. data/spec/dummy/Rakefile +7 -0
  91. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  92. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  93. data/spec/dummy/app/views/application/index.html.erb +1 -0
  94. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  95. data/spec/dummy/app/views/layouts/layout_name.html.erb +0 -0
  96. data/spec/dummy/app/views/layouts/my-module/test.html.erb +0 -0
  97. data/spec/dummy/app/views/layouts/my_module/test.html.erb +0 -0
  98. data/spec/dummy/config.ru +4 -0
  99. data/spec/dummy/config/application.rb +45 -0
  100. data/spec/dummy/config/boot.rb +10 -0
  101. data/spec/dummy/config/database.yml +22 -0
  102. data/spec/dummy/config/environment.rb +5 -0
  103. data/spec/dummy/config/environments/development.rb +24 -0
  104. data/spec/dummy/config/environments/production.rb +51 -0
  105. data/spec/dummy/config/environments/test.rb +34 -0
  106. data/spec/dummy/config/imaging.yml +7 -0
  107. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  108. data/spec/dummy/config/initializers/inflections.rb +10 -0
  109. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  110. data/spec/dummy/config/initializers/secret_token.rb +11 -0
  111. data/spec/dummy/config/initializers/session_store.rb +8 -0
  112. data/spec/dummy/config/locales/en.yml +5 -0
  113. data/spec/dummy/config/routes.rb +59 -0
  114. data/spec/dummy/config/sinicum_server.yml +13 -0
  115. data/spec/dummy/public/404.html +26 -0
  116. data/spec/dummy/public/422.html +26 -0
  117. data/spec/dummy/public/500.html +26 -0
  118. data/spec/dummy/public/favicon.ico +0 -0
  119. data/spec/dummy/public/javascripts/application.js +2 -0
  120. data/spec/dummy/public/javascripts/controls.js +965 -0
  121. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  122. data/spec/dummy/public/javascripts/effects.js +1123 -0
  123. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  124. data/spec/dummy/public/javascripts/rails.js +191 -0
  125. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  126. data/spec/dummy/script/rails +6 -0
  127. data/spec/fixtures/api/cache_global.json +3 -0
  128. data/spec/fixtures/api/content_mgnl5.json +22 -0
  129. data/spec/fixtures/api/default_json.json.erb +47 -0
  130. data/spec/fixtures/api/default_json_mgnl5.json.erb +27 -0
  131. data/spec/fixtures/api/file.json +73 -0
  132. data/spec/fixtures/api/file_mgnl5.json +51 -0
  133. data/spec/fixtures/api/homepage.json +1497 -0
  134. data/spec/fixtures/api/homepage_parent.json +483 -0
  135. data/spec/fixtures/api/image.json +73 -0
  136. data/spec/fixtures/api/image_mgnl5.json +50 -0
  137. data/spec/fixtures/api/navigation_children.json +3107 -0
  138. data/spec/fixtures/api/navigation_parents.json +25 -0
  139. data/spec/fixtures/api/product.json +2084 -0
  140. data/spec/fixtures/api/query_result.json +61 -0
  141. data/spec/fixtures/mock_content.rb +6 -0
  142. data/spec/fixtures/mock_image.gif +0 -0
  143. data/spec/helpers/sinicum/helper_utils_spec.rb +55 -0
  144. data/spec/helpers/sinicum/mgnl_helper_spec.rb +315 -0
  145. data/spec/helpers/sinicum/mgnl_image_helper_spec.rb +103 -0
  146. data/spec/sinicum/content/aggregator_spec.rb +91 -0
  147. data/spec/sinicum/content/website_content_resolver_spec.rb +14 -0
  148. data/spec/sinicum/imaging/config_spec.rb +50 -0
  149. data/spec/sinicum/imaging/converter_spec.rb +41 -0
  150. data/spec/sinicum/imaging/image_size_converter_spec.rb +27 -0
  151. data/spec/sinicum/imaging/imaging.yml +15 -0
  152. data/spec/sinicum/imaging/imaging_file_spec.rb +125 -0
  153. data/spec/sinicum/imaging/imaging_middleware_spec.rb +79 -0
  154. data/spec/sinicum/imaging/max_size_converter_spec.rb +52 -0
  155. data/spec/sinicum/imaging/resize_crop_converter_spec.rb +18 -0
  156. data/spec/sinicum/imaging_spec.rb +13 -0
  157. data/spec/sinicum/jcr/api_client_spec.rb +69 -0
  158. data/spec/sinicum/jcr/cache/global_cache_spec.rb +29 -0
  159. data/spec/sinicum/jcr/dam/document_spec.rb +81 -0
  160. data/spec/sinicum/jcr/dam/image_spec.rb +46 -0
  161. data/spec/sinicum/jcr/jcr_configuration_spec.rb +57 -0
  162. data/spec/sinicum/jcr/mgnl4_compatibility_spec.rb +10 -0
  163. data/spec/sinicum/jcr/node_queries_spec.rb +113 -0
  164. data/spec/sinicum/jcr/node_spec.rb +261 -0
  165. data/spec/sinicum/jcr/query_sanitizer_spec.rb +26 -0
  166. data/spec/sinicum/jcr/type_translator_spec.rb +42 -0
  167. data/spec/sinicum/jcr/type_translators/component_translator_spec.rb +71 -0
  168. data/spec/sinicum/jcr/type_translators/data_translator_spec.rb +38 -0
  169. data/spec/sinicum/jcr/type_translators/default_translator_spec.rb +19 -0
  170. data/spec/sinicum/navigation/default_navigation_element_spec.rb +45 -0
  171. data/spec/sinicum/navigation/navigation_handler_spec.rb +71 -0
  172. data/spec/sinicum/templating/dialog_resolver_spec.rb +13 -0
  173. data/spec/sinicum/util_spec.rb +34 -0
  174. data/spec/spec_helper.rb +42 -0
  175. data/spec/support/default_node_reader.rb +40 -0
  176. metadata +434 -0
@@ -0,0 +1,261 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module Sinicum
5
+ module Jcr
6
+ describe Node do
7
+ context "should behave like an ActiveModel object" do
8
+ require 'test/unit/assertions'
9
+ require 'active_model/lint'
10
+ include Test::Unit::Assertions
11
+ include ActiveModel::Lint::Tests
12
+
13
+ before(:each) do
14
+ @model = Node.new
15
+ end
16
+
17
+ unless Rails.version =~ /^4\.1\./
18
+ ActiveModel::Lint::Tests.public_instance_methods.map { |m| m.to_s }.grep(/^test/)
19
+ .each do |m|
20
+ example m.gsub("_", " ") do
21
+ send(m)
22
+ end
23
+ end
24
+
25
+ it "should expose a singular and human name" do
26
+ @model.class.model_name.singular.should eq("sinicum_jcr_node")
27
+ @model.class.model_name.human.should eq("Node")
28
+ end
29
+ end
30
+
31
+ it "should use i18n for model_name.human" do
32
+ begin
33
+ I18n.backend.store_translations(
34
+ I18n.locale,
35
+ activemodel: {
36
+ models: {
37
+ :'sinicum/jcr/node' => "A node name"
38
+ }
39
+ })
40
+ @model.class.model_name.human.should eq("A node name")
41
+ ensure
42
+ I18n.reload!
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "basic properties after JSON initialization" do
48
+ let(:api_response) do
49
+ File.read(File.dirname(__FILE__) + "/../../fixtures/api/content_mgnl5.json")
50
+ end
51
+ let(:json_response) { MultiJson.load(api_response) }
52
+ let(:subject) { Node.new(json_response: json_response.first) }
53
+
54
+ its(:uuid) { should eq("684af75b-0504-467e-92ce-bea998cc8d8b") }
55
+ its(:jcr_path) { should eq("/home") }
56
+ its(:jcr_name) { should eq("home") }
57
+ its(:jcr_primary_type) { should eq("mgnl:page") }
58
+ its(:jcr_super_types) do should eq(
59
+ [
60
+ "mix:created", "mix:referenceable", "nt:base", "nt:hierarchyNode",
61
+ "mgnl:activatable", "mgnl:content", "mgnl:created", "mgnl:lastModified",
62
+ "mgnl:renderable", "mgnl:versionable"
63
+ ])
64
+ end
65
+ its(:jcr_mixin_node_types) { should eq([]) }
66
+ its(:jcr_workspace) { should eq("website") }
67
+ its(:jcr_depth) { should eq(1) }
68
+
69
+ unless defined?(JRUBY_VERSION)
70
+ its(:created_at) { should eq(DateTime.new(2014, 3, 16, 14, 6, 17.666, "+01:00")) }
71
+ its(:updated_at) { should eq(DateTime.new(2014, 3, 18, 15, 57, 51.329, "+01:00")) }
72
+ end
73
+
74
+ its(:mgnl_template) { should eq("themodule:pages/appplication") }
75
+ its(:mgnl_created_by) { should eq("superuser") }
76
+ end
77
+
78
+ describe "handling of properties" do
79
+ let(:api_response) do
80
+ File.read(File.dirname(__FILE__) + "/../../fixtures/api/homepage.json")
81
+ end
82
+ let(:json_response) { MultiJson.load(api_response) }
83
+ let(:subject) { Node.new(json_response: json_response.first) }
84
+
85
+ it "should return the correct title" do
86
+ subject[:title].should eq("Shure: Mikrofone, Funkmikrofone, Ohrhörer")
87
+ subject[:boolean_true_test].should be true
88
+ end
89
+
90
+ it "should be possible to use symbol and string keys interchangeably" do
91
+ subject[:title].should eq("Shure: Mikrofone, Funkmikrofone, Ohrhörer")
92
+ subject["title"].should eq("Shure: Mikrofone, Funkmikrofone, Ohrhörer")
93
+ end
94
+ end
95
+
96
+ describe "handling of child nodes" do
97
+ let(:api_response) do
98
+ File.read(File.dirname(__FILE__) + "/../../fixtures/api/homepage.json")
99
+ end
100
+ let(:json_response) { MultiJson.load(api_response) }
101
+ let(:subject) { Node.new(json_response: json_response.first) }
102
+
103
+ it "should return a child node and resolve an array" do
104
+ children = subject[:orc_13]
105
+ children.should be_kind_of(Array)
106
+ end
107
+
108
+ it "should return the correct child node" do
109
+ children = subject[:orc_13]
110
+ children.first.jcr_path.should eq("/home/orc_13/0")
111
+ end
112
+
113
+ it "should return nodes in multiple steps" do
114
+ picture_teaser = subject[:orc_13].first[:picture_teaser_items].first
115
+ picture_teaser[:link_text].should eq("more")
116
+ end
117
+
118
+ it "should return non-array child nodes" do
119
+ picture_teaser = subject[:orc_13].first[:picture_teaser_items].first
120
+ text_files_node = picture_teaser[:text_files]
121
+ text_files_node.should be_kind_of(Node)
122
+ text_files_node.jcr_path.should eq("/home/orc_13/0/picture_teaser_items/0/text_files")
123
+ end
124
+
125
+ it "should be possible to call a node multiple times" do
126
+ children = subject[:orc_13]
127
+ children.should_not be_nil
128
+ subject[:orc_13].should eq(children)
129
+ end
130
+ end
131
+
132
+ describe "parent handling" do
133
+ let(:api_response) do
134
+ File.read(File.dirname(__FILE__) + "/../../fixtures/api/homepage_parent.json")
135
+ end
136
+ let(:api_response2) do
137
+ File.read(File.dirname(__FILE__) + "/../../fixtures/api/homepage.json")
138
+ end
139
+ let(:json_response) { MultiJson.load(api_response) }
140
+ let(:subject) { Node.new(json_response: json_response) }
141
+
142
+ it "should return its parent node as an Array" do
143
+ body = { body: "should not be triggered because of cache" }
144
+ stub_request(:get, "http://content.dievision.de/sinicum-rest/website/home/orc_13")
145
+ .to_return(body: api_response, headers: { "Content-Type" => "application/json" })
146
+ .times(1).then.to_return(body)
147
+ stub_request(:get, "http://content.dievision.de/sinicum-rest/website/home")
148
+ .to_return(body: api_response2, headers: { "Content-Type" => "application/json" })
149
+
150
+ node = subject[0]
151
+ node.parent.uuid.should eq(subject.uuid)
152
+ node.parent.parent.uuid.should eq('21cbc762-bdcd-4520-9eff-1928986fb419')
153
+ end
154
+ end
155
+
156
+ describe "Type conversion" do
157
+ describe "date conversion" do
158
+ it "should properly convert a iso 8601 time string" do
159
+ time = subject.send(:jcr_time_string_to_datetime, "2010-04-13T09:35:01.322+02:00")
160
+ time.year.should eq(2010)
161
+ time.month.should eq(4)
162
+ time.day.should eq(13)
163
+ time.hour.should eq(9)
164
+ time.minute.should eq(35)
165
+ time.second.should eq(1)
166
+ time.zone.should eq("+02:00")
167
+ end
168
+
169
+ it "should return the original string if it is not an iso8601 format" do
170
+ time = subject.send(:jcr_time_string_to_datetime, "2010-04-13F09:35:01.322+02:00")
171
+ time.should eq("2010-04-13F09:35:01.322+02:00")
172
+ end
173
+
174
+ it "should handle null values" do
175
+ time = subject.send(:jcr_time_string_to_datetime, nil)
176
+ time.should be nil
177
+ end
178
+
179
+ it "should convert Magnolia's Date notation: e.g. 2013-06-05T22:00:00.000Z"
180
+ end
181
+
182
+ describe "boolean conversion" do
183
+ it "should not touch strings" do
184
+ value = subject.send(:mgnl_boolean_string_to_boolean, "Some string")
185
+ value.should eq("Some string")
186
+ end
187
+
188
+ it "should convert true values" do
189
+ value = subject.send(:mgnl_boolean_string_to_boolean, "true")
190
+ value.should be true
191
+ end
192
+
193
+ it "should convert false values" do
194
+ value = subject.send(:mgnl_boolean_string_to_boolean, "false")
195
+ value.should be false
196
+ end
197
+ end
198
+ end
199
+
200
+ describe "persistence" do
201
+ it "should not be persisted as a new node" do
202
+ node = Node.new
203
+ node.should_not be_persisted
204
+ end
205
+
206
+ it "should be persisted if constructed from an api response" do
207
+ api_response = File.read(File.dirname(__FILE__) + "/../../fixtures/api/homepage.json")
208
+ node = Node.new(json_response: api_response)
209
+ node.should be_persisted
210
+ end
211
+ end
212
+
213
+ describe "initialize from hash" do
214
+ it "should set a property" do
215
+ node = Node.new(name: "A name")
216
+ node[:name].should eq("A name")
217
+ end
218
+
219
+ it "should not be possible to set 'forbidden' JCR properties" do
220
+ Node::PROHIBITED_JCR_PROPERTIES.each do |prop|
221
+ expect { Node.new(prop => "value") }.to raise_error
222
+ end
223
+ end
224
+
225
+ it "should not be possible to set 'forbidden' Manglia properties" do
226
+ Node::PROHIBITED_MGNL_PROPERTIES.each do |prop|
227
+ expect { Node.new(prop => "value") }.to raise_error
228
+ end
229
+ end
230
+
231
+ it "should directly set allowed JCR properties" do
232
+ Node::SETABLE_JCR_PROPERTIES.each do |prop|
233
+ node = Node.new(prop => "value")
234
+ node.send(prop).should eq("value")
235
+ end
236
+ end
237
+
238
+ it "should should not set a hash-based value for a directly allowed JCR property" do
239
+ Node::SETABLE_JCR_PROPERTIES.each do |prop|
240
+ node = Node.new(prop => "value")
241
+ node[prop].should be_nil
242
+ end
243
+ end
244
+
245
+ it "should directly set allowed Magnolia properties" do
246
+ Node::SETABLE_MGNL_PROPERTIES.each do |prop|
247
+ node = Node.new(prop => "value")
248
+ node.send(prop).should eq("value")
249
+ end
250
+ end
251
+
252
+ it "should should not set a hash-based value for a directly allowed Magnolia property" do
253
+ Node::SETABLE_MGNL_PROPERTIES.each do |prop|
254
+ node = Node.new(prop => "value")
255
+ node[prop].should be_nil
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ module Sinicum
4
+ module Jcr
5
+ describe QuerySanitizer do
6
+ let(:mock_class) { Class.new { include QuerySanitizer } }
7
+ subject { mock_class.new }
8
+
9
+ it "should not touch a query if no parameters are given" do
10
+ subject.send(:sanitize_query, "xpath", "query").should eq("query")
11
+ end
12
+
13
+ it "should not touch a query if empty parameters are given" do
14
+ subject.send(:sanitize_query, "xpath", "query", {}).should eq("query")
15
+ end
16
+
17
+ it "should sanitize a sql query" do
18
+ query = "select * from microphone where lower(url_path) = ':name' " \
19
+ "and jcr:path like '/products/microphones/en/%'"
20
+ result = subject.send(:sanitize_query, "xpath", query, name: "A name")
21
+ result.should eq("select * from microphone where lower(url_path) = 'A name' " \
22
+ "and jcr:path like '/products/microphones/en/%'")
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module Sinicum
4
+ module Jcr
5
+ describe TypeTranslator do
6
+ let(:first_translator) { Class.new }
7
+ let(:second_translator) { Class.new }
8
+ let(:third_translator) { Class.new }
9
+ let(:fourth_translator) { Class.new }
10
+
11
+ before(:each) { TypeTranslator.clear }
12
+ after(:each) { TypeTranslator.reset }
13
+
14
+ it "should add a new translator to the translator stack" do
15
+ TypeTranslator.use(first_translator)
16
+ TypeTranslator.use(second_translator)
17
+ TypeTranslator.list.should eq([second_translator, first_translator])
18
+ end
19
+
20
+ it "should reset the stack" do
21
+ TypeTranslator.clear
22
+ TypeTranslator.reset
23
+ TypeTranslator.list.should eq(TypeTranslator::DEFAULT_TRANSLATORS)
24
+ end
25
+
26
+ describe "swapping" do
27
+ let(:new_translator) { Class.new }
28
+
29
+ before(:each) do
30
+ [first_translator, second_translator, third_translator, fourth_translator].each do |t|
31
+ TypeTranslator.use(t)
32
+ end
33
+ end
34
+
35
+ it "should clear the stack" do
36
+ TypeTranslator.clear
37
+ TypeTranslator.list.should eq([])
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ module Sinicum
4
+ module Jcr
5
+ module TypeTranslators
6
+ describe ComponentTranslator do
7
+ let(:mock_class) do
8
+ Class.new do
9
+ def initialize(options)
10
+ end
11
+ end
12
+ end
13
+
14
+ [:mgnl4, :mgnl5].each do |mgnl_version|
15
+ it "should return nothing for a default node in #{mgnl_version}" do
16
+ result = ComponentTranslator.initialize_node(
17
+ read_default_node_json("website", "mgnl:contentNode", nil, mgnl_version))
18
+ result.should be nil
19
+ end
20
+
21
+ it "should return a page for a page instance in #{mgnl_version}" do
22
+ json = read_default_node_json(
23
+ "website",
24
+ "mgnl:page",
25
+ "myModule:pages/homepage",
26
+ mgnl_version)
27
+ stub_const("MyModule::Pages::Homepage", mock_class)
28
+
29
+ result = ComponentTranslator.initialize_node(json)
30
+ result.should be_kind_of(mock_class)
31
+ end
32
+
33
+ it "should handle module names with dashes in #{mgnl_version}" do
34
+ json = read_default_node_json(
35
+ "website",
36
+ "mgnl:page",
37
+ "myModule:pages/homepage",
38
+ mgnl_version)
39
+ stub_const("MyModule::Pages::Homepage", mock_class)
40
+
41
+ result = ComponentTranslator.initialize_node(json)
42
+ result.should be_kind_of(mock_class)
43
+ end
44
+
45
+ it "should return nothing if a page class is not defined in #{mgnl_version}" do
46
+ json = read_default_node_json(
47
+ "website",
48
+ "mgnl:page",
49
+ "myModule:pages/homepage",
50
+ mgnl_version)
51
+
52
+ result = ComponentTranslator.initialize_node(json)
53
+ result.should be nil
54
+ end
55
+
56
+ it "should return a page for a component instance in #{mgnl_version}" do
57
+ json = read_default_node_json(
58
+ "website",
59
+ "mgnl:component",
60
+ "myModule:components/path/teaser",
61
+ mgnl_version)
62
+ stub_const("MyModule::Components::Path::Teaser", mock_class)
63
+
64
+ result = ComponentTranslator.initialize_node(json)
65
+ result.should be_kind_of(mock_class)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ module Sinicum
4
+ module Jcr
5
+ module TypeTranslators
6
+ describe ComponentTranslator do
7
+ let(:mock_class) do
8
+ Class.new do
9
+ def initialize(options)
10
+ end
11
+ end
12
+ end
13
+ let(:api_response) do
14
+ File.read(File.dirname(__FILE__) +
15
+ "/../../../fixtures/api/product.json")
16
+ end
17
+
18
+ let(:json) { MultiJson.load(api_response).first }
19
+
20
+ it "should return nothing for a default node" do
21
+ result = DataTranslator.initialize_node(read_default_node_json)
22
+ result.should be nil
23
+ end
24
+
25
+ it "should return a default node when no matching class exists" do
26
+ result = DataTranslator.initialize_node(json)
27
+ result.should be nil
28
+ end
29
+
30
+ it "should initialize a new class based on the node's primary type" do
31
+ stub_const("Microphone", mock_class)
32
+ result = DataTranslator.initialize_node(json)
33
+ result.should be_kind_of(mock_class)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ module Sinicum
4
+ module Jcr
5
+ module TypeTranslators
6
+ describe DefaultTranslator do
7
+ it "should return a Node instance" do
8
+ result = DefaultTranslator.initialize_node(read_default_node_json)
9
+ result.class.should eq(::Sinicum::Jcr::Node)
10
+ end
11
+
12
+ it "should return a properly initialized instance" do
13
+ result = DefaultTranslator.initialize_node(read_default_node_json)
14
+ result.uuid.should eq("21cbc762-bdcd-4520-9eff-1928986fb419")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end