dugway 0.5.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.
- data/.gitignore +7 -0
- data/.travis.yml +3 -0
- data/Gemfile +2 -0
- data/README.md +151 -0
- data/Rakefile +12 -0
- data/bin/dugway +7 -0
- data/dugway.gemspec +43 -0
- data/lib/dugway.rb +66 -0
- data/lib/dugway/application.rb +147 -0
- data/lib/dugway/cart.rb +144 -0
- data/lib/dugway/cli.rb +22 -0
- data/lib/dugway/cli/build.rb +56 -0
- data/lib/dugway/cli/create.rb +71 -0
- data/lib/dugway/cli/server.rb +37 -0
- data/lib/dugway/cli/templates/Gemfile.tt +2 -0
- data/lib/dugway/cli/templates/config.tt +24 -0
- data/lib/dugway/cli/templates/gitignore.tt +9 -0
- data/lib/dugway/cli/templates/source/cart.html +40 -0
- data/lib/dugway/cli/templates/source/checkout.html +33 -0
- data/lib/dugway/cli/templates/source/contact.html +37 -0
- data/lib/dugway/cli/templates/source/home.html +25 -0
- data/lib/dugway/cli/templates/source/images/badge.png +0 -0
- data/lib/dugway/cli/templates/source/javascripts/cart.js.coffee +7 -0
- data/lib/dugway/cli/templates/source/javascripts/product.js.coffee +7 -0
- data/lib/dugway/cli/templates/source/layout.html +101 -0
- data/lib/dugway/cli/templates/source/maintenance.html +20 -0
- data/lib/dugway/cli/templates/source/product.html +65 -0
- data/lib/dugway/cli/templates/source/products.html +25 -0
- data/lib/dugway/cli/templates/source/screenshot.jpg +0 -0
- data/lib/dugway/cli/templates/source/scripts.js +19 -0
- data/lib/dugway/cli/templates/source/settings.json +71 -0
- data/lib/dugway/cli/templates/source/styles.css +27 -0
- data/lib/dugway/cli/templates/source/stylesheets/cart.css.sass +38 -0
- data/lib/dugway/cli/templates/source/stylesheets/layout.css.sass +103 -0
- data/lib/dugway/cli/templates/source/stylesheets/product.css.sass +19 -0
- data/lib/dugway/cli/templates/source/stylesheets/products.css.sass +20 -0
- data/lib/dugway/cli/templates/source/stylesheets/vendor/normalize.css +396 -0
- data/lib/dugway/cli/templates/source/success.html +5 -0
- data/lib/dugway/controller.rb +148 -0
- data/lib/dugway/data/locales/cs.yml +26 -0
- data/lib/dugway/data/locales/da.yml +26 -0
- data/lib/dugway/data/locales/en-AU.yml +26 -0
- data/lib/dugway/data/locales/en-GB.yml +26 -0
- data/lib/dugway/data/locales/en-PH.yml +27 -0
- data/lib/dugway/data/locales/en-US.yml +26 -0
- data/lib/dugway/data/locales/es-MX.yml +26 -0
- data/lib/dugway/data/locales/eu.yml +26 -0
- data/lib/dugway/data/locales/gsw-CH.yml +26 -0
- data/lib/dugway/data/locales/hu.yml +26 -0
- data/lib/dugway/data/locales/il.yml +26 -0
- data/lib/dugway/data/locales/ja.yml +30 -0
- data/lib/dugway/data/locales/ms-MY.yml +26 -0
- data/lib/dugway/data/locales/nb.yml +22 -0
- data/lib/dugway/data/locales/pl.yml +27 -0
- data/lib/dugway/data/locales/pt-BR.yml +26 -0
- data/lib/dugway/data/locales/sv-SE.yml +26 -0
- data/lib/dugway/data/locales/th.yml +26 -0
- data/lib/dugway/data/locales/tr.yml +29 -0
- data/lib/dugway/data/locales/zh-TW.yml +30 -0
- data/lib/dugway/data/theme_fonts.yml +151 -0
- data/lib/dugway/extensions/time.rb +15 -0
- data/lib/dugway/liquid/drops/account_drop.rb +17 -0
- data/lib/dugway/liquid/drops/artist_drop.rb +9 -0
- data/lib/dugway/liquid/drops/artists_drop.rb +13 -0
- data/lib/dugway/liquid/drops/base_drop.rb +59 -0
- data/lib/dugway/liquid/drops/cart_drop.rb +13 -0
- data/lib/dugway/liquid/drops/cart_item_drop.rb +21 -0
- data/lib/dugway/liquid/drops/categories_drop.rb +13 -0
- data/lib/dugway/liquid/drops/category_drop.rb +9 -0
- data/lib/dugway/liquid/drops/contact_drop.rb +29 -0
- data/lib/dugway/liquid/drops/country_drop.rb +6 -0
- data/lib/dugway/liquid/drops/currency_drop.rb +6 -0
- data/lib/dugway/liquid/drops/image_drop.rb +6 -0
- data/lib/dugway/liquid/drops/page_drop.rb +13 -0
- data/lib/dugway/liquid/drops/pages_drop.rb +9 -0
- data/lib/dugway/liquid/drops/product_drop.rb +101 -0
- data/lib/dugway/liquid/drops/product_option_drop.rb +27 -0
- data/lib/dugway/liquid/drops/products_drop.rb +75 -0
- data/lib/dugway/liquid/drops/shipping_option_drop.rb +13 -0
- data/lib/dugway/liquid/drops/theme_drop.rb +23 -0
- data/lib/dugway/liquid/filters/comparison_filters.rb +48 -0
- data/lib/dugway/liquid/filters/core_filters.rb +138 -0
- data/lib/dugway/liquid/filters/default_pagination.rb +35 -0
- data/lib/dugway/liquid/filters/font_filters.rb +9 -0
- data/lib/dugway/liquid/filters/url_filters.rb +66 -0
- data/lib/dugway/liquid/filters/util_filters.rb +119 -0
- data/lib/dugway/liquid/tags/checkout_form.rb +9 -0
- data/lib/dugway/liquid/tags/get.rb +58 -0
- data/lib/dugway/liquid/tags/paginate.rb +129 -0
- data/lib/dugway/liquifier.rb +122 -0
- data/lib/dugway/logger.rb +16 -0
- data/lib/dugway/request.rb +36 -0
- data/lib/dugway/store.rb +166 -0
- data/lib/dugway/template.rb +44 -0
- data/lib/dugway/theme.rb +145 -0
- data/lib/dugway/theme_font.rb +68 -0
- data/lib/dugway/version.rb +3 -0
- data/spec/fixtures/store/page/about-us.js +1 -0
- data/spec/fixtures/store/products.js +1 -0
- data/spec/fixtures/store/store.js +1 -0
- data/spec/fixtures/theme/cart.html +33 -0
- data/spec/fixtures/theme/checkout.html +31 -0
- data/spec/fixtures/theme/contact.html +37 -0
- data/spec/fixtures/theme/home.html +38 -0
- data/spec/fixtures/theme/images/bc_badge.png +0 -0
- data/spec/fixtures/theme/javascripts/one.js +3 -0
- data/spec/fixtures/theme/javascripts/two.js.coffee +2 -0
- data/spec/fixtures/theme/layout.html +77 -0
- data/spec/fixtures/theme/maintenance.html +17 -0
- data/spec/fixtures/theme/product.html +73 -0
- data/spec/fixtures/theme/products.html +41 -0
- data/spec/fixtures/theme/screenshot.jpg +0 -0
- data/spec/fixtures/theme/scripts.js +2 -0
- data/spec/fixtures/theme/settings.json +55 -0
- data/spec/fixtures/theme/styles.css +4 -0
- data/spec/fixtures/theme/stylesheets/one.css +3 -0
- data/spec/fixtures/theme/stylesheets/two.css.sass +4 -0
- data/spec/fixtures/theme/success.html +5 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/units/dugway/request_spec.rb +206 -0
- data/spec/units/dugway/store_spec.rb +194 -0
- data/spec/units/dugway/template_spec.rb +145 -0
- data/spec/units/dugway/theme_font_spec.rb +136 -0
- data/spec/units/dugway_spec.rb +9 -0
- metadata +549 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Dugway::Store do
|
|
4
|
+
let(:store) { Dugway::Store.new('dugway') }
|
|
5
|
+
|
|
6
|
+
describe "#account" do
|
|
7
|
+
it "should return account params" do
|
|
8
|
+
store.account.should be_present
|
|
9
|
+
store.account['name'].should == 'Dugway'
|
|
10
|
+
store.account['url'].should == 'http://dugway.bigcartel.com'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "#theme_pages" do
|
|
15
|
+
it "should return an array of the default theme pages" do
|
|
16
|
+
store.theme_pages.should be_present
|
|
17
|
+
store.theme_pages.size.should == 8
|
|
18
|
+
store.theme_pages.first.should == { 'name' => 'Home', 'permalink' => 'home', 'url' => '/', 'category' => 'theme' }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "#custom_pages" do
|
|
23
|
+
it "should return an array of the store's custom pages" do
|
|
24
|
+
store.custom_pages.should be_present
|
|
25
|
+
store.custom_pages.size.should == 1
|
|
26
|
+
store.custom_pages.first.should == { 'category' => 'custom', 'content' => "<p>We're really cool!</p>", 'permalink' => 'about-us', 'name' => 'About Us', 'id' => 95821979, 'url' => '/about-us' }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "#pages" do
|
|
31
|
+
it "should return an array of the combined theme and custom pages" do
|
|
32
|
+
store.pages.should be_present
|
|
33
|
+
store.pages.size.should == 9
|
|
34
|
+
store.pages.first.should == { 'name' => 'Home', 'permalink' => 'home', 'url' => '/', 'category' => 'theme' }
|
|
35
|
+
store.pages.last.should == { 'category' => 'custom', 'content' => "<p>We're really cool!</p>", 'permalink' => 'about-us', 'name' => 'About Us', 'id' => 95821979, 'url' => '/about-us' }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "#page" do
|
|
40
|
+
it "should return a theme page by permalink" do
|
|
41
|
+
store.page('home').should == { 'name' => 'Home', 'permalink' => 'home', 'url' => '/', 'category' => 'theme' }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should return a custom page by permalink" do
|
|
45
|
+
store.page('about-us').should == { 'category' => 'custom', 'content' => "<p>We're really cool!</p>", 'permalink' => 'about-us', 'name' => 'About Us', 'id' => 95821979, 'url' => '/about-us' }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should return nil with a bad permalink" do
|
|
49
|
+
store.page('blah').should be_nil
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "#categories" do
|
|
54
|
+
it "should return an array of the store's categories" do
|
|
55
|
+
store.categories.should be_present
|
|
56
|
+
store.categories.size.should == 4
|
|
57
|
+
store.categories.first.should == { 'permalink' => 'cds', 'name' => 'CDs', 'id' => 4615184, 'url' => '/category/cds' }
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe "#category" do
|
|
62
|
+
it "should return a category by permalink" do
|
|
63
|
+
store.category('cds').should == { 'permalink' => 'cds', 'name' => 'CDs', 'id' => 4615184, 'url' => '/category/cds' }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should return nil with a bad permalink" do
|
|
67
|
+
store.category('blah').should be_nil
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe "#category_products" do
|
|
72
|
+
it "should return an array of products for that category" do
|
|
73
|
+
products = store.category_products('tees')
|
|
74
|
+
products.size.should == 2
|
|
75
|
+
products.first['name'].should == 'My Product'
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should return an empty array with a bad permalink" do
|
|
79
|
+
store.category_products('blah').should == []
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
describe "#artists" do
|
|
84
|
+
it "should return an array of the store's artists" do
|
|
85
|
+
store.artists.should be_present
|
|
86
|
+
store.artists.size.should == 2
|
|
87
|
+
store.artists.first.should == { 'permalink' => 'artist-one', 'name' => 'Artist One', 'id' => 176141, 'url' => '/artist/artist-one' }
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "#artist" do
|
|
92
|
+
it "should return an artist by permalink" do
|
|
93
|
+
store.artist('artist-one').should == { 'permalink' => 'artist-one', 'name' => 'Artist One', 'id' => 176141, 'url' => '/artist/artist-one' }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "should return nil with a bad permalink" do
|
|
97
|
+
store.artist('blah').should be_nil
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe "#artist_products" do
|
|
102
|
+
it "should return an array of products for that artist" do
|
|
103
|
+
products = store.artist_products('artist-one')
|
|
104
|
+
products.size.should == 1
|
|
105
|
+
products.first['name'].should == 'My Product'
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "should return an empty array with a bad permalink" do
|
|
109
|
+
store.artist_products('blah').should == []
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
describe "#products" do
|
|
114
|
+
it "should return an array of the store's products" do
|
|
115
|
+
store.products.should be_present
|
|
116
|
+
store.products.size.should == 3
|
|
117
|
+
store.products.first['name'].should == 'My Product'
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe "#product" do
|
|
122
|
+
it "should return a product by permalink" do
|
|
123
|
+
store.product('my-product')['name'].should == 'My Product'
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "should return nil with a bad permalink" do
|
|
127
|
+
store.product('blah').should be_nil
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe "#product_and_option" do
|
|
132
|
+
it "should a product and option by option id" do
|
|
133
|
+
product, option = store.product_and_option(29474321)
|
|
134
|
+
product['name'].should == 'My Product'
|
|
135
|
+
option['name'].should == 'Small'
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should return nil with a bad option id" do
|
|
139
|
+
store.product_and_option(12345).should be_nil
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
describe "#previous_product" do
|
|
144
|
+
it "should return the previous product when there is one" do
|
|
145
|
+
store.previous_product('my-tee')['name'].should == 'My Product'
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should return nil when there isn't one" do
|
|
149
|
+
store.previous_product('my-product').should be_nil
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
describe "#next_product" do
|
|
154
|
+
it "should return the next product when there is one" do
|
|
155
|
+
store.next_product('my-tee')['name'].should == 'My Print'
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it "should return nil when there isn't one" do
|
|
159
|
+
store.next_product('my-print').should be_nil
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
describe "#search_products" do
|
|
164
|
+
it "should return an array of products for that search term" do
|
|
165
|
+
products = store.search_products('product')
|
|
166
|
+
products.size.should == 1
|
|
167
|
+
products.first['name'].should == 'My Product'
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "should return an empty array with a bad permalink" do
|
|
171
|
+
store.search_products('blah').should == []
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
describe "#country" do
|
|
176
|
+
it "returns the store's country" do
|
|
177
|
+
store.country.should == { 'name' => 'United States', 'id' => 43, 'code' => 'US' }
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
describe "#currency" do
|
|
182
|
+
it "returns the store's currency" do
|
|
183
|
+
store.currency.should == { 'sign' => '$', 'name' => 'U.S. Dollar', 'id' => 1, 'code' => 'USD' }
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
describe "#locale" do
|
|
188
|
+
it "returns the store's locale based on their currency" do
|
|
189
|
+
store.locale.should == 'en-US'
|
|
190
|
+
store.stub(:currency) {{ 'code' => 'JPY' }}
|
|
191
|
+
store.locale.should == 'ja'
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Dugway::Template do
|
|
4
|
+
let(:name) { 'home.html' }
|
|
5
|
+
let(:template) { Dugway::Template.new(name) }
|
|
6
|
+
|
|
7
|
+
describe "#content" do
|
|
8
|
+
it "returns the content of the file" do
|
|
9
|
+
template.content.should == Dugway.theme.file_content(name)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "#content_type" do
|
|
14
|
+
describe "for HTML" do
|
|
15
|
+
it "returns the proper content type" do
|
|
16
|
+
template.content_type.should == 'text/html'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "for CSS" do
|
|
21
|
+
let(:name) { 'styles.css' }
|
|
22
|
+
|
|
23
|
+
it "returns the proper content type" do
|
|
24
|
+
template.content_type.should == 'text/css'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "for JS" do
|
|
29
|
+
let(:name) { 'scripts.js' }
|
|
30
|
+
|
|
31
|
+
it "returns the proper content type" do
|
|
32
|
+
template.content_type.should == 'application/javascript'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "#extension" do
|
|
38
|
+
describe "for HTML" do
|
|
39
|
+
it "returns the proper extension" do
|
|
40
|
+
template.extension.should == '.html'
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "for CSS" do
|
|
45
|
+
let(:name) { 'styles.css' }
|
|
46
|
+
|
|
47
|
+
it "returns the proper extension" do
|
|
48
|
+
template.extension.should == '.css'
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "for JS" do
|
|
53
|
+
let(:name) { 'scripts.js' }
|
|
54
|
+
|
|
55
|
+
it "returns the proper extension" do
|
|
56
|
+
template.extension.should == '.js'
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe "#html?" do
|
|
62
|
+
describe "when it's an HTML template" do
|
|
63
|
+
it "returns true" do
|
|
64
|
+
template.html?.should be_true
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "when it's not an HTML template" do
|
|
69
|
+
let(:name) { 'styles.css' }
|
|
70
|
+
|
|
71
|
+
it "returns false" do
|
|
72
|
+
template.html?.should be_false
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
describe "#standalone_html?" do
|
|
78
|
+
describe "for HTML pages with head_content" do
|
|
79
|
+
let(:name) { 'maintenance.html' }
|
|
80
|
+
|
|
81
|
+
it "returns true" do
|
|
82
|
+
template.standalone_html?.should be_true
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe "for HTML pages without head_content" do
|
|
87
|
+
it "returns false" do
|
|
88
|
+
template.standalone_html?.should be_false
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
describe "for non-HTML" do
|
|
93
|
+
let(:name) { 'styles.css' }
|
|
94
|
+
|
|
95
|
+
it "returns false" do
|
|
96
|
+
template.standalone_html?.should be_false
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe "#render" do
|
|
102
|
+
let(:theme) { Dugway.theme }
|
|
103
|
+
let(:store) { Dugway::Store.new('dugway') }
|
|
104
|
+
let(:request) { Dugway::Request.new({ 'rack.url_scheme' => 'http', 'HTTP_HOST' => 'sexy.dev', 'PATH_INFO' => '/' }) }
|
|
105
|
+
let(:variables) { {} }
|
|
106
|
+
let(:layout) { theme.layout }
|
|
107
|
+
let(:content) { theme.file_content(name) }
|
|
108
|
+
|
|
109
|
+
describe "when rendering an embedded HTML template" do
|
|
110
|
+
it "calls renders properly with Liquifier" do
|
|
111
|
+
Dugway::Liquifier.any_instance.should_receive(:render).with(content, variables) { content }
|
|
112
|
+
Dugway::Liquifier.any_instance.should_receive(:render).with(layout, variables.update(:page_content => content))
|
|
113
|
+
template.render(request, variables)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
describe "when rendering a standalone HTML template" do
|
|
118
|
+
let(:name) { 'maintenance.html' }
|
|
119
|
+
|
|
120
|
+
it "calls renders properly with Liquifier" do
|
|
121
|
+
Dugway::Liquifier.any_instance.should_receive(:render).with(content, variables)
|
|
122
|
+
template.render(request, variables)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
describe "when rendering non-HTML template" do
|
|
127
|
+
let(:name) { 'scripts.js' }
|
|
128
|
+
|
|
129
|
+
it "doesn't liquify it" do
|
|
130
|
+
Dugway::Liquifier.any_instance.should_not_receive(:render)
|
|
131
|
+
template.render(request, variables).should == content
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
describe "when passing variables" do
|
|
136
|
+
let(:variables) { { :errors => ['one', 'two'] } }
|
|
137
|
+
|
|
138
|
+
it "calls renders properly with Liquifier" do
|
|
139
|
+
Dugway::Liquifier.any_instance.should_receive(:render).with(content, variables) { content }
|
|
140
|
+
Dugway::Liquifier.any_instance.should_receive(:render).with(layout, variables.update(:page_content => content))
|
|
141
|
+
template.render(request, variables)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Dugway::ThemeFont do
|
|
4
|
+
before(:each) do
|
|
5
|
+
# Start fresh each time, so stubs work
|
|
6
|
+
Dugway::ThemeFont.send(:remove_class_variable, :@@source) rescue nil
|
|
7
|
+
Dugway::ThemeFont.send(:remove_class_variable, :@@all) rescue nil
|
|
8
|
+
Dugway::ThemeFont.send(:remove_class_variable, :@@options) rescue nil
|
|
9
|
+
Dugway::ThemeFont.send(:remove_class_variable, :@@google_font_names) rescue nil
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe ".all" do
|
|
13
|
+
it "should return all theme fonts" do
|
|
14
|
+
Dugway::ThemeFont.all.should be_present
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should be in alphabetical order" do
|
|
18
|
+
Dugway::ThemeFont.all.first.name.should == 'Amaranth'
|
|
19
|
+
Dugway::ThemeFont.all.last.name.should == 'Verdana'
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe ".options" do
|
|
24
|
+
before(:each) do
|
|
25
|
+
Dugway::ThemeFont.stub(:all) {[
|
|
26
|
+
Dugway::ThemeFont.new('One'),
|
|
27
|
+
Dugway::ThemeFont.new('Two'),
|
|
28
|
+
Dugway::ThemeFont.new('Three')
|
|
29
|
+
]}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should return an array of all font names" do
|
|
33
|
+
Dugway::ThemeFont.options.should == ['One', 'Two', 'Three']
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe ".find_by_name" do
|
|
38
|
+
it "should return a font by its name" do
|
|
39
|
+
georgia = Dugway::ThemeFont.find_by_name('Georgia')
|
|
40
|
+
georgia.name.should == 'Georgia'
|
|
41
|
+
georgia.family.should == 'Georgia, "Times New Roman", Times, serif'
|
|
42
|
+
georgia.collection.should == 'default'
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should return nil if the font doesn't exist" do
|
|
46
|
+
Dugway::ThemeFont.find_by_name('Blah').should be_nil
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe ".find_family_by_name" do
|
|
51
|
+
it "should return the font family by its name" do
|
|
52
|
+
Dugway::ThemeFont.find_family_by_name('Georgia').should == 'Georgia, "Times New Roman", Times, serif'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "should return the font name if no font is found" do
|
|
56
|
+
Dugway::ThemeFont.find_family_by_name('Blah').should == 'Blah'
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe ".google_font_names" do
|
|
61
|
+
before(:each) do
|
|
62
|
+
Dugway::ThemeFont.stub(:all) {[
|
|
63
|
+
Dugway::ThemeFont.new('One Font', 'One Family', 'google'),
|
|
64
|
+
Dugway::ThemeFont.new('Two', 'Two Family', 'default'),
|
|
65
|
+
Dugway::ThemeFont.new('Three', 'Three Family', 'google')
|
|
66
|
+
]}
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "returns a sorted array of font names in the google collection" do
|
|
70
|
+
Dugway::ThemeFont.google_font_names.should == ['One Font', 'Three']
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe ".google_font_url_for_fonts" do
|
|
75
|
+
it "should return a url for a given array of font names" do
|
|
76
|
+
Dugway::ThemeFont.google_font_url_for_fonts(['Matt Rules', 'Dude', 'Yeah']).should == "//fonts.googleapis.com/css?family=Matt+Rules|Dude|Yeah"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should return a url for a singular font in an array" do
|
|
80
|
+
Dugway::ThemeFont.google_font_url_for_fonts(['Matt Rules']).should == "//fonts.googleapis.com/css?family=Matt+Rules"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
describe ".google_font_url_for_all_fonts" do
|
|
85
|
+
before(:each) do
|
|
86
|
+
Dugway::ThemeFont.stub(:all) {[
|
|
87
|
+
Dugway::ThemeFont.new('One Font', 'One Family', 'google'),
|
|
88
|
+
Dugway::ThemeFont.new('Two', 'Two Family', 'default'),
|
|
89
|
+
Dugway::ThemeFont.new('Three', 'Three Family', 'google')
|
|
90
|
+
]}
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "should return a URL for all Google fonts" do
|
|
94
|
+
Dugway::ThemeFont.google_font_url_for_all_fonts.should == "//fonts.googleapis.com/css?family=One+Font|Three"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
describe ".google_font_url_for_theme" do
|
|
99
|
+
let(:fonts) { { :header_font => {}, :body_font => {}, :paragraph_font => {} } }
|
|
100
|
+
|
|
101
|
+
before(:each) do
|
|
102
|
+
Dugway::Theme.any_instance.stub(:customization) { fonts }
|
|
103
|
+
Dugway::Theme.any_instance.stub(:fonts) { fonts }
|
|
104
|
+
|
|
105
|
+
Dugway::ThemeFont.stub(:all) {[
|
|
106
|
+
Dugway::ThemeFont.new('One Font', 'One Family', 'google'),
|
|
107
|
+
Dugway::ThemeFont.new('Two', 'Two Family', 'default'),
|
|
108
|
+
Dugway::ThemeFont.new('Three', 'Three Family', 'google')
|
|
109
|
+
]}
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
describe "when it has multiple Google fonts" do
|
|
113
|
+
let(:fonts) { { :header_font => 'One Font', :body_font => 'Two', :paragraph_font => 'Three' } }
|
|
114
|
+
|
|
115
|
+
it "should return the correct URL" do
|
|
116
|
+
Dugway::ThemeFont.google_font_url_for_theme.should == "//fonts.googleapis.com/css?family=One+Font|Three"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "when it has one Google font" do
|
|
121
|
+
let(:fonts) { { :header_font => 'One Font', :body_font => 'Two' } }
|
|
122
|
+
|
|
123
|
+
it "should return the correct URL" do
|
|
124
|
+
Dugway::ThemeFont.google_font_url_for_theme.should == "//fonts.googleapis.com/css?family=One+Font"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
describe "when it has no Google fonts" do
|
|
129
|
+
let(:fonts) { { :body_font => 'Two' } }
|
|
130
|
+
|
|
131
|
+
it "should return the correct URL" do
|
|
132
|
+
Dugway::ThemeFont.google_font_url_for_theme.should be_nil
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|