├── .gitignore
├── .travis.yml
├── Gemfile
├── Gemfile.lock
├── LICENSE
├── README.md
├── Rakefile
├── config.rb
├── source
├── images
│ ├── background.png
│ └── middleman.png
├── index.html.erb
├── javascripts
│ └── all.js
├── layouts
│ └── layout.erb
└── stylesheets
│ ├── all.css
│ └── normalize.css
└── spec
├── features
└── index_spec.rb
└── spec_helper.rb
/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 | #
3 | # If you find yourself ignoring temporary files generated by your text editor
4 | # or operating system, you probably want to add a global ignore instead:
5 | # git config --global core.excludesfile ~/.gitignore_global
6 |
7 | # Ignore bundler config
8 | /.bundle
9 |
10 | # Ignore the build directory
11 | /build
12 |
13 | # Ignore Sass' cache
14 | /.sass-cache
15 |
16 | # Ignore .DS_store file
17 | .DS_Store
18 |
19 | .ruby-version
20 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: ruby
2 | rvm:
3 | - ruby-head
4 | - 2.6
5 | - 2.5
6 | - 2.4
7 | - 2.3
8 | - jruby-head
9 | before_install:
10 | - gem update --system
11 | - gem install bundler
12 |
13 | matrix:
14 | allow_failures:
15 | - rvm: ruby-head
16 | - rvm: jruby-head
17 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'middleman', '~> 4.0'
4 |
5 | group :development do
6 | gem 'rake', '~> 10.4'
7 | gem 'rspec', '~> 3.4'
8 | gem 'capybara', '~> 2.5'
9 | end
10 |
11 | # For faster file watcher updates on Windows:
12 | gem 'wdm', '~> 0.1.0', platforms: [:mswin, :mingw]
13 |
14 | # Windows does not come with time zone data
15 | gem 'tzinfo-data', platforms: [:mswin, :mingw, :jruby]
16 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | activesupport (4.2.5)
5 | i18n (~> 0.7)
6 | json (~> 1.7, >= 1.7.7)
7 | minitest (~> 5.1)
8 | thread_safe (~> 0.3, >= 0.3.4)
9 | tzinfo (~> 1.1)
10 | addressable (2.4.0)
11 | backports (3.6.7)
12 | capybara (2.5.0)
13 | mime-types (>= 1.16)
14 | nokogiri (>= 1.3.3)
15 | rack (>= 1.0.0)
16 | rack-test (>= 0.5.4)
17 | xpath (~> 2.0)
18 | coffee-script (2.4.1)
19 | coffee-script-source
20 | execjs
21 | coffee-script-source (1.10.0)
22 | compass-import-once (1.0.5)
23 | sass (>= 3.2, < 3.5)
24 | concurrent-ruby (0.9.2)
25 | contracts (0.12.0)
26 | diff-lcs (1.2.5)
27 | erubis (2.7.0)
28 | execjs (2.6.0)
29 | fastimage (1.8.1)
30 | addressable (~> 2.3, >= 2.3.5)
31 | ffi (1.10.0)
32 | haml (4.0.7)
33 | tilt
34 | hamster (2.0.0)
35 | concurrent-ruby (~> 0.8)
36 | hashie (3.4.3)
37 | i18n (0.7.0)
38 | json (1.8.6)
39 | kramdown (1.9.0)
40 | listen (3.0.5)
41 | rb-fsevent (>= 0.9.3)
42 | rb-inotify (>= 0.9)
43 | middleman (4.0.0)
44 | coffee-script (~> 2.2)
45 | compass-import-once (= 1.0.5)
46 | haml (>= 4.0.5)
47 | kramdown (~> 1.2)
48 | middleman-cli (= 4.0.0)
49 | middleman-core (= 4.0.0)
50 | sass (>= 3.4.0, < 4.0)
51 | middleman-cli (4.0.0)
52 | thor (>= 0.17.0, < 2.0)
53 | middleman-core (4.0.0)
54 | activesupport (~> 4.2)
55 | addressable (~> 2.4.0)
56 | backports (~> 3.6)
57 | bundler (~> 1.1)
58 | capybara (~> 2.5.0)
59 | contracts (~> 0.12.0)
60 | erubis
61 | execjs (~> 2.0)
62 | fastimage (~> 1.8)
63 | hamster (~> 2.0)
64 | hashie (~> 3.4)
65 | i18n (~> 0.7.0)
66 | listen (~> 3.0)
67 | padrino-helpers (~> 0.13.0)
68 | rack (>= 1.4.5, < 2.0)
69 | sass (>= 3.4)
70 | tilt (~> 1.4.1)
71 | uglifier (~> 2.6)
72 | mime-types (3.0)
73 | mime-types-data (~> 3.2015)
74 | mime-types-data (3.2015.1120)
75 | mini_portile2 (2.4.0)
76 | minitest (5.8.3)
77 | nokogiri (1.10.1)
78 | mini_portile2 (~> 2.4.0)
79 | padrino-helpers (0.13.1)
80 | i18n (~> 0.6, >= 0.6.7)
81 | padrino-support (= 0.13.1)
82 | tilt (~> 1.4.1)
83 | padrino-support (0.13.1)
84 | activesupport (>= 3.1)
85 | rack (1.6.11)
86 | rack-test (0.6.3)
87 | rack (>= 1.0)
88 | rake (10.5.0)
89 | rb-fsevent (0.9.7)
90 | rb-inotify (0.9.5)
91 | ffi (>= 0.5.0)
92 | rspec (3.4.0)
93 | rspec-core (~> 3.4.0)
94 | rspec-expectations (~> 3.4.0)
95 | rspec-mocks (~> 3.4.0)
96 | rspec-core (3.4.1)
97 | rspec-support (~> 3.4.0)
98 | rspec-expectations (3.4.0)
99 | diff-lcs (>= 1.2.0, < 2.0)
100 | rspec-support (~> 3.4.0)
101 | rspec-mocks (3.4.1)
102 | diff-lcs (>= 1.2.0, < 2.0)
103 | rspec-support (~> 3.4.0)
104 | rspec-support (3.4.1)
105 | sass (3.4.21)
106 | thor (0.19.1)
107 | thread_safe (0.3.5)
108 | tilt (1.4.1)
109 | tzinfo (1.2.2)
110 | thread_safe (~> 0.1)
111 | uglifier (2.7.2)
112 | execjs (>= 0.3.0)
113 | json (>= 1.8.0)
114 | xpath (2.0.0)
115 | nokogiri (~> 1.3)
116 |
117 | PLATFORMS
118 | ruby
119 |
120 | DEPENDENCIES
121 | capybara (~> 2.5)
122 | middleman (~> 4.0)
123 | rake (~> 10.4)
124 | rspec (~> 3.4)
125 | tzinfo-data
126 | wdm (~> 0.1.0)
127 |
128 | BUNDLED WITH
129 | 1.16.6
130 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | "THE BEER-WARE LICENSE" (Revision 42):
2 |
3 | Simon Rice wrote this. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return.
4 |
5 | Simon Rice
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Middleman-RSpec
2 |
3 | [](https://travis-ci.org/SimonRice/middleman-rspec)
4 |
5 | This is a very simple yet complete example demonstrating how to use Capybara and RSpec to perform integration tests with your Middleman project. These tests can also be modified for plugins so you can use RSpec instead of Cucumber. These examples are all based on the default Middleman page (as created when you type `middleman init`).
6 |
7 | ## Contributions
8 |
9 | As everyone says, GitHub is about social coding - I didn't just choose to use it because of my love of git as a version control system. I'm not 100% sure this is the best way around this problem - all I know is it works. Feel free chip in & help make this even better.
10 |
11 | ## License
12 |
13 | This example is provided under the terms of the very permissive "Beer-Ware" license:
14 |
15 | > "THE BEER-WARE LICENSE" (Revision 42):
16 | >
17 | > Simon Rice wrote this. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return.
18 |
19 | See the `LICENSE` file or any class or header for the full details.
20 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | require 'rspec/core/rake_task'
2 |
3 | RSpec::Core::RakeTask.new(:spec)
4 |
5 | task :default => :spec
6 |
--------------------------------------------------------------------------------
/config.rb:
--------------------------------------------------------------------------------
1 | ignore 'REAMDME.md'
2 |
3 | configure :build do
4 |
5 | end
6 |
--------------------------------------------------------------------------------
/source/images/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SimonRice/middleman-rspec/e9ab4f3e9fb5758a969d1ca317d1838ec3736f2e/source/images/background.png
--------------------------------------------------------------------------------
/source/images/middleman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SimonRice/middleman-rspec/e9ab4f3e9fb5758a969d1ca317d1838ec3736f2e/source/images/middleman.png
--------------------------------------------------------------------------------
/source/index.html.erb:
--------------------------------------------------------------------------------
1 | ---
2 | title: Welcome to Middleman
3 | ---
4 |
5 |
6 |
Middleman is Watching
7 |
8 | <%= link_to "Read Online Documentation", "http://middlemanapp.com/" %>
9 |
10 |
11 |
--------------------------------------------------------------------------------
/source/javascripts/all.js:
--------------------------------------------------------------------------------
1 | //= require_tree .
--------------------------------------------------------------------------------
/source/layouts/layout.erb:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | <%= current_page.data.title || "The Middleman" %>
11 |
12 | <%= stylesheet_link_tag "normalize", "all" %>
13 | <%= javascript_include_tag "all" %>
14 |
15 |
16 |
17 | <%= yield %>
18 |
19 |
--------------------------------------------------------------------------------
/source/stylesheets/all.css:
--------------------------------------------------------------------------------
1 | @charset "utf-8";
2 |
3 | body {
4 | background: #d4d4d4 url("../images/background.png");
5 | text-align: center;
6 | font-family: sans-serif; }
7 |
8 | h1 {
9 | color: rgba(0, 0, 0, .3);
10 | font-weight: bold;
11 | font-size: 32px;
12 | letter-spacing: -1px;
13 | text-transform: uppercase;
14 | text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
15 | background: url("../images/middleman.png") no-repeat center 100px;
16 | padding: 350px 0 10px;
17 | margin: 0; }
18 |
19 | .doc {
20 | font-size: 14px;
21 | margin: 0; }
22 | .doc:before,
23 | .doc:after {
24 | opacity: .2;
25 | padding: 6px;
26 | font-style: normal;
27 | position: relative;
28 | content: "•"; }
29 | .doc a {
30 | color: rgba(0, 0, 0, 0.3); }
31 | .doc a:hover {
32 | color: #666; }
33 |
34 | .welcome {
35 | -webkit-animation-name: welcome;
36 | -webkit-animation-duration: .9s; }
37 |
38 | @-webkit-keyframes welcome {
39 | from {
40 | -webkit-transform: scale(0);
41 | opacity: 0;
42 | }
43 | 50% {
44 | -webkit-transform: scale(0);
45 | opacity: 0;
46 | }
47 | 82.5% {
48 | -webkit-transform: scale(1.03);
49 | -webkit-animation-timing-function: ease-out;
50 | opacity: 1;
51 | }
52 | to {
53 | -webkit-transform: scale(1);
54 | }
55 | }
--------------------------------------------------------------------------------
/source/stylesheets/normalize.css:
--------------------------------------------------------------------------------
1 | /*! normalize.css v2.0.1 | MIT License | git.io/normalize */
2 |
3 | /* ==========================================================================
4 | HTML5 display definitions
5 | ========================================================================== */
6 |
7 | /*
8 | * Corrects `block` display not defined in IE 8/9.
9 | */
10 |
11 | article,
12 | aside,
13 | details,
14 | figcaption,
15 | figure,
16 | footer,
17 | header,
18 | hgroup,
19 | nav,
20 | section,
21 | summary {
22 | display: block;
23 | }
24 |
25 | /*
26 | * Corrects `inline-block` display not defined in IE 8/9.
27 | */
28 |
29 | audio,
30 | canvas,
31 | video {
32 | display: inline-block;
33 | }
34 |
35 | /*
36 | * Prevents modern browsers from displaying `audio` without controls.
37 | * Remove excess height in iOS 5 devices.
38 | */
39 |
40 | audio:not([controls]) {
41 | display: none;
42 | height: 0;
43 | }
44 |
45 | /*
46 | * Addresses styling for `hidden` attribute not present in IE 8/9.
47 | */
48 |
49 | [hidden] {
50 | display: none;
51 | }
52 |
53 | /* ==========================================================================
54 | Base
55 | ========================================================================== */
56 |
57 | /*
58 | * 1. Sets default font family to sans-serif.
59 | * 2. Prevents iOS text size adjust after orientation change, without disabling
60 | * user zoom.
61 | */
62 |
63 | html {
64 | font-family: sans-serif; /* 1 */
65 | -webkit-text-size-adjust: 100%; /* 2 */
66 | -ms-text-size-adjust: 100%; /* 2 */
67 | }
68 |
69 | /*
70 | * Removes default margin.
71 | */
72 |
73 | body {
74 | margin: 0;
75 | }
76 |
77 | /* ==========================================================================
78 | Links
79 | ========================================================================== */
80 |
81 | /*
82 | * Addresses `outline` inconsistency between Chrome and other browsers.
83 | */
84 |
85 | a:focus {
86 | outline: thin dotted;
87 | }
88 |
89 | /*
90 | * Improves readability when focused and also mouse hovered in all browsers.
91 | */
92 |
93 | a:active,
94 | a:hover {
95 | outline: 0;
96 | }
97 |
98 | /* ==========================================================================
99 | Typography
100 | ========================================================================== */
101 |
102 | /*
103 | * Addresses `h1` font sizes within `section` and `article` in Firefox 4+,
104 | * Safari 5, and Chrome.
105 | */
106 |
107 | h1 {
108 | font-size: 2em;
109 | }
110 |
111 | /*
112 | * Addresses styling not present in IE 8/9, Safari 5, and Chrome.
113 | */
114 |
115 | abbr[title] {
116 | border-bottom: 1px dotted;
117 | }
118 |
119 | /*
120 | * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
121 | */
122 |
123 | b,
124 | strong {
125 | font-weight: bold;
126 | }
127 |
128 | /*
129 | * Addresses styling not present in Safari 5 and Chrome.
130 | */
131 |
132 | dfn {
133 | font-style: italic;
134 | }
135 |
136 | /*
137 | * Addresses styling not present in IE 8/9.
138 | */
139 |
140 | mark {
141 | background: #ff0;
142 | color: #000;
143 | }
144 |
145 |
146 | /*
147 | * Corrects font family set oddly in Safari 5 and Chrome.
148 | */
149 |
150 | code,
151 | kbd,
152 | pre,
153 | samp {
154 | font-family: monospace, serif;
155 | font-size: 1em;
156 | }
157 |
158 | /*
159 | * Improves readability of pre-formatted text in all browsers.
160 | */
161 |
162 | pre {
163 | white-space: pre;
164 | white-space: pre-wrap;
165 | word-wrap: break-word;
166 | }
167 |
168 | /*
169 | * Sets consistent quote types.
170 | */
171 |
172 | q {
173 | quotes: "\201C" "\201D" "\2018" "\2019";
174 | }
175 |
176 | /*
177 | * Addresses inconsistent and variable font size in all browsers.
178 | */
179 |
180 | small {
181 | font-size: 80%;
182 | }
183 |
184 | /*
185 | * Prevents `sub` and `sup` affecting `line-height` in all browsers.
186 | */
187 |
188 | sub,
189 | sup {
190 | font-size: 75%;
191 | line-height: 0;
192 | position: relative;
193 | vertical-align: baseline;
194 | }
195 |
196 | sup {
197 | top: -0.5em;
198 | }
199 |
200 | sub {
201 | bottom: -0.25em;
202 | }
203 |
204 | /* ==========================================================================
205 | Embedded content
206 | ========================================================================== */
207 |
208 | /*
209 | * Removes border when inside `a` element in IE 8/9.
210 | */
211 |
212 | img {
213 | border: 0;
214 | }
215 |
216 | /*
217 | * Corrects overflow displayed oddly in IE 9.
218 | */
219 |
220 | svg:not(:root) {
221 | overflow: hidden;
222 | }
223 |
224 | /* ==========================================================================
225 | Figures
226 | ========================================================================== */
227 |
228 | /*
229 | * Addresses margin not present in IE 8/9 and Safari 5.
230 | */
231 |
232 | figure {
233 | margin: 0;
234 | }
235 |
236 | /* ==========================================================================
237 | Forms
238 | ========================================================================== */
239 |
240 | /*
241 | * Define consistent border, margin, and padding.
242 | */
243 |
244 | fieldset {
245 | border: 1px solid #c0c0c0;
246 | margin: 0 2px;
247 | padding: 0.35em 0.625em 0.75em;
248 | }
249 |
250 | /*
251 | * 1. Corrects color not being inherited in IE 8/9.
252 | * 2. Remove padding so people aren't caught out if they zero out fieldsets.
253 | */
254 |
255 | legend {
256 | border: 0; /* 1 */
257 | padding: 0; /* 2 */
258 | }
259 |
260 | /*
261 | * 1. Corrects font family not being inherited in all browsers.
262 | * 2. Corrects font size not being inherited in all browsers.
263 | * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome
264 | */
265 |
266 | button,
267 | input,
268 | select,
269 | textarea {
270 | font-family: inherit; /* 1 */
271 | font-size: 100%; /* 2 */
272 | margin: 0; /* 3 */
273 | }
274 |
275 | /*
276 | * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in
277 | * the UA stylesheet.
278 | */
279 |
280 | button,
281 | input {
282 | line-height: normal;
283 | }
284 |
285 | /*
286 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
287 | * and `video` controls.
288 | * 2. Corrects inability to style clickable `input` types in iOS.
289 | * 3. Improves usability and consistency of cursor style between image-type
290 | * `input` and others.
291 | */
292 |
293 | button,
294 | html input[type="button"], /* 1 */
295 | input[type="reset"],
296 | input[type="submit"] {
297 | -webkit-appearance: button; /* 2 */
298 | cursor: pointer; /* 3 */
299 | }
300 |
301 | /*
302 | * Re-set default cursor for disabled elements.
303 | */
304 |
305 | button[disabled],
306 | input[disabled] {
307 | cursor: default;
308 | }
309 |
310 | /*
311 | * 1. Addresses box sizing set to `content-box` in IE 8/9.
312 | * 2. Removes excess padding in IE 8/9.
313 | */
314 |
315 | input[type="checkbox"],
316 | input[type="radio"] {
317 | box-sizing: border-box; /* 1 */
318 | padding: 0; /* 2 */
319 | }
320 |
321 | /*
322 | * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.
323 | * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome
324 | * (include `-moz` to future-proof).
325 | */
326 |
327 | input[type="search"] {
328 | -webkit-appearance: textfield; /* 1 */
329 | -moz-box-sizing: content-box;
330 | -webkit-box-sizing: content-box; /* 2 */
331 | box-sizing: content-box;
332 | }
333 |
334 | /*
335 | * Removes inner padding and search cancel button in Safari 5 and Chrome
336 | * on OS X.
337 | */
338 |
339 | input[type="search"]::-webkit-search-cancel-button,
340 | input[type="search"]::-webkit-search-decoration {
341 | -webkit-appearance: none;
342 | }
343 |
344 | /*
345 | * Removes inner padding and border in Firefox 4+.
346 | */
347 |
348 | button::-moz-focus-inner,
349 | input::-moz-focus-inner {
350 | border: 0;
351 | padding: 0;
352 | }
353 |
354 | /*
355 | * 1. Removes default vertical scrollbar in IE 8/9.
356 | * 2. Improves readability and alignment in all browsers.
357 | */
358 |
359 | textarea {
360 | overflow: auto; /* 1 */
361 | vertical-align: top; /* 2 */
362 | }
363 |
364 | /* ==========================================================================
365 | Tables
366 | ========================================================================== */
367 |
368 | /*
369 | * Remove most spacing between table cells.
370 | */
371 |
372 | table {
373 | border-collapse: collapse;
374 | border-spacing: 0;
375 | }
--------------------------------------------------------------------------------
/spec/features/index_spec.rb:
--------------------------------------------------------------------------------
1 | require 'spec_helper'
2 |
3 | describe 'index', :type => :feature do
4 | before do
5 | visit '/'
6 | end
7 |
8 | it 'has the correct title header' do
9 | expect(page).to have_selector 'h1'
10 | within 'h1' do
11 | expect(page).to have_content /Middleman is Watching/i
12 | end
13 | end
14 |
15 | it 'has a paragraph in there too' do
16 | expect(page).to have_selector 'p.doc'
17 | end
18 | end
19 |
--------------------------------------------------------------------------------
/spec/spec_helper.rb:
--------------------------------------------------------------------------------
1 | require 'rspec'
2 | require 'capybara/rspec'
3 |
4 | require 'middleman-core'
5 | require 'middleman-core/rack'
6 |
7 | middleman_app = ::Middleman::Application.new do
8 | set :root, File.expand_path(File.join(File.dirname(__FILE__), '..'))
9 | set :environment, :development
10 | set :show_exceptions, false
11 | end
12 |
13 | Capybara.app = ::Middleman::Rack.new(middleman_app).to_app
14 |
--------------------------------------------------------------------------------