hermes 0.2.1 → 0.3.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.
Files changed (61) hide show
  1. data/README.rdoc +4 -0
  2. data/lib/hermes.rb +7 -1
  3. data/lib/hermes/actions.rb +81 -0
  4. data/lib/hermes/assertions.rb +34 -29
  5. data/lib/hermes/builders.rb +46 -21
  6. data/lib/hermes/context.rb +0 -2
  7. data/lib/hermes/integration_case.rb +7 -3
  8. data/lib/hermes/rails.rb +4 -0
  9. data/lib/hermes/scopes.rb +32 -0
  10. data/lib/hermes/version.rb +1 -1
  11. data/test/builders.rb +13 -0
  12. data/test/fixtures/users.yml +4 -0
  13. data/test/hermes/actions_test.rb +118 -0
  14. data/test/hermes/assertions_test.rb +493 -0
  15. data/test/hermes/builders_test.rb +109 -0
  16. data/test/hermes/context_test.rb +5 -0
  17. data/test/hermes/scopes_test.rb +47 -0
  18. data/test/rails_app/Rakefile +7 -0
  19. data/test/rails_app/app/controllers/application_controller.rb +3 -0
  20. data/test/rails_app/app/controllers/users_controller.rb +23 -0
  21. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  22. data/test/rails_app/app/models/user.rb +11 -0
  23. data/test/rails_app/app/views/layouts/application.html.erb +14 -0
  24. data/test/rails_app/app/views/users/index.html.erb +10 -0
  25. data/test/rails_app/app/views/users/new.html.erb +62 -0
  26. data/test/rails_app/config.ru +4 -0
  27. data/test/rails_app/config/application.rb +42 -0
  28. data/test/rails_app/config/boot.rb +10 -0
  29. data/test/rails_app/config/database.yml +20 -0
  30. data/test/rails_app/config/environment.rb +5 -0
  31. data/test/rails_app/config/environments/development.rb +26 -0
  32. data/test/rails_app/config/environments/production.rb +49 -0
  33. data/test/rails_app/config/environments/test.rb +35 -0
  34. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  35. data/test/rails_app/config/initializers/inflections.rb +10 -0
  36. data/test/rails_app/config/initializers/mime_types.rb +5 -0
  37. data/test/rails_app/config/initializers/secret_token.rb +7 -0
  38. data/test/rails_app/config/initializers/session_store.rb +8 -0
  39. data/test/rails_app/config/locales/en.yml +5 -0
  40. data/test/rails_app/config/routes.rb +7 -0
  41. data/test/rails_app/db/migrate/20110228170406_create_users.rb +15 -0
  42. data/test/rails_app/db/schema.rb +21 -0
  43. data/test/rails_app/log/development.log +29 -0
  44. data/test/rails_app/log/production.log +0 -0
  45. data/test/rails_app/log/server.log +0 -0
  46. data/test/rails_app/log/test.log +1519 -0
  47. data/test/rails_app/public/404.html +26 -0
  48. data/test/rails_app/public/422.html +26 -0
  49. data/test/rails_app/public/500.html +26 -0
  50. data/test/rails_app/public/favicon.ico +0 -0
  51. data/test/rails_app/public/javascripts/application.js +2 -0
  52. data/test/rails_app/public/javascripts/controls.js +965 -0
  53. data/test/rails_app/public/javascripts/dragdrop.js +974 -0
  54. data/test/rails_app/public/javascripts/effects.js +1123 -0
  55. data/test/rails_app/public/javascripts/prototype.js +6001 -0
  56. data/test/rails_app/public/javascripts/rails.js +191 -0
  57. data/test/rails_app/script/rails +6 -0
  58. data/test/support/assertions.rb +23 -0
  59. data/test/support/models.rb +11 -0
  60. data/test/test_helper.rb +29 -3
  61. metadata +108 -7
@@ -0,0 +1,191 @@
1
+ (function() {
2
+ // Technique from Juriy Zaytsev
3
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
4
+ function isEventSupported(eventName) {
5
+ var el = document.createElement('div');
6
+ eventName = 'on' + eventName;
7
+ var isSupported = (eventName in el);
8
+ if (!isSupported) {
9
+ el.setAttribute(eventName, 'return;');
10
+ isSupported = typeof el[eventName] == 'function';
11
+ }
12
+ el = null;
13
+ return isSupported;
14
+ }
15
+
16
+ function isForm(element) {
17
+ return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'
18
+ }
19
+
20
+ function isInput(element) {
21
+ if (Object.isElement(element)) {
22
+ var name = element.nodeName.toUpperCase()
23
+ return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'
24
+ }
25
+ else return false
26
+ }
27
+
28
+ var submitBubbles = isEventSupported('submit'),
29
+ changeBubbles = isEventSupported('change')
30
+
31
+ if (!submitBubbles || !changeBubbles) {
32
+ // augment the Event.Handler class to observe custom events when needed
33
+ Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap(
34
+ function(init, element, eventName, selector, callback) {
35
+ init(element, eventName, selector, callback)
36
+ // is the handler being attached to an element that doesn't support this event?
37
+ if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) ||
38
+ (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) {
39
+ // "submit" => "emulated:submit"
40
+ this.eventName = 'emulated:' + this.eventName
41
+ }
42
+ }
43
+ )
44
+ }
45
+
46
+ if (!submitBubbles) {
47
+ // discover forms on the page by observing focus events which always bubble
48
+ document.on('focusin', 'form', function(focusEvent, form) {
49
+ // special handler for the real "submit" event (one-time operation)
50
+ if (!form.retrieve('emulated:submit')) {
51
+ form.on('submit', function(submitEvent) {
52
+ var emulated = form.fire('emulated:submit', submitEvent, true)
53
+ // if custom event received preventDefault, cancel the real one too
54
+ if (emulated.returnValue === false) submitEvent.preventDefault()
55
+ })
56
+ form.store('emulated:submit', true)
57
+ }
58
+ })
59
+ }
60
+
61
+ if (!changeBubbles) {
62
+ // discover form inputs on the page
63
+ document.on('focusin', 'input, select, texarea', function(focusEvent, input) {
64
+ // special handler for real "change" events
65
+ if (!input.retrieve('emulated:change')) {
66
+ input.on('change', function(changeEvent) {
67
+ input.fire('emulated:change', changeEvent, true)
68
+ })
69
+ input.store('emulated:change', true)
70
+ }
71
+ })
72
+ }
73
+
74
+ function handleRemote(element) {
75
+ var method, url, params;
76
+
77
+ var event = element.fire("ajax:before");
78
+ if (event.stopped) return false;
79
+
80
+ if (element.tagName.toLowerCase() === 'form') {
81
+ method = element.readAttribute('method') || 'post';
82
+ url = element.readAttribute('action');
83
+ params = element.serialize();
84
+ } else {
85
+ method = element.readAttribute('data-method') || 'get';
86
+ url = element.readAttribute('href');
87
+ params = {};
88
+ }
89
+
90
+ new Ajax.Request(url, {
91
+ method: method,
92
+ parameters: params,
93
+ evalScripts: true,
94
+
95
+ onComplete: function(request) { element.fire("ajax:complete", request); },
96
+ onSuccess: function(request) { element.fire("ajax:success", request); },
97
+ onFailure: function(request) { element.fire("ajax:failure", request); }
98
+ });
99
+
100
+ element.fire("ajax:after");
101
+ }
102
+
103
+ function handleMethod(element) {
104
+ var method = element.readAttribute('data-method'),
105
+ url = element.readAttribute('href'),
106
+ csrf_param = $$('meta[name=csrf-param]')[0],
107
+ csrf_token = $$('meta[name=csrf-token]')[0];
108
+
109
+ var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
110
+ element.parentNode.insert(form);
111
+
112
+ if (method !== 'post') {
113
+ var field = new Element('input', { type: 'hidden', name: '_method', value: method });
114
+ form.insert(field);
115
+ }
116
+
117
+ if (csrf_param) {
118
+ var param = csrf_param.readAttribute('content'),
119
+ token = csrf_token.readAttribute('content'),
120
+ field = new Element('input', { type: 'hidden', name: param, value: token });
121
+ form.insert(field);
122
+ }
123
+
124
+ form.submit();
125
+ }
126
+
127
+
128
+ document.on("click", "*[data-confirm]", function(event, element) {
129
+ var message = element.readAttribute('data-confirm');
130
+ if (!confirm(message)) event.stop();
131
+ });
132
+
133
+ document.on("click", "a[data-remote]", function(event, element) {
134
+ if (event.stopped) return;
135
+ handleRemote(element);
136
+ event.stop();
137
+ });
138
+
139
+ document.on("click", "a[data-method]", function(event, element) {
140
+ if (event.stopped) return;
141
+ handleMethod(element);
142
+ event.stop();
143
+ });
144
+
145
+ document.on("submit", function(event) {
146
+ var element = event.findElement(),
147
+ message = element.readAttribute('data-confirm');
148
+ if (message && !confirm(message)) {
149
+ event.stop();
150
+ return false;
151
+ }
152
+
153
+ var inputs = element.select("input[type=submit][data-disable-with]");
154
+ inputs.each(function(input) {
155
+ input.disabled = true;
156
+ input.writeAttribute('data-original-value', input.value);
157
+ input.value = input.readAttribute('data-disable-with');
158
+ });
159
+
160
+ var element = event.findElement("form[data-remote]");
161
+ if (element) {
162
+ handleRemote(element);
163
+ event.stop();
164
+ }
165
+ });
166
+
167
+ document.on("ajax:after", "form", function(event, element) {
168
+ var inputs = element.select("input[type=submit][disabled=true][data-disable-with]");
169
+ inputs.each(function(input) {
170
+ input.value = input.readAttribute('data-original-value');
171
+ input.removeAttribute('data-original-value');
172
+ input.disabled = false;
173
+ });
174
+ });
175
+
176
+ Ajax.Responders.register({
177
+ onCreate: function(request) {
178
+ var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
179
+
180
+ if (csrf_meta_tag) {
181
+ var header = 'X-CSRF-Token',
182
+ token = csrf_meta_tag.readAttribute('content');
183
+
184
+ if (!request.options.requestHeaders) {
185
+ request.options.requestHeaders = {};
186
+ }
187
+ request.options.requestHeaders[header] = token;
188
+ }
189
+ }
190
+ });
191
+ })();
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,23 @@
1
+
2
+ module Support
3
+ module Assertions
4
+ def assert_raise_with_message(exception, message_or_match, &block)
5
+ block.call
6
+ rescue Exception => e
7
+ assert_block("<#{exception}> expected to be raised, but was\n<#{e.class.name}>") do
8
+ exception == e.class
9
+ end
10
+
11
+ assert_block("<#{message_or_match}> exception message expected, but was\n<#{e.message}>") do
12
+ case message_or_match
13
+ when String
14
+ e.message == message_or_match
15
+ when Regexp
16
+ e.message.match(message_or_match)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ include Support::Assertions
@@ -0,0 +1,11 @@
1
+ module Support
2
+ module Models
3
+ # def create_user(options={})
4
+ # User.create!({
5
+ # :name => 'The User', :active_at => Time.now
6
+ # }.merge(options))
7
+ # end
8
+ end
9
+ end
10
+
11
+ include Support::Models
@@ -1,6 +1,32 @@
1
- $:.unshift File.expand_path('../../lib', __FILE__)
1
+ require 'rubygems'
2
+ require 'bundler'
2
3
 
4
+ Bundler.setup(:default, :test)
5
+
6
+ # Embedded rails app setup
7
+ ENV["RAILS_ENV"] = "test"
8
+ require "rails_app/config/environment"
9
+ Rails.backtrace_cleaner.remove_silencers!
10
+
11
+ # Run any available migration
12
+ ActiveRecord::Migration.verbose = false
13
+ ActiveRecord::Migrator.migrate File.expand_path("../rails_app/db/migrate/", __FILE__)
14
+
15
+ # Capybara setup
16
+ require "capybara/rails"
17
+ Capybara.default_driver = :rack_test
18
+ Capybara.default_selector = :css
19
+
20
+ require 'rails/test_help'
3
21
  require 'active_support/test_case'
22
+
4
23
  require 'hermes'
5
- require 'hermes/context'
6
- require 'hermes/integration_case'
24
+
25
+ # Support
26
+ require 'support/models'
27
+ require 'support/assertions'
28
+
29
+ # Builders
30
+ require 'builders'
31
+
32
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures/", __FILE__)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hermes
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease: false
4
+ hash: 19
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 1
10
- version: 0.2.1
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Jos\xC3\xA9 Valim"
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-10-29 00:00:00 -02:00
19
+ date: 2011-03-14 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies: []
22
22
 
@@ -30,14 +30,66 @@ extensions: []
30
30
  extra_rdoc_files:
31
31
  - README.rdoc
32
32
  files:
33
+ - lib/hermes/actions.rb
33
34
  - lib/hermes/assertions.rb
34
35
  - lib/hermes/builders.rb
35
36
  - lib/hermes/context.rb
36
37
  - lib/hermes/integration_case.rb
38
+ - lib/hermes/rails.rb
39
+ - lib/hermes/scopes.rb
37
40
  - lib/hermes/version.rb
38
41
  - lib/hermes.rb
39
42
  - README.rdoc
40
43
  - MIT-LICENSE
44
+ - test/builders.rb
45
+ - test/fixtures/users.yml
46
+ - test/hermes/actions_test.rb
47
+ - test/hermes/assertions_test.rb
48
+ - test/hermes/builders_test.rb
49
+ - test/hermes/context_test.rb
50
+ - test/hermes/scopes_test.rb
51
+ - test/rails_app/app/controllers/application_controller.rb
52
+ - test/rails_app/app/controllers/users_controller.rb
53
+ - test/rails_app/app/helpers/application_helper.rb
54
+ - test/rails_app/app/models/user.rb
55
+ - test/rails_app/app/views/layouts/application.html.erb
56
+ - test/rails_app/app/views/users/index.html.erb
57
+ - test/rails_app/app/views/users/new.html.erb
58
+ - test/rails_app/config/application.rb
59
+ - test/rails_app/config/boot.rb
60
+ - test/rails_app/config/database.yml
61
+ - test/rails_app/config/environment.rb
62
+ - test/rails_app/config/environments/development.rb
63
+ - test/rails_app/config/environments/production.rb
64
+ - test/rails_app/config/environments/test.rb
65
+ - test/rails_app/config/initializers/backtrace_silencers.rb
66
+ - test/rails_app/config/initializers/inflections.rb
67
+ - test/rails_app/config/initializers/mime_types.rb
68
+ - test/rails_app/config/initializers/secret_token.rb
69
+ - test/rails_app/config/initializers/session_store.rb
70
+ - test/rails_app/config/locales/en.yml
71
+ - test/rails_app/config/routes.rb
72
+ - test/rails_app/config.ru
73
+ - test/rails_app/db/migrate/20110228170406_create_users.rb
74
+ - test/rails_app/db/schema.rb
75
+ - test/rails_app/log/development.log
76
+ - test/rails_app/log/production.log
77
+ - test/rails_app/log/server.log
78
+ - test/rails_app/log/test.log
79
+ - test/rails_app/public/404.html
80
+ - test/rails_app/public/422.html
81
+ - test/rails_app/public/500.html
82
+ - test/rails_app/public/favicon.ico
83
+ - test/rails_app/public/javascripts/application.js
84
+ - test/rails_app/public/javascripts/controls.js
85
+ - test/rails_app/public/javascripts/dragdrop.js
86
+ - test/rails_app/public/javascripts/effects.js
87
+ - test/rails_app/public/javascripts/prototype.js
88
+ - test/rails_app/public/javascripts/rails.js
89
+ - test/rails_app/Rakefile
90
+ - test/rails_app/script/rails
91
+ - test/support/assertions.rb
92
+ - test/support/models.rb
41
93
  - test/test_helper.rb
42
94
  has_rdoc: true
43
95
  homepage: http://github.com/plataformatec/hermes
@@ -70,9 +122,58 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
122
  requirements: []
71
123
 
72
124
  rubyforge_project: hermes
73
- rubygems_version: 1.3.7
125
+ rubygems_version: 1.5.3
74
126
  signing_key:
75
127
  specification_version: 3
76
128
  summary: A few testing facilities built on top of Capybara and ActiveSupport::TestCase
77
129
  test_files:
130
+ - test/builders.rb
131
+ - test/fixtures/users.yml
132
+ - test/hermes/actions_test.rb
133
+ - test/hermes/assertions_test.rb
134
+ - test/hermes/builders_test.rb
135
+ - test/hermes/context_test.rb
136
+ - test/hermes/scopes_test.rb
137
+ - test/rails_app/app/controllers/application_controller.rb
138
+ - test/rails_app/app/controllers/users_controller.rb
139
+ - test/rails_app/app/helpers/application_helper.rb
140
+ - test/rails_app/app/models/user.rb
141
+ - test/rails_app/app/views/layouts/application.html.erb
142
+ - test/rails_app/app/views/users/index.html.erb
143
+ - test/rails_app/app/views/users/new.html.erb
144
+ - test/rails_app/config/application.rb
145
+ - test/rails_app/config/boot.rb
146
+ - test/rails_app/config/database.yml
147
+ - test/rails_app/config/environment.rb
148
+ - test/rails_app/config/environments/development.rb
149
+ - test/rails_app/config/environments/production.rb
150
+ - test/rails_app/config/environments/test.rb
151
+ - test/rails_app/config/initializers/backtrace_silencers.rb
152
+ - test/rails_app/config/initializers/inflections.rb
153
+ - test/rails_app/config/initializers/mime_types.rb
154
+ - test/rails_app/config/initializers/secret_token.rb
155
+ - test/rails_app/config/initializers/session_store.rb
156
+ - test/rails_app/config/locales/en.yml
157
+ - test/rails_app/config/routes.rb
158
+ - test/rails_app/config.ru
159
+ - test/rails_app/db/migrate/20110228170406_create_users.rb
160
+ - test/rails_app/db/schema.rb
161
+ - test/rails_app/log/development.log
162
+ - test/rails_app/log/production.log
163
+ - test/rails_app/log/server.log
164
+ - test/rails_app/log/test.log
165
+ - test/rails_app/public/404.html
166
+ - test/rails_app/public/422.html
167
+ - test/rails_app/public/500.html
168
+ - test/rails_app/public/favicon.ico
169
+ - test/rails_app/public/javascripts/application.js
170
+ - test/rails_app/public/javascripts/controls.js
171
+ - test/rails_app/public/javascripts/dragdrop.js
172
+ - test/rails_app/public/javascripts/effects.js
173
+ - test/rails_app/public/javascripts/prototype.js
174
+ - test/rails_app/public/javascripts/rails.js
175
+ - test/rails_app/Rakefile
176
+ - test/rails_app/script/rails
177
+ - test/support/assertions.rb
178
+ - test/support/models.rb
78
179
  - test/test_helper.rb