acts_as_multipart_form 0.0.1

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 (86) hide show
  1. data/CHANGELOG +3 -0
  2. data/Gemfile +27 -0
  3. data/Gemfile.lock +157 -0
  4. data/LICENSE.txt +20 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +65 -0
  8. data/VERSION +1 -0
  9. data/acts_as_multipart_form.gemspec +163 -0
  10. data/app/controllers/multipart_form/in_progress_forms_controller.rb +0 -0
  11. data/app/models/multipart_form/in_progress_form.rb +20 -0
  12. data/app/views/multipart_form/_breadcrumb.html.erb +21 -0
  13. data/app/views/multipart_form/_index_links.html.erb +20 -0
  14. data/app/views/multipart_form/in_progress_form/index.html.erb +0 -0
  15. data/app/views/multipart_form/in_progress_form/index.html.haml +0 -0
  16. data/lib/acts_as_multipart_form.rb +2 -0
  17. data/lib/acts_as_multipart_form/config.rb +36 -0
  18. data/lib/acts_as_multipart_form/engine.rb +4 -0
  19. data/lib/acts_as_multipart_form/multipart_form_in_controller.rb +301 -0
  20. data/lib/acts_as_multipart_form/multipart_form_in_model.rb +105 -0
  21. data/lib/acts_as_multipart_form/railtie.rb +14 -0
  22. data/lib/generators/acts_as_multipart_form/install_generator.rb +44 -0
  23. data/lib/generators/acts_as_multipart_form/templates/config.rb +6 -0
  24. data/lib/generators/acts_as_multipart_form/templates/migrations/install_migration.rb.erb +17 -0
  25. data/spec/acts_as_multipart_form_spec.rb +7 -0
  26. data/spec/dummy/Rakefile +7 -0
  27. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  28. data/spec/dummy/app/controllers/people_controller.rb +53 -0
  29. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  30. data/spec/dummy/app/models/person.rb +5 -0
  31. data/spec/dummy/app/models/person_with_multiple_actsas.rb +5 -0
  32. data/spec/dummy/app/models/person_with_multiple_forms.rb +4 -0
  33. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  34. data/spec/dummy/app/views/people/_job_info.html.erb +8 -0
  35. data/spec/dummy/app/views/people/_person_info.html.erb +8 -0
  36. data/spec/dummy/app/views/people/hire_form.html.erb +10 -0
  37. data/spec/dummy/app/views/people/index.html.erb +16 -0
  38. data/spec/dummy/app/views/people/show.html.erb +0 -0
  39. data/spec/dummy/config.ru +4 -0
  40. data/spec/dummy/config/application.rb +45 -0
  41. data/spec/dummy/config/boot.rb +10 -0
  42. data/spec/dummy/config/database.yml +22 -0
  43. data/spec/dummy/config/environment.rb +5 -0
  44. data/spec/dummy/config/environments/development.rb +26 -0
  45. data/spec/dummy/config/environments/production.rb +49 -0
  46. data/spec/dummy/config/environments/test.rb +35 -0
  47. data/spec/dummy/config/initializers/acts_as_multipart_form.rb +6 -0
  48. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  49. data/spec/dummy/config/initializers/inflections.rb +10 -0
  50. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  51. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  52. data/spec/dummy/config/initializers/session_store.rb +8 -0
  53. data/spec/dummy/config/locales/en.yml +5 -0
  54. data/spec/dummy/config/routes.rb +66 -0
  55. data/spec/dummy/db/migrate/20110715180834_create_people.rb +13 -0
  56. data/spec/dummy/db/migrate/20110722130249_create_multipart_form_tables.rb +17 -0
  57. data/spec/dummy/db/schema.rb +31 -0
  58. data/spec/dummy/features/form_breadcrumb.feature +75 -0
  59. data/spec/dummy/features/form_submission.feature +23 -0
  60. data/spec/dummy/features/index_links.feature +56 -0
  61. data/spec/dummy/features/step_definitions/acts_as_multipart_form_steps.rb +30 -0
  62. data/spec/dummy/features/step_definitions/config_steps.rb +23 -0
  63. data/spec/dummy/features/step_definitions/web_steps.rb +214 -0
  64. data/spec/dummy/features/support/env.rb +15 -0
  65. data/spec/dummy/features/support/paths.rb +31 -0
  66. data/spec/dummy/features/support/selectors.rb +39 -0
  67. data/spec/dummy/public/404.html +26 -0
  68. data/spec/dummy/public/422.html +26 -0
  69. data/spec/dummy/public/500.html +26 -0
  70. data/spec/dummy/public/favicon.ico +0 -0
  71. data/spec/dummy/public/javascripts/application.js +2 -0
  72. data/spec/dummy/public/javascripts/controls.js +965 -0
  73. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  74. data/spec/dummy/public/javascripts/effects.js +1123 -0
  75. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  76. data/spec/dummy/public/javascripts/rails.js +191 -0
  77. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  78. data/spec/dummy/script/rails +6 -0
  79. data/spec/in_progress_form_spec.rb +43 -0
  80. data/spec/integration/navigation_spec.rb +9 -0
  81. data/spec/multipart_form_in_controller_integeration_spec.rb +23 -0
  82. data/spec/multipart_form_in_controller_spec.rb +360 -0
  83. data/spec/multipart_form_in_model_integration_spec.rb +30 -0
  84. data/spec/multipart_form_in_model_spec.rb +156 -0
  85. data/spec/spec_helper.rb +38 -0
  86. metadata +296 -0
@@ -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
+ })();
File without changes
@@ -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,43 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe MultipartForm::InProgressForm do
4
+ describe "validations" do
5
+ before(:each) do
6
+ @ip_form = MultipartForm::InProgressForm.new
7
+ @person = mock_model(Person)
8
+ @person.stub!(:model).and_return("Person")
9
+ @person.stub!(:id).and_return(1)
10
+
11
+ form_name = :person_form.to_s
12
+
13
+ @valid_attributes = {
14
+ :form_subject => @person,
15
+ :form_name => "hire_form",
16
+ :last_completed_step => "personal_info",
17
+ :completed => "false"
18
+ }
19
+
20
+ end
21
+
22
+ it "should be valid" do
23
+ @ip_form.attributes = @valid_attributes
24
+ @ip_form.should be_valid
25
+ end
26
+
27
+ it "should require a form subject" do
28
+ @ip_form.should have(1).error_on(:form_subject)
29
+ end
30
+
31
+ it "should require a form name" do
32
+ @ip_form.should have(1).error_on(:form_name)
33
+ end
34
+
35
+ it "should require a last completed step" do
36
+ @ip_form.should have(1).error_on(:last_completed_step)
37
+ end
38
+
39
+ it "should require completed" do
40
+ @ip_form.should have(1).error_on(:completed)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Navigation" do
4
+ include Capybara
5
+
6
+ it "should be a valid app" do
7
+ ::Rails.application.should be_a(Dummy::Application)
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe PeopleController do
4
+ describe "hire_form action" do
5
+ # no idea why I can't call get
6
+ # I am terrible at testing
7
+ def get_hire_form(input_params = nil)
8
+ params = input_params || { :in_progress_form_id => 1, :multipart_form_part => :person_info }
9
+ get :hire_form, params
10
+ end
11
+
12
+ #it "should call the form handler" do
13
+ # @controller.should_receive(:multipart_form_handler)
14
+ # get_hire_form
15
+ #end
16
+
17
+ #it "should save the multipart form part for the form so it is available for the view" do
18
+ # get_hire_form
19
+ # assigns[:multipart_form_part].should == :person_info
20
+ #end
21
+ end
22
+ end
23
+
@@ -0,0 +1,360 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe ActsAsMultipartForm::MultipartFormInController do
4
+ describe "acts_as_multipart_form class method" do
5
+ before(:each) do
6
+ @controller = PeopleController.new
7
+ end
8
+
9
+ it "should include instance methods" do
10
+ @controller.should be_a_kind_of (ActsAsMultipartForm::MultipartFormInController::InstanceMethods)
11
+ end
12
+
13
+ it "should setup the multipart_forms hash" do
14
+ @controller.should respond_to :multipart_forms
15
+ end
16
+
17
+ it "should save the parameters to multipart_forms hash" do
18
+ @controller.multipart_forms[:hire_form][:parts].should == [:person_info, :person_info_update, :job_info, :job_info_update]
19
+ end
20
+
21
+ it "should set the model if it is not given" do
22
+ @controller.multipart_forms[:hire_form][:model].should == "Person"
23
+ end
24
+
25
+ it "should set the form_route if it is not given" do
26
+ @controller.multipart_forms[:hire_form][:form_route].should == "person_hire_form"
27
+ end
28
+
29
+ it "should set the show_route if it is not given" do
30
+ @controller.multipart_forms[:hire_form][:show_route].should == "person"
31
+ end
32
+ end
33
+
34
+ describe "get_next_multipart_form_part method" do
35
+ before(:each) do
36
+ @controller = PeopleController.new
37
+ @controller.multipart_forms[:hire_form][:parts] = [:person_info, :job_info]
38
+ end
39
+
40
+ it "should respond to get_next_multipart_form_part" do
41
+ @controller.should respond_to :get_next_multipart_form_part
42
+ end
43
+
44
+ it "should return the next part" do
45
+ @controller.get_next_multipart_form_part(:hire_form, :person_info).should == :job_info
46
+ end
47
+
48
+ it "should return the current part if on the last part" do
49
+ @controller.get_next_multipart_form_part(:hire_form, :job_info).should == :job_info
50
+ end
51
+ end
52
+
53
+ describe "get_previous_multipart_form_part method" do
54
+ before(:each) do
55
+ @controller = PeopleController.new
56
+ @controller.multipart_forms[:hire_form][:parts] = [:person_info, :job_info]
57
+ end
58
+
59
+ it "should respond to get_previous_multipart_form_part" do
60
+ @controller.should respond_to :get_previous_multipart_form_part
61
+ end
62
+
63
+ it "should return the previous part" do
64
+ @controller.get_previous_multipart_form_part(:hire_form, :job_info).should == :person_info
65
+ end
66
+
67
+ it "Should return the current part if on the first part" do
68
+ @controller.get_previous_multipart_form_part(:hire_form, :person_info).should == :person_info
69
+ end
70
+ end
71
+
72
+ describe "last_multipart_form_part? method" do
73
+ before(:each) do
74
+ @controller = PeopleController.new
75
+ @controller.multipart_forms[:hire_form][:parts] = [:person_info, :job_info]
76
+ end
77
+
78
+ it "should respond to last_multipart_form_part?" do
79
+ @controller.should respond_to :last_multipart_form_part?
80
+ end
81
+
82
+ it "should return true if the parts match" do
83
+ @controller.last_multipart_form_part?(:hire_form, :job_info).should be_true
84
+ end
85
+
86
+ it "should return false if the parts don't match" do
87
+ @controller.last_multipart_form_part?(:hire_form, :person_info).should be_false
88
+ end
89
+ end
90
+
91
+ describe "first_multipart_form_part? method" do
92
+ before(:each) do
93
+ @controller = PeopleController.new
94
+ @controller.multipart_forms[:hire_form][:parts] = [:person_info, :job_info]
95
+ end
96
+
97
+ it "should respond to first_multipart_form_part?" do
98
+ @controller.should respond_to :first_multipart_form_part?
99
+ end
100
+
101
+ it "should return true if the parts match" do
102
+ @controller.first_multipart_form_part?(:hire_form, :person_info).should be_true
103
+ end
104
+
105
+ it "should return false if the parts don't match" do
106
+ @controller.first_multipart_form_part?(:hire_form, :job_info).should be_false
107
+ end
108
+ end
109
+
110
+ describe "multipart_form_action? method" do
111
+ before(:each) do
112
+ @controller = PeopleController.new
113
+ end
114
+
115
+ it "should respond_to multipart_form_action?" do
116
+ @controller.respond_to?(:multipart_form_action?).should be_true
117
+ end
118
+
119
+ it "should be true if the key is included" do
120
+ @controller.multipart_forms.stub!(:keys).and_return([:hire_form])
121
+ @controller.multipart_form_action?(:hire_form).should be_true
122
+ end
123
+
124
+ it "should be false if the key is not included" do
125
+ @controller.multipart_forms.stub!(:keys).and_return([:some_other_form])
126
+ @controller.multipart_form_action?(:hire_form).should be_false
127
+ end
128
+ end
129
+
130
+ describe "load_multipart_form_index_links method" do
131
+ before(:each) do
132
+ @controller = PeopleController.new
133
+ @form_name = :hire_form
134
+ @person = mock_model(Person)
135
+ @person.stub!(:id).and_return(34)
136
+ @form_subjects = [@person]
137
+ @ipf = mock_model(MultipartForm::InProgressForm)
138
+ @ipf.stub!(:last_completed_step)
139
+ @ipf.stub!(:completed).and_return(true)
140
+ @controller.stub!(:find_or_create_multipart_in_progress_form).and_return(@ipf)
141
+ end
142
+
143
+ it "should call find_or_create_multipart_in_progress_form" do
144
+ @controller.should_receive(:find_or_create_multipart_in_progress_form)
145
+ @controller.load_multipart_form_index_links(@form_name, @form_subjects)
146
+ end
147
+
148
+ it "should call get_available_multipart_form_parts" do
149
+ @controller.should_receive(:get_available_multipart_form_parts)
150
+ @controller.load_multipart_form_index_links(@form_name, @form_subjects)
151
+ end
152
+
153
+ it "should call completed for in_progress_form" do
154
+ @ipf.should_receive(:completed).and_return(true)
155
+ @controller.load_multipart_form_index_links(@form_name, @form_subjects)
156
+ end
157
+
158
+ it "should call last_completed_step for in_progress_form" do
159
+ @ipf.should_receive(:last_completed_step).and_return(:form_part)
160
+ @controller.load_multipart_form_index_links(@form_name, @form_subjects)
161
+ end
162
+ end
163
+
164
+ describe "multipart_form_handler method" do
165
+ before(:each) do
166
+ @controller = PeopleController.new
167
+ @default_params = {
168
+ :action => :hire_form,
169
+ :multipart_form_part => :person_info,
170
+ :in_progress_form_id => 100
171
+ }
172
+ @controller.stub!(:params).and_return(@default_params)
173
+ @controller.multipart_forms[:hire_form][:parts] = [:person_info, :person_info_update, :job_info, :job_info_update]
174
+ end
175
+
176
+ it "should respond to multipart_form_handler" do
177
+ @controller.should respond_to :multipart_form_handler
178
+ end
179
+
180
+ it "should call the multipart form part method" do
181
+ @controller.should_receive(:person_info)
182
+ @controller.multipart_form_handler
183
+ end
184
+
185
+ it "should not call the multipart form method if it is not a member of that form's parts" do
186
+ @controller.should_not_receive(:person_info)
187
+ @controller.multipart_forms[:hire_form][:parts] = [:job_info, :job_info_update]
188
+ @controller.multipart_form_handler
189
+ end
190
+
191
+ # this is not great
192
+ # should be refactored so it doesn't hit the database
193
+ it "should default to the last completed step of the in progress form is not set in params" do
194
+ ipf = MultipartForm::InProgressForm.new(:last_completed_step => "person_info_update")
195
+ ipf.save(:validate => false)
196
+ params = {
197
+ :action => :hire_form,
198
+ :in_progress_form_id => ipf.id
199
+ }
200
+ @controller.stub!(:params).and_return(params)
201
+ @controller.stub!(:find_or_create_multipart_form_subect)
202
+ @controller.stub!(:find_or_create_multipart_in_progress_form).and_return(ipf)
203
+ @controller.should_receive(:job_info)
204
+ @controller.multipart_form_handler
205
+ end
206
+
207
+ it "should default to the first part if no part is given and the in progress form does not have a completed part" do
208
+ params = {
209
+ :action => :hire_form,
210
+ :in_progress_form_id => 100
211
+ }
212
+ @controller.stub!(:params).and_return(params)
213
+ @controller.should_receive(:person_info)
214
+ @controller.multipart_form_handler
215
+ end
216
+
217
+ it "should maintain the completed part state in the database" do
218
+ params = {
219
+ :action => :hire_form,
220
+ :multipart_form_part => :person_info_update,
221
+ :in_progress_form_id => 100
222
+ }
223
+ @controller.stub!(:params).and_return(params)
224
+ ipf = MultipartForm::InProgressForm.new
225
+ @controller.stub!(:find_or_create_multipart_in_progress_form).and_return(ipf)
226
+ @controller.stub!(:person_info_update).and_return({:valid => true})
227
+ @controller.stub!(:redirect_to_next_multipart_form_part).and_return(false)
228
+ ipf.should_receive(:update_attributes).with(:completed => false, :last_completed_step => :person_info_update)
229
+
230
+ @controller.multipart_form_handler
231
+ end
232
+ end
233
+
234
+ describe "find_or_create_multipart_form_subject method" do
235
+ before(:each) do
236
+ @controller = PeopleController.new
237
+ @controller.multipart_forms[:hire_form][:model] = "Person"
238
+ end
239
+
240
+ it "should find the form subject on a valid id" do
241
+ Person.should_receive(:find)
242
+ @controller.find_or_create_multipart_form_subject(:hire_form, 1)
243
+ end
244
+
245
+ it "should create the form subject if there is no id given" do
246
+ p = mock_model(Person)
247
+ Person.should_receive(:new).and_return(p)
248
+ p.should_receive(:save).with(:validate => false)
249
+ @controller.find_or_create_multipart_form_subject(:hire_form, nil)
250
+ end
251
+
252
+ it "should return an error or nil if the id is invalid" do
253
+ Person.should_receive(:find).and_return(nil)
254
+ @controller.find_or_create_multipart_form_subject(:hire_form, 1).should be_nil
255
+ end
256
+ end
257
+
258
+ describe "find_or_create_multipart_in_progress_form method" do
259
+ before(:each) do
260
+ @controller = PeopleController.new
261
+ @form_subject = mock_model(Person)
262
+ @ipf = mock_model(MultipartForm::InProgressForm)
263
+ end
264
+
265
+ it "should find the in progress form if it exists" do
266
+ MultipartForm::InProgressForm.should_receive(:where).and_return([@ipf])
267
+ @controller.find_or_create_multipart_in_progress_form(:hire_form, @form_subject).should == @ipf
268
+ end
269
+
270
+ it "should create an in progress form if it doesn't exist" do
271
+ MultipartForm::InProgressForm.should_receive(:create).and_return(@ipf)
272
+ @controller.find_or_create_multipart_in_progress_form(:hire_form, @form_subject).should == @ipf
273
+ end
274
+
275
+ # maybe refactor so it doesn't hit the database
276
+ it "should create an in progress form with a last_completed_step initially set to 'none'" do
277
+ @controller.find_or_create_multipart_in_progress_form(:hire_form, @form_subject).last_completed_step.should == "none"
278
+ end
279
+ end
280
+
281
+ # marking these test pending for now becuase I don't know how to fix the issues with rspec and redirect_to
282
+ # they only break in rspec as far as I can tell
283
+ describe "redirect_to_next_multipart_form_part method" do
284
+ before(:each) do
285
+ @controller = PeopleController.new
286
+ @form_name = :hire_form
287
+ @form_subject = mock_model(Person)
288
+ @form_subject.stub!(:id).and_return(1)
289
+ @part = :person_info
290
+ end
291
+
292
+ it "should redirect to the view page if on the last step" do
293
+ pending
294
+ @controller.stub!(:last_multipart_form_part?).and_return(true)
295
+ @controller.redirect_to_next_multipart_form_part(@form_name, @form_subject, @part).should redirect_to("/people/1")
296
+ end
297
+
298
+ it "should return true if on the last step" do
299
+ pending
300
+ @controller.stub!(:last_multipart_form_part?).and_return(true)
301
+ @controller.redirect_to_next_multipart_form_part(@form_name, @form_subject, @part).should be_true
302
+ end
303
+
304
+ it "should redirect to the given route and path if not on the last step" do
305
+ pending
306
+ @controller.stub!(:last_multipart_form_part?).and_return(false)
307
+ @controller.redirect_to_next_multipart_form_part(@form_name, @form_subject, @part).should redirect_to("/people/hire_form/1/job_info")
308
+ end
309
+
310
+ it "should return false if not on the last step" do
311
+ @controller.stub!(:last_multipart_form_part?).and_return(false)
312
+ end
313
+ end
314
+
315
+ describe "get_available_multipart_form_parts method" do
316
+ before(:each) do
317
+ @controller = PeopleController.new
318
+ @form_name = :hire_form
319
+ @last_completed_part = :person_info_update
320
+ @controller.multipart_forms[@form_name][:parts] = [:person_info, :person_info_update, :job_info, :job_info_update]
321
+ end
322
+
323
+ it "should return a hash" do
324
+ ActsAsMultipartForm.config.stub!(:show_incomplete_parts).and_return(true)
325
+ @controller.get_available_multipart_form_parts(@form_name, @last_completed_part).should be_a_kind_of Array
326
+ end
327
+
328
+ it "should return the parts" do
329
+ ActsAsMultipartForm.config.stub!(:show_incomplete_parts).and_return(true)
330
+ results = @controller.get_available_multipart_form_parts(@form_name, @last_completed_part)
331
+ results[0][:name].should == :person_info
332
+ results[1][:name].should == :job_info
333
+ end
334
+
335
+ it "should not return the _update parts" do
336
+ ActsAsMultipartForm.config.stub!(:show_incomplete_parts).and_return(true)
337
+ results = @controller.get_available_multipart_form_parts(@form_name, @last_completed_part)
338
+ results.each do |result|
339
+ result[:name].should_not == :person_info_update
340
+ result[:name].should_not == :job_info_update
341
+ end
342
+ end
343
+
344
+ it "should not return future parts if the config is set to not show incomplete parts" do
345
+ ActsAsMultipartForm.config.stub!(:show_incomplete_parts).and_return(false)
346
+ results = @controller.get_available_multipart_form_parts(@form_name, @last_completed_part)
347
+ results[0][:name].should == :person_info
348
+ results.each do |result|
349
+ result[:name].should_not == :job_info
350
+ end
351
+ end
352
+
353
+ it "should return future parts if the config is set to show incomplete parts" do
354
+ ActsAsMultipartForm.config.stub!(:show_incomplete_parts).and_return(true)
355
+ results = @controller.get_available_multipart_form_parts(@form_name, @last_completed_part)
356
+ results[0][:name].should == :person_info
357
+ results[1][:name].should == :job_info
358
+ end
359
+ end
360
+ end