jasmine-fixtures 0.1.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/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_DISABLE_SHARED_GEMS: "1"
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ .rvmrc
data/.pairs ADDED
@@ -0,0 +1,7 @@
1
+ pairs:
2
+ jb: Jonathan Barnes; jonathan
3
+ jbs: JB Steadman; jb
4
+ rn: Roger Neel
5
+ email:
6
+ prefix: pair
7
+ domain: mavenlink.com
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source :gemcutter
2
+
3
+ gem 'bundler', '1.0.3'
4
+ gem 'jeweler', '1.4.0'
5
+ gem 'rake', '0.8.7'
6
+ gem 'rspec-rails', '1.3.3'
data/Gemfile.lock ADDED
@@ -0,0 +1,27 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ gemcutter (0.6.1)
5
+ git (1.2.5)
6
+ jeweler (1.4.0)
7
+ gemcutter (>= 0.1.0)
8
+ git (>= 1.2.5)
9
+ rubyforge (>= 2.0.0)
10
+ json_pure (1.4.6)
11
+ rack (1.2.1)
12
+ rake (0.8.7)
13
+ rspec (1.3.1)
14
+ rspec-rails (1.3.3)
15
+ rack (>= 1.0.0)
16
+ rspec (= 1.3.1)
17
+ rubyforge (2.0.4)
18
+ json_pure (>= 1.1.7)
19
+
20
+ PLATFORMS
21
+ ruby
22
+
23
+ DEPENDENCIES
24
+ bundler (= 1.0.3)
25
+ jeweler (= 1.4.0)
26
+ rake (= 0.8.7)
27
+ rspec-rails (= 1.3.3)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jonathan Barnes & Roger Neel
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,41 @@
1
+ = jasmine-fixtures
2
+
3
+ Jasmine Fixtures is an add-on for the behavior-driven development framework, Jasmine. If you're using Jasmine to test the JavaScript in your Ruby projects and you want to test your DOM and bindings, you can use Jasmine Fixtures.
4
+
5
+ The gem includes 3 major pieces:
6
+
7
+ 1) The helpers required to loadFixture() within your Jasmine specs
8
+
9
+ 2) JQuery-based matchers to make your life easier
10
+
11
+ 3) RSpec-based methods for creating DOM fixtures
12
+
13
+ == Installing
14
+
15
+ gem install jasmine-fixtures
16
+
17
+ script/generate jasmine-fixtures
18
+
19
+ If you want to use the fixture generator, you need to load jasmine_fixture_generator_methods.rb. If you load everything in your spec_helpers directory in your spec_helper.rb already, you're good to go. Otherwise, make sure it's required with the rest of your requires in spec_helper.rb.
20
+
21
+ == Assumptions
22
+
23
+ You haven't messed with the default Jasmine configuration to load everything in the helpers directory. If you have, make sure you get the jasmine-fixture-*.js files loaded.
24
+
25
+ All your fixtures should be in /tmp/js_dom_fixtures/FIXTURE_NAME.fixture.html.erb
26
+
27
+ You can roll your own fixtures and use the above path/naming convention. Also, be sure to wrap all fixtures in a wrapping <div>{Your content goes here}</div> that we ignore.
28
+
29
+ Alternatively, if you use our RSpec-based methods to generate fixtures (the better way), you need RSpec!
30
+
31
+ == Note on Patches/Pull Requests
32
+
33
+ * Fork the project.
34
+ * Make your feature addition or bug fix.
35
+ * Commit, do not mess with rakefile, version, or history.
36
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
37
+ * Send me a pull request. Bonus points for topic branches.
38
+
39
+ == Copyright
40
+
41
+ Copyright (c) 2010. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'spec'
4
+
5
+ begin
6
+ require 'jeweler'
7
+ Jeweler::Tasks.new do |gem|
8
+ gem.name = "jasmine-fixtures"
9
+ gem.summary = %Q{Jasmine Fixtures allow you to use real DOM to test your JavaScript}
10
+ gem.description = %Q{Dump out DOM that you want to test. Use jasmine-fixtures to load that DOM into your Jasmine specs. See github.com/mavenlink/jasmine-fixtures for more.}
11
+ gem.email = "roger@mavenlink.com"
12
+ gem.homepage = "http://github.com/mavenlink/jasmine-fixtures"
13
+ gem.authors = ["Roger Neel", "Jonathan Barnes", "JB Steadman"]
14
+ gem.add_development_dependency "rspec", ">= 1.2.9"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Do a 'bundle install' to make sure you have all gems/dependencies installed."
20
+ end
21
+
22
+ require 'spec/rake/spectask'
23
+ Spec::Rake::SpecTask.new(:spec) do |spec|
24
+ spec.libs << 'lib' << 'spec'
25
+ spec.spec_files = FileList['spec/**/*_spec.rb']
26
+ end
27
+
28
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.pattern = 'spec/**/*_spec.rb'
31
+ spec.rcov = true
32
+ end
33
+
34
+ task :spec => :check_dependencies
35
+
36
+ task :default => :spec
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
+
42
+ rdoc.rdoc_dir = 'rdoc'
43
+ rdoc.title = "jasmine-fixtures #{version}"
44
+ rdoc.rdoc_files.include('README*')
45
+ rdoc.rdoc_files.include('lib/**/*.rb')
46
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,15 @@
1
+ class JasmineFixturesGenerator < Rails::Generator::Base
2
+ def manifest
3
+ record do |m|
4
+ m.directory "spec/javascripts/helpers"
5
+ m.file "spec/javascripts/helpers/jasmine-fixture-helper.js", "spec/javascripts/helpers/jasmine-fixture-helper.js"
6
+ m.file "spec/javascripts/helpers/jasmine-fixture-loader.js", "spec/javascripts/helpers/jasmine-fixture-loader.js"
7
+ m.file "spec/javascripts/helpers/jasmine-fixture-matchers.js", "spec/javascripts/helpers/jasmine-fixture-matchers.js"
8
+
9
+ m.directory "spec/spec_helpers"
10
+ m.file "spec/spec_helpers/fixture_generator_methods.rb", "spec/spec_helpers/fixture_generator_methods.rb"
11
+
12
+ m.readme "INSTALL"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ Jasmine Fixtures have been installed!
2
+
3
+ We copied JasmineFixtureHelper.js and LoadFixture.js into your spec/javascripts/helpers dir. In its default configuration, Jasmine should pick these files up.
4
+
5
+ Take a look at https://github.com/mavenlink/jasmine-fixtures for tips & more info.
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ #####
4
+ # Modify this file to create new Jasmine Fixtures!
5
+ # We have provided an example for you to crib off.
6
+
7
+ # Basically:
8
+ # 1) Visit a route with your controller action
9
+ # 2) Make sure it's successful
10
+ # 3) save_fixture with the response you want and the name of the fixture
11
+ #####
12
+
13
+ ##### Using save_fixture
14
+ # html_for will only take the <body> tag and replace it with a <div>
15
+ # to avoid nested <body> tags within the jasmine runner
16
+
17
+ # If you have custom responses (ajax partials, JSON, etc),
18
+ # you can subvert this and use response.body or whatever.
19
+ #####
20
+
21
+
22
+ ##### Example
23
+ describe UsersController do
24
+ it "generates a new user page" do
25
+ get :new
26
+ response.should be_success
27
+ save_fixture(html_for('body'), 'user-signup-page')
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ beforeEach(function() {
2
+ $('#jasmine_content').empty();
3
+ spec.cleanupHooks();
4
+ });
5
+
6
+ afterEach(function() {
7
+ spec.cleanupHooks();
8
+ expect(spec.loadFixtureCount).toBeLessThan(2);
9
+ spec.loadFixtureCount = 0;
10
+ expect($('.ui-dialog').length).toEqual(0);
11
+ expect($('.ui-autocomplete-results').length).toEqual(0);
12
+ });
13
+
14
+ spec.cleanupHooks = function() {
15
+ // clearLiveEventBindings is helpful if using jQuery live events
16
+ // uncomment if you'd like
17
+ // spec.clearLiveEventBindings();
18
+
19
+ window.onbeforeunload = null;
20
+ };
21
+
22
+ spec.clearLiveEventBindings = function() {
23
+ var events = jQuery.data(document, "events");
24
+ for (prop in events) {
25
+ delete events[prop];
26
+ }
27
+ };
28
+
29
+ spec.content = function() {
30
+ return $('#jasmine_content');
31
+ };
@@ -0,0 +1,66 @@
1
+ var uniqueLoadIndicator = null;
2
+ // Loads fixure markup into the DOM as a child of the jasmine_content div
3
+ spec.loadFixture = function(fixtureName) {
4
+ var $destination = $('#jasmine_content');
5
+
6
+ uniqueLoadIndicator = null;
7
+ var indicatorScript = "<script>uniqueLoadIndicator = 'loaded';</s" + "cript>";
8
+
9
+ // get the markup, inject it into the dom
10
+ $destination.html(spec.fixtureHtml(fixtureName) + indicatorScript);
11
+ while (uniqueLoadIndicator != "loaded") {
12
+ if (console) console.log("FireFox wasn't ready... sleeping.");
13
+ spec.retrieveFixture(fixtureName);
14
+ }
15
+ uniqueLoadIndicator = null;
16
+
17
+ bindBehaviors();
18
+
19
+ // keep track of fixture count to fail specs that
20
+ // call loadFixture() more than once
21
+ spec.loadFixtureCount++;
22
+ };
23
+
24
+ // Returns fixture markup as a string. Useful for fixtures that
25
+ // represent the response text of ajax requests.
26
+ spec.readFixture = function(fixtureName) {
27
+ return spec.fixtureHtml(fixtureName);
28
+ };
29
+
30
+ spec.readJSON = function(fixtureName) {
31
+ var data = spec.fixtureHtml(fixtureName);
32
+ return window.JSON && window.JSON.parse ?
33
+ window.JSON.parse( data ) :
34
+ (new Function("return " + data))();
35
+ };
36
+
37
+ spec.fixtureHtml = function(fixtureName) {
38
+ if (!spec.cachedFixtures[fixtureName]) {
39
+ spec.cachedFixtures[fixtureName] = spec.retrieveFixture(fixtureName);
40
+ }
41
+ return spec.cachedFixtures[fixtureName];
42
+ };
43
+
44
+ spec.retrieveFixture = function(fixtureName) {
45
+
46
+ // construct a path to the fixture, including a cache-busting timestamp
47
+ var path = '/tmp/js_dom_fixtures/' + fixtureName + ".fixture.html.erb?" + new Date().getTime();
48
+ var xhr;
49
+
50
+ // retrieve the fixture markup via xhr request to jasmine server
51
+ try {
52
+ xhr = new jasmine.XmlHttpRequest();
53
+ xhr.open("GET", path, false);
54
+ xhr.send(null);
55
+ } catch(e) {
56
+ throw new Error("couldn't fetch " + path + ": " + e);
57
+ }
58
+ if (xhr.status < 200 || xhr.status > 299) {
59
+ throw new Error("Couldn't load fixture with key: '" + fixtureName + "'. No such file: '" + path + "'.");
60
+ }
61
+
62
+ return xhr.responseText;
63
+ };
64
+
65
+ spec.loadFixtureCount = 0;
66
+ spec.cachedFixtures = {};
@@ -0,0 +1,253 @@
1
+ jasmine.Matchers.prototype.toBeSameJqueryObjectAs = function(expected) {
2
+ var error_message = null;
3
+ if(!expected || !this.actual || this.actual.length != expected.length) {
4
+ error_message = "Expected to have same number of matching elements";
5
+ } else {
6
+ for(var i = 0; i < expected.length; i++) {
7
+ if (this.actual.get(i) != expected.get(i)) {
8
+ error_message = "Expected the elements to be the same but were not";
9
+ break;
10
+ }
11
+ }
12
+ }
13
+ return this.report(error_message == null, error_message);
14
+ };
15
+
16
+ jasmine.Matchers.prototype.toNotBeSameJqueryObjectAs = function(expected) {
17
+ var error_message = null;
18
+ if(!expected || !this.actual || this.actual.length != expected.length) {
19
+ error_message = "Expected to have same number of matching elements";
20
+ } else {
21
+ for(var i = 0; i < expected.length; i++) {
22
+ if (this.actual.get(i) == expected.get(i)) {
23
+ error_message = "Expected the elements to not be the same but they were";
24
+ break;
25
+ }
26
+ }
27
+ }
28
+ return this.report(error_message == null, error_message);
29
+ };
30
+
31
+ jasmine.Matchers.prototype.toBeCleared = function() {
32
+ var $form = this.actual;
33
+ expect($form).toBeSingleton();
34
+ var $textfields = $form.find('input[type=text]');
35
+ $textfields.each(function() {
36
+ expect($(this).val()).toEqual('');
37
+ });
38
+ var $textareas = $form.find('textarea');
39
+ $textareas.each(function() {
40
+ expect($(this).val()).toEqual('');
41
+ });
42
+ };
43
+
44
+ jasmine.Matchers.prototype.toBeSingleton = function() {
45
+ var $element = this.actual;
46
+ expect($element.length).toEqual(1);
47
+ };
48
+
49
+ jasmine.Matchers.prototype.toContainText = function(expected) {
50
+ var actual = $(this.actual);
51
+ return this.report(
52
+ actual.text().indexOf(expected) != -1,
53
+ "Expected $('" + actual.selector + "') to contain text " + expected
54
+ );
55
+ };
56
+
57
+ jasmine.Matchers.prototype.toNotContainText = function(expected) {
58
+ var actual = $(this.actual);
59
+ return this.report(
60
+ actual.text().indexOf(expected) == -1,
61
+ "Expected $('" + actual.selector + "') to not contain text " + expected
62
+ );
63
+ };
64
+
65
+ jasmine.Matchers.prototype.toNotBeChecked = function() {
66
+ var actual = $(this.actual);
67
+ return this.report(
68
+ !actual.is(':checked'),
69
+ "Expected $('" + actual.selector + "') to not be checked"
70
+ );
71
+ };
72
+
73
+ jasmine.Matchers.prototype.toBeChecked = function() {
74
+ var actual = $(this.actual);
75
+ return this.report(
76
+ actual.is(':checked'),
77
+ "Expected $('" + actual.selector + "') to be checked"
78
+ );
79
+ };
80
+
81
+ jasmine.Matchers.prototype.toExist = function() {
82
+ var actual = $(this.actual);
83
+ return this.report(
84
+ actual.length > 0,
85
+ "Expected $('" + actual.selector + "') to exist but didn't"
86
+ );
87
+ };
88
+
89
+ jasmine.Matchers.prototype.toNotExist = function() {
90
+ var actual = $(this.actual);
91
+ return this.report(
92
+ actual.length == 0,
93
+ "Expected $('" + actual.selector + "') to not exist but it did"
94
+ );
95
+ };
96
+
97
+ jasmine.Matchers.prototype.toContainSelector = function(expected) {
98
+ var actual = $(this.actual);
99
+ var children = actual.find(expected);
100
+ return this.report(
101
+ children.length > 0,
102
+ "Expected [" + jasmine.util.htmlEscape(actual.html()) + "] to contain selector [" + $(expected).selector + "] but didn't"
103
+ );
104
+ };
105
+
106
+ jasmine.Matchers.prototype.toNotContainSelector = function(expected) {
107
+ var actual = $(this.actual);
108
+ var children = actual.find(expected);
109
+ return this.report(
110
+ children.length == 0,
111
+ "Expected [" + jasmine.util.htmlEscape(actual.html()) + "] to not contain selector [" + $(expected).selector + "] but it did"
112
+ );
113
+ };
114
+
115
+ jasmine.Matchers.prototype.toBeVisible = function() {
116
+ var actual = $(this.actual);
117
+ var basicMessage = "be visible";
118
+ return this._reportWithNonExistant(
119
+ actual.is(':visible'),
120
+ basicMessage,
121
+ "Expected '" + actual.selector + "' to " + basicMessage + " but was not"
122
+ );
123
+ };
124
+
125
+ jasmine.Matchers.prototype.toNotBeVisible = function() {
126
+ var actual = $(this.actual);
127
+ var basicMessage = "be hidden";
128
+ return this._reportWithNonExistant(
129
+ !actual.is(':visible'),
130
+ basicMessage,
131
+ "Expected '" + actual.selector + "' to " + basicMessage + " but was not"
132
+ );
133
+ };
134
+
135
+ jasmine.Matchers.prototype.toNotBeDisplayed = function() {
136
+ var actual = $(this.actual);
137
+ var basicMessage = "be display none";
138
+ return this._reportWithNonExistant(
139
+ actual.css("display") == "none",
140
+ basicMessage,
141
+ "Expected '" + actual.selector + "' to " + basicMessage + " but was not"
142
+ );
143
+ };
144
+
145
+ jasmine.Matchers.prototype.toBeDisplayed = function() {
146
+ var actual = $(this.actual);
147
+ var basicMessage = "not be display none";
148
+ return this._reportWithNonExistant(
149
+ actual.css("display") != "none",
150
+ basicMessage,
151
+ "Expected '" + actual.selector + "' to " + basicMessage + " but was"
152
+ );
153
+ };
154
+
155
+ jasmine.Matchers.prototype.toBeEmpty= function() {
156
+ var actual = $(this.actual);
157
+ var basicMessage = "be empty";
158
+ return this._reportWithNonExistant(
159
+ actual.html() == "",
160
+ basicMessage,
161
+ "Expected '" + actual.selector + "' to " + basicMessage + " but was not"
162
+ );
163
+ };
164
+
165
+ jasmine.Matchers.prototype.toNotBeEmpty= function() {
166
+ var actual = $(this.actual);
167
+ var basicMessage = "not be empty";
168
+ return this._reportWithNonExistant(
169
+ actual.html() != "",
170
+ basicMessage,
171
+ "Expected '" + actual.selector + "' to " + basicMessage + " but it was"
172
+ );
173
+ };
174
+
175
+ jasmine.Matchers.prototype.toHaveClass= function(expected) {
176
+ var actual = $(this.actual);
177
+ var basicMessage = "have class " + expected;
178
+ return this._reportWithNonExistant(
179
+ actual.hasClass(expected),
180
+ basicMessage,
181
+ "Expected '" + actual.selector + "' to " + basicMessage + " but does not"
182
+ );
183
+ };
184
+
185
+ jasmine.Matchers.prototype.toNotHaveClass= function(expected) {
186
+ var actual = $(this.actual);
187
+ var basicMessage = "not have class " + expected;
188
+ return this._reportWithNonExistant(
189
+ !actual.hasClass(expected),
190
+ basicMessage,
191
+ "Expected '" + actual.selector + "' to " + basicMessage + " but it does"
192
+ );
193
+ };
194
+
195
+ jasmine.Matchers.prototype.toBeDisabled= function() {
196
+ var actual = $(this.actual);
197
+ var basicMessage = "be disabled";
198
+ return this._reportWithNonExistant(
199
+ actual.is(":disabled"),
200
+ basicMessage,
201
+ "Expected '" + actual.selector + "' to " + basicMessage + " but was not"
202
+ );
203
+ };
204
+
205
+ jasmine.Matchers.prototype.toBeEnabled= function() {
206
+ var actual = $(this.actual);
207
+ var basicMessage = "be enabled";
208
+ return this._reportWithNonExistant(
209
+ actual.is(":enabled"),
210
+ basicMessage,
211
+ "Expected '" + actual.selector + "' to " + basicMessage + " but was not"
212
+ );
213
+ };
214
+
215
+ jasmine.Matchers.prototype.toBeTag= function(tagName) {
216
+ var actual = $(this.actual);
217
+ var basicMessage = "be a tag of type '" + tagName + "'";
218
+ var actualTagName = "your element";
219
+ if(actual.length > 0) {
220
+ actualTagName = actual.get(0).tagName.toLowerCase();
221
+ }
222
+ return this._reportWithNonExistant(
223
+ actual.is(tagName),
224
+ basicMessage,
225
+ "Expected '" + actualTagName + "' to " + basicMessage + " but was not"
226
+ );
227
+ };
228
+
229
+ jasmine.Matchers.prototype.toHaveAttribute= function(attr, value) {
230
+ var actual = $(this.actual);
231
+ var basicMessage = "have attribute '" + attr + "' with value '" + value + "'";
232
+ var actualValue = actual.attr(attr);
233
+ return this._reportWithNonExistant(
234
+ actualValue == value,
235
+ basicMessage,
236
+ "Expected '" + actual.selector + "' to " + basicMessage + " but instead had '" + actualValue + "'"
237
+ );
238
+ };
239
+
240
+ jasmine.Matchers.prototype._reportWithNonExistant = function(test, basicMesage, fullMessage) {
241
+ var actual = $(this.actual);
242
+ if(actual.length > 0) {
243
+ return this.report(
244
+ test,
245
+ fullMessage
246
+ );
247
+ } else {
248
+ return this.report(
249
+ false,
250
+ "Expected '" + actual.selector + "' to "+ basicMesage +" but the element didn't exist."
251
+ );
252
+ }
253
+ };
@@ -0,0 +1,45 @@
1
+ # Add fixture-generation methods to ControllerExampleGroup. We load
2
+ # this file within our spec_helper.rb
3
+
4
+ Spec::Rails::Example::ControllerExampleGroup.class_eval do
5
+
6
+ # Saves the markup to a fixture file using the given name
7
+ def save_fixture(markup, name)
8
+ fixture_path = File.join(RAILS_ROOT, '/tmp/js_dom_fixtures')
9
+ Dir.mkdir(fixture_path) unless File.exists?(fixture_path)
10
+
11
+ fixture_file = File.join(fixture_path, "#{name}.fixture.html.erb")
12
+ File.open(fixture_file, 'w') do |file|
13
+ file.puts(markup)
14
+ end
15
+ end
16
+
17
+ # From the controller spec response body, extracts html identified
18
+ # by the css selector.
19
+ def html_for(selector)
20
+ doc = Nokogiri::HTML(response.body)
21
+
22
+ remove_third_party_scripts(doc)
23
+ content = doc.css(selector).first.to_s
24
+
25
+ return convert_body_tag_to_div(content)
26
+ end
27
+
28
+ # Remove scripts such as Google Analytics to avoid running them
29
+ # when we load into the dom during js specs.
30
+ def remove_third_party_scripts(doc)
31
+ scripts = doc.at('#third-party-scripts')
32
+ scripts.remove if scripts
33
+ end
34
+
35
+ # Many of our css and jQuery selectors rely on a class attribute we
36
+ # normally embed in the <body>. For example:
37
+ #
38
+ # <body class="workspaces show">
39
+ #
40
+ # Here we convert the body tag to a div so that we can load it into
41
+ # the document running js specs without embedding a <body> within a <body>.
42
+ def convert_body_tag_to_div(markup)
43
+ return markup.gsub("<body", '<div').gsub("</body>", "</div>")
44
+ end
45
+ end
File without changes
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "JasmineFixtures" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'jasmine-fixtures'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jasmine-fixtures
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Roger Neel
14
+ - Jonathan Barnes
15
+ - JB Steadman
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2010-11-07 00:00:00 -07:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: rspec
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 13
32
+ segments:
33
+ - 1
34
+ - 2
35
+ - 9
36
+ version: 1.2.9
37
+ type: :development
38
+ version_requirements: *id001
39
+ description: Dump out DOM that you want to test. Use jasmine-fixtures to load that DOM into your Jasmine specs. See github.com/mavenlink/jasmine-fixtures for more.
40
+ email: roger@mavenlink.com
41
+ executables: []
42
+
43
+ extensions: []
44
+
45
+ extra_rdoc_files:
46
+ - LICENSE
47
+ - README.rdoc
48
+ files:
49
+ - .bundle/config
50
+ - .document
51
+ - .gitignore
52
+ - .pairs
53
+ - Gemfile
54
+ - Gemfile.lock
55
+ - LICENSE
56
+ - README.rdoc
57
+ - Rakefile
58
+ - VERSION
59
+ - generators/jasmine-fixtures/jasmine_fixtures_generator.rb
60
+ - generators/jasmine-fixtures/templates/INSTALL
61
+ - generators/jasmine-fixtures/templates/spec/controllers/jasmine_fixture_creators.rb
62
+ - generators/jasmine-fixtures/templates/spec/javascripts/helpers/jasmine-fixture-helper.js
63
+ - generators/jasmine-fixtures/templates/spec/javascripts/helpers/jasmine-fixture-loader.js
64
+ - generators/jasmine-fixtures/templates/spec/javascripts/helpers/jasmine-fixture-matchers.js
65
+ - generators/jasmine-fixtures/templates/spec/spec_helpers/jasmine_fixture_generator_methods.rb
66
+ - lib/jasmine-fixtures.rb
67
+ - spec/jasmine-fixtures_spec.rb
68
+ - spec/spec.opts
69
+ - spec/spec_helper.rb
70
+ has_rdoc: true
71
+ homepage: http://github.com/mavenlink/jasmine-fixtures
72
+ licenses: []
73
+
74
+ post_install_message:
75
+ rdoc_options:
76
+ - --charset=UTF-8
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 3
94
+ segments:
95
+ - 0
96
+ version: "0"
97
+ requirements: []
98
+
99
+ rubyforge_project:
100
+ rubygems_version: 1.3.7
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: Jasmine Fixtures allow you to use real DOM to test your JavaScript
104
+ test_files:
105
+ - spec/jasmine-fixtures_spec.rb
106
+ - spec/spec_helper.rb