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,61 @@
1
+ [ {
2
+ "properties" : { },
3
+ "nodes" : {
4
+ "MetaData" : {
5
+ "properties" : { },
6
+ "nodes" : { },
7
+ "meta" : {
8
+ "name" : "MetaData",
9
+ "path" : "/path/subpage1/MetaData",
10
+ "workspace" : "website",
11
+ "depth" : 3,
12
+ "mixinNodeTypes" : [ ],
13
+ "superTypes" : [ "mix:referenceable", "nt:base", "nt:hierarchyNode" ],
14
+ "jcr:uuid" : "f7a6d0b9-e6e9-470b-881d-967bab1e7f76",
15
+ "jcr:primaryType" : "mgnl:metaData",
16
+ "jcr:created" : "2013-06-03T10:17:45.260+02:00"
17
+ }
18
+ }
19
+ },
20
+ "meta" : {
21
+ "name" : "subpage1",
22
+ "path" : "/path/subpage1",
23
+ "workspace" : "website",
24
+ "depth" : 2,
25
+ "mixinNodeTypes" : [ ],
26
+ "superTypes" : [ "mix:referenceable", "nt:base", "nt:hierarchyNode", "mgnl:content" ],
27
+ "jcr:uuid" : "995a776f-242e-453a-9422-d0b7e8e9c068",
28
+ "jcr:primaryType" : "mgnl:page",
29
+ "jcr:created" : "2013-06-03T10:17:45.260+02:00"
30
+ }
31
+ }, {
32
+ "properties" : { },
33
+ "nodes" : {
34
+ "MetaData" : {
35
+ "properties" : { },
36
+ "nodes" : { },
37
+ "meta" : {
38
+ "name" : "MetaData",
39
+ "path" : "/path/subpage2/MetaData",
40
+ "workspace" : "website",
41
+ "depth" : 3,
42
+ "mixinNodeTypes" : [ ],
43
+ "superTypes" : [ "mix:referenceable", "nt:base", "nt:hierarchyNode" ],
44
+ "jcr:uuid" : "c37083de-6a57-48fe-95d0-41fe05fb2ac5",
45
+ "jcr:primaryType" : "mgnl:metaData",
46
+ "jcr:created" : "2013-06-03T10:17:45.260+02:00"
47
+ }
48
+ }
49
+ },
50
+ "meta" : {
51
+ "name" : "subpage2",
52
+ "path" : "/path/subpage2",
53
+ "workspace" : "website",
54
+ "depth" : 2,
55
+ "mixinNodeTypes" : [ ],
56
+ "superTypes" : [ "mix:referenceable", "nt:base", "nt:hierarchyNode", "mgnl:content" ],
57
+ "jcr:uuid" : "bba4bfcd-8347-40d0-9bb6-504ddde1c5a1",
58
+ "jcr:primaryType" : "mgnl:page",
59
+ "jcr:created" : "2013-06-03T10:17:45.260+02:00"
60
+ }
61
+ } ]
@@ -0,0 +1,6 @@
1
+ class MockContent < Sinicum::Jcr::Content
2
+ def initialize(workspace_name = "website", content = {})
3
+ content[:uuid] = Sinicum::Jcr::Content.new_uuid unless content.key?(:uuid)
4
+ initialize_original_content(workspace_name, content)
5
+ end
6
+ end
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'rexml/document'
4
+
5
+ module Sinicum
6
+ describe HelperUtils do
7
+ describe "#object_from_key_or_object" do
8
+ it "should return the node if a node is given as an argument" do
9
+ node = Jcr::Node.new
10
+ helper.send(:object_from_key_or_object, node).should eq(node)
11
+ end
12
+
13
+ it "should query for the node if a UUID is given" do
14
+ uuid = "f082dc7a-c23c-42bf-8338-60a6bd5a777b"
15
+ node = Jcr::Node.new
16
+ Jcr::Node.should_receive(:find_by_uuid).with("website", uuid).and_return(node)
17
+ helper.send(:object_from_key_or_object, uuid, "website").should eq(node)
18
+ end
19
+
20
+ it "should return the property from the current content data if a symbol is given" do
21
+ begin
22
+ content = { title: "Title" }
23
+ Content::Aggregator.original_content = content
24
+ helper.send(:object_from_key_or_object, :title).should eq("Title")
25
+ ensure
26
+ Content::Aggregator.clean
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "#fingerprint_in_asset_path" do
32
+ it "should return when a fingerprint is in the path" do
33
+ helper.send(
34
+ :fingerprint_in_asset_path,
35
+ "/damfiles/image_text_button/home_welcome-841fef0a3e62db91ea8cc9feea6d87a4.jpg"
36
+ ).should be true
37
+ end
38
+
39
+ it "should return true when a fingerprint is in the path and the suffix is missing" do
40
+ helper.send(
41
+ :fingerprint_in_asset_path,
42
+ "/damfiles/image_text_button/home_welcome-841fef0a3e62db91ea8cc9feea6d87a4"
43
+ ).should be true
44
+ end
45
+
46
+ it "should return false when a fingerprint is not in the path" do
47
+ helper.send(
48
+ :fingerprint_in_asset_path,
49
+ "/damfiles/image_text_button/home_welcome"
50
+ ).should be false
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,315 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'rexml/document'
4
+
5
+ module Sinicum
6
+ describe MgnlHelper do
7
+ describe "#mgnl_path" do
8
+ let(:node) do
9
+ node = Jcr::Node.new
10
+ node.stub(:jcr_path).and_return("/the/path")
11
+ node
12
+ end
13
+
14
+ let(:document) do
15
+ node = Jcr::Dam::Document.new
16
+ node.stub(:jcr_path).and_return("/the/path")
17
+ doc = double("document")
18
+ node.stub(:[]).and_return(nil)
19
+ node.stub(:[]).with(:'jcr:content').and_return(doc)
20
+ doc.stub(:[]).and_return(nil)
21
+ node
22
+ end
23
+
24
+ it "should return a node's path" do
25
+ helper.mgnl_path(node).should eq("/the/path")
26
+ end
27
+
28
+ it "should return the right path for a UUID string" do
29
+ Jcr::Node.should_receive(:find_by_uuid)
30
+ .with("website", "900985a3-319c-41c6-b327-b46d7fb56d23")
31
+ .and_return(node)
32
+
33
+ helper.mgnl_path("900985a3-319c-41c6-b327-b46d7fb56d23").should eq("/the/path")
34
+ end
35
+
36
+ it "should handle other repositories than the website" do
37
+ Jcr::Node.should_receive(:find_by_uuid)
38
+ .with("dam", "900985a3-319c-41c6-b327-b46d7fb56d23")
39
+ .and_return(node)
40
+
41
+ helper.mgnl_path("900985a3-319c-41c6-b327-b46d7fb56d23", workspace: "dam")
42
+ .should eq("/the/path")
43
+ end
44
+
45
+ it "should ignore the renderer when the node is not a document" do
46
+ helper.mgnl_path(node, renderer: "video").should eq("/the/path")
47
+ end
48
+
49
+ it "should work with the renderer when the node is a document" do
50
+ helper.mgnl_path(document, renderer: "video").should eq(
51
+ "/damfiles/video/the/path-fc308f85a906fce1be5ff58fd2853af5")
52
+ end
53
+
54
+ it "should return a string if the path given is a string" do
55
+ helper.mgnl_path("/some/path").should eq("/some/path")
56
+ end
57
+
58
+ it "should return a string if the property that defines the link returns a string" do
59
+ Jcr::Node.should_receive(:find_by_uuid)
60
+ .with("website", "900985a3-319c-41c6-b327-b46d7fb56d23")
61
+ .and_return("/some/path")
62
+ helper.mgnl_path("900985a3-319c-41c6-b327-b46d7fb56d23", workspace: "website")
63
+ .should eq("/some/path")
64
+ end
65
+ end
66
+
67
+ describe "#mgnl_content_data" do
68
+ it "should return the current content data from the aggregator" do
69
+ content = double(:content)
70
+ Content::Aggregator.should_receive(:content_data).and_return(content)
71
+ helper.mgnl_content_data.should eq(content)
72
+ end
73
+ end
74
+
75
+ describe "#mgnl_link" do
76
+ it "should pass through a string as a link" do
77
+ doc = REXML::Document.new(helper.mgnl_link("/path/to/link"))
78
+ doc.elements["a"].attributes["href"].should eq("/path/to/link")
79
+ end
80
+
81
+ it "should pass through a string as a link when a block is given" do
82
+ doc = REXML::Document.new(helper.mgnl_link("/path/to/link") { "something" })
83
+ doc.elements["a"].attributes["href"].should eq("/path/to/link")
84
+ end
85
+ end
86
+
87
+ describe "#push" do
88
+ after(:each) do
89
+ Content::Aggregator.clean
90
+ end
91
+
92
+ it "should push content" do
93
+ node = Jcr::Node.new
94
+ block_called = false
95
+ helper.mgnl_push(node) do
96
+ block_called = true
97
+ Content::Aggregator.content_data.should eq(node)
98
+ end
99
+ block_called.should be true
100
+ Content::Aggregator.content_data.should be nil
101
+ end
102
+
103
+ it "should not yield if no content is found"
104
+
105
+ it "should resolve a UUID if a UUID is returned"
106
+ end
107
+
108
+ describe "#mgnl_original_content" do
109
+ it "should fetch the original content"
110
+ end
111
+
112
+ describe "#mgnl_out" do
113
+ let(:node) do
114
+ node = Jcr::Node.new
115
+ node.stub(:title).and_return("The title")
116
+ node
117
+ end
118
+
119
+ before(:each) do
120
+ Content::Aggregator.stub(:original_content).and_return(node)
121
+ end
122
+
123
+ it "should output a property" do
124
+ helper.mgnl_out(:title).should eq("The title")
125
+ end
126
+
127
+ it "should output an empty string if the property does not exist" do
128
+ helper.mgnl_out(:some_unknown_attribute).should eq("")
129
+ end
130
+ end
131
+
132
+ describe "#mgnl_meta" do
133
+ it "should display a title" do
134
+ Sinicum::Content::Aggregator.push(title: "My Headline") do
135
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
136
+ result.root.elements['title'].size.should eq(1)
137
+ end
138
+ end
139
+
140
+ it "should remove tags from the title" do
141
+ Sinicum::Content::Aggregator.push(title: "my <b>bold</b> title") do
142
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
143
+ result.root.elements['title'].size.should eq(1)
144
+ result.root.elements['title'].first.to_s.should eq("my bold title")
145
+ end
146
+ end
147
+
148
+ it "should prefer meta_title for the title" do
149
+ Sinicum::Content::Aggregator.push(meta_title: "Preferred title") do
150
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
151
+ result.root.elements['title'].first.to_s.should eq("Preferred title")
152
+ end
153
+ end
154
+
155
+ it "should add a prefix for the title" do
156
+ Sinicum::Content::Aggregator.push(title: "My Headline") do
157
+ result = REXML::Document.new("<div>" +
158
+ helper.mgnl_meta(title_prefix: "The Prefix") + "</div>")
159
+ result.root.elements['title'].first.to_s.should eq("The Prefix – My Headline")
160
+ end
161
+ end
162
+
163
+ it "should add a suffix for the title" do
164
+ Sinicum::Content::Aggregator.push(title: "My Headline") do
165
+ result = REXML::Document.new("<div>" +
166
+ helper.mgnl_meta(title_suffix: "The Suffix") + "</div>")
167
+ result.root.elements['title'].first.to_s.should eq("My Headline – The Suffix")
168
+ end
169
+ end
170
+
171
+ it "should not add a delimiter after the prefix if no title is present" do
172
+ Sinicum::Content::Aggregator.push({}) do
173
+ result = REXML::Document.new("<div>" +
174
+ helper.mgnl_meta(title_prefix: "The Prefix") + "</div>")
175
+ result.root.elements['title'].first.to_s.should eq("The Prefix")
176
+ end
177
+ end
178
+
179
+ it "should not add a delimiter before the suffix if no title is present" do
180
+ Sinicum::Content::Aggregator.push({}) do
181
+ result = REXML::Document.new("<div>" +
182
+ helper.mgnl_meta(title_prefix: "The Suffix") + "</div>")
183
+ result.root.elements['title'].first.to_s.should eq("The Suffix")
184
+ end
185
+ end
186
+
187
+ it "should not add an emtpy title attribute if no title is defined" do
188
+ Sinicum::Content::Aggregator.push({}) do
189
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
190
+ result.root.elements['title'].first.to_s.should eq("")
191
+ end
192
+ end
193
+
194
+ it "should display a desciption tag" do
195
+ Sinicum::Content::Aggregator.push(meta_description: "A Description") do
196
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
197
+ result.root.elements["meta[@name = 'description']"].attributes["content"]
198
+ .should eq("A Description")
199
+ end
200
+ end
201
+
202
+ it "should not display a desciption tag if no description is given" do
203
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
204
+ result.root.elements["meta[@name = 'description']"].should be nil
205
+ end
206
+
207
+ it "should display a keywords tag" do
208
+ Sinicum::Content::Aggregator.push(meta_keywords: "some keyowrds") do
209
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
210
+ result.root.elements["meta[@name = 'keywords']"].attributes["content"]
211
+ .should eq("some keyowrds")
212
+ end
213
+ end
214
+
215
+ it "should not display a keywords tag if no description is given" do
216
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
217
+ result.root.elements["meta[@name = 'keywords']"].should be nil
218
+ end
219
+
220
+ it "should display 'robots: noindex,nofollow' tag" do
221
+ Sinicum::Content::Aggregator.push(meta_noindex: true) do
222
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
223
+ result.root.elements["meta[@name = 'robots']"].attributes["content"].should =~ /noindex/
224
+ result.root.elements["meta[@name = 'robots']"].attributes["content"].should =~ /nofollow/
225
+ end
226
+ end
227
+
228
+ it "should display no 'robots' tag by default" do
229
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
230
+ result.root.elements["meta[@name = 'robots']"].should be nil
231
+ end
232
+
233
+ it "should display a language tag" do
234
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
235
+ result.root.elements["meta[@name = 'language']"].attributes["content"]
236
+ .should eq(I18n.locale.to_s)
237
+ end
238
+
239
+ it "should display the content type tag" do
240
+ result = REXML::Document.new("<div>" + helper.mgnl_meta + "</div>")
241
+ result.root.elements["meta[@http-equiv = 'content-type']"].attributes["content"]
242
+ .should eq("text/html; charset=utf-8")
243
+ end
244
+
245
+ it "should be html_safe" do
246
+ helper.mgnl_meta.should be_html_safe
247
+ end
248
+ end
249
+
250
+ describe "#mgnl_navigation" do
251
+ let(:handler) { double "handler" }
252
+ let(:el1) { double("el1") }
253
+ let(:el2) { double("el2") }
254
+ let(:elements) { [el1, el2] }
255
+
256
+ describe "path based" do
257
+ before(:each) do
258
+ Navigation::NavigationHandler.should_receive(:children).with("/de", 3)
259
+ .and_return(handler)
260
+ handler.should_receive(:elements).and_return(elements)
261
+ end
262
+
263
+ it "should the children navigation handler" do
264
+ helper.mgnl_navigation("/de", :children, depth: 3)
265
+ end
266
+
267
+ it "should yield the block" do
268
+ expect { |arg| elements.each(&arg) }.to yield_successive_args(el1, el2)
269
+ helper.mgnl_navigation("/de", :children, depth: 3) { |nav| }
270
+ end
271
+
272
+ it "should retun the elements if no block given" do
273
+ result = helper.mgnl_navigation("/de", :children, depth: 3)
274
+ result.size.should eq(2)
275
+ end
276
+ end
277
+
278
+ describe "node based" do
279
+ let(:node) { double("node") }
280
+
281
+ before(:each) do
282
+ Navigation::NavigationHandler.should_receive(:children).with(node, 3)
283
+ .and_return(handler)
284
+ handler.should_receive(:elements).and_return(elements)
285
+ end
286
+
287
+ it "should the children navigation handler" do
288
+ helper.mgnl_navigation(node, :children, depth: 3)
289
+ end
290
+ end
291
+
292
+ describe "path based parents" do
293
+ before(:each) do
294
+ Navigation::NavigationHandler.should_receive(:parents).with("/de")
295
+ .and_return(handler)
296
+ handler.should_receive(:elements).and_return(elements)
297
+ end
298
+
299
+ it "should the children navigation handler" do
300
+ helper.mgnl_navigation("/de", :parents)
301
+ end
302
+
303
+ it "should yield the block" do
304
+ expect { |arg| elements.each(&arg) }.to yield_successive_args(el1, el2)
305
+ helper.mgnl_navigation("/de", :parents) { |nav| }
306
+ end
307
+
308
+ it "should return the elements if no block given" do
309
+ elements = helper.mgnl_navigation("/de", :parents)
310
+ elements.size.should eq(2)
311
+ end
312
+ end
313
+ end
314
+ end
315
+ end
@@ -0,0 +1,103 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'rexml/document'
4
+
5
+ module Sinicum
6
+ describe MgnlHelper do
7
+ let(:uuid) { "900985a3-319c-41c6-b327-b46d7fb56d23" }
8
+ let(:image_node) do
9
+ doc = double("document")
10
+ image_node = Jcr::Dam::Image.new
11
+ image_node.stub(:jcr_path).and_return("/the/path")
12
+ image_node.stub(:"[]").and_return(nil)
13
+ image_node.stub(:width).and_return(100)
14
+ image_node.stub(:height).and_return(50)
15
+ image_node.stub(:width).with("title").and_return(200)
16
+ image_node.stub(:height).with("title").and_return(100)
17
+ image_node.stub(:[]).with(:'jcr:content').and_return(doc)
18
+ doc.stub(:[]).and_return(nil)
19
+ image_node
20
+ end
21
+
22
+ context "when an image exists" do
23
+ before(:each) do
24
+ Jcr::Node.should_receive(:find_by_uuid).with("dam", uuid).and_return(image_node)
25
+ end
26
+
27
+ it "should return the image path" do
28
+ doc = REXML::Document.new(helper.mgnl_img(uuid, renderer: "title"))
29
+ doc.elements["img"].attributes["src"].should eq(
30
+ "/damfiles/title/the/path-fc308f85a906fce1be5ff58fd2853af5")
31
+ end
32
+
33
+ it "should return the image path with source url" do
34
+ helper.stub(:compute_asset_host).and_return("http://www.dievision.de")
35
+ doc = REXML::Document.new(helper.mgnl_img(uuid, renderer: "title"))
36
+ doc.elements["img"].attributes["src"].should eq(
37
+ "http://www.dievision.de/damfiles/title/the/path-fc308f85a906fce1be5ff58fd2853af5")
38
+ Rails.configuration.action_controller.asset_host = nil
39
+ end
40
+
41
+ it "should return a default renderer if no renderer is given" do
42
+ doc = REXML::Document.new(helper.mgnl_img(uuid))
43
+ doc.elements["img"].attributes["src"].should eq(
44
+ "/damfiles/default/the/path-fc308f85a906fce1be5ff58fd2853af5")
45
+ end
46
+
47
+ it "should create the right alt tag" do
48
+ image_node.stub(:'[]').with(:subject).and_return("alttext")
49
+ doc = REXML::Document.new(helper.mgnl_img(uuid, renderer: "title"))
50
+ doc.elements["img"].attributes["alt"].should eq("alttext")
51
+ end
52
+
53
+ it "should return an empty alt tag if no subject is given" do
54
+ doc = REXML::Document.new(helper.mgnl_img(uuid, renderer: "title"))
55
+ doc.elements["img"].attributes["alt"].should eq("")
56
+ end
57
+
58
+ it "should return the height and the width attribute" do
59
+ doc = REXML::Document.new(helper.mgnl_img(uuid))
60
+ doc.elements["img"].attributes["width"].should eq("100")
61
+ doc.elements["img"].attributes["height"].should eq("50")
62
+ end
63
+
64
+ it "should consider the renderer for the image size" do
65
+ doc = REXML::Document.new(helper.mgnl_img(uuid, renderer: "title"))
66
+ doc.elements["img"].attributes["width"].should eq("200")
67
+ doc.elements["img"].attributes["height"].should eq("100")
68
+ end
69
+
70
+ it "should not render the width if width is false" do
71
+ doc = REXML::Document.new(helper.mgnl_img(uuid, renderer: "title", width: false))
72
+ doc.elements["img"].attributes["width"].should be_nil
73
+ end
74
+
75
+ it "should not render the height if height is false" do
76
+ doc = REXML::Document.new(helper.mgnl_img(uuid, renderer: "title", height: false))
77
+ doc.elements["img"].attributes["height"].should be_nil
78
+ end
79
+
80
+ it "should allow for custom height and width attributes" do
81
+ doc = REXML::Document.new(helper.mgnl_img(
82
+ uuid, renderer: "title", width: "85%", height: "33%"))
83
+ doc.elements["img"].attributes["width"].should eq("85%")
84
+ doc.elements["img"].attributes["height"].should eq("33%")
85
+ end
86
+
87
+ it "should be possible to add a class attribute" do
88
+ doc = REXML::Document.new(helper.mgnl_img(uuid, class: "someclass"))
89
+ doc.elements["img"].attributes["class"].should eq("someclass")
90
+ end
91
+
92
+ it "should be possible to add a any random attribute attribute" do
93
+ doc = REXML::Document.new(helper.mgnl_img(uuid, :'data-something' => "data"))
94
+ doc.elements["img"].attributes["data-something"].should eq("data")
95
+ end
96
+ end
97
+
98
+ it "should return nil if no image is found" do
99
+ Jcr::Node.should_receive(:find_by_uuid).with("dam", uuid).and_return(nil)
100
+ helper.mgnl_img(uuid, renderer: "title").should be nil
101
+ end
102
+ end
103
+ end