├── .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 | [![Build Status](https://travis-ci.org/SimonRice/middleman-rspec.svg)](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 | --------------------------------------------------------------------------------