alfred_rails 0.0.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +20 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +209 -0
  7. data/Rakefile +5 -0
  8. data/alfred_rails.gemspec +45 -0
  9. data/app/assets/javascripts/alfred/sinon_adapter.js.coffee +35 -0
  10. data/app/assets/javascripts/alfred.js.coffee +61 -0
  11. data/bin/alfred +6 -0
  12. data/lib/alfred_rails/command_line.rb +62 -0
  13. data/lib/alfred_rails/configuration.rb +157 -0
  14. data/lib/alfred_rails/definition.rb +129 -0
  15. data/lib/alfred_rails/fixture_file.rb +70 -0
  16. data/lib/alfred_rails/mock.rb +14 -0
  17. data/lib/alfred_rails/rails.rb +14 -0
  18. data/lib/alfred_rails/registry.rb +84 -0
  19. data/lib/alfred_rails/request.rb +38 -0
  20. data/lib/alfred_rails/runner.rb +116 -0
  21. data/lib/alfred_rails/scenario.rb +99 -0
  22. data/lib/alfred_rails/scenario_dsl.rb +83 -0
  23. data/lib/alfred_rails/ui.rb +90 -0
  24. data/lib/alfred_rails/version.rb +3 -0
  25. data/lib/alfred_rails.rb +99 -0
  26. data/lib/generators/alfred/controller/controller_generator.rb +24 -0
  27. data/lib/generators/alfred/controller/templates/alfred.erb +7 -0
  28. data/lib/generators/alfred/install/install_generator.rb +85 -0
  29. data/lib/generators/alfred/install/templates/alfred_helper.erb +23 -0
  30. data/lib/tasks/alfred.rake +6 -0
  31. data/spec/command_line_spec.rb +64 -0
  32. data/spec/configuration_spec.rb +86 -0
  33. data/spec/definition_spec.rb +135 -0
  34. data/spec/fixture_file_spec.rb +60 -0
  35. data/spec/fixtures/database.yml +4 -0
  36. data/spec/generators/controller/controller_generator_spec.rb +23 -0
  37. data/spec/generators/install/install_generator_spec.rb +56 -0
  38. data/spec/javascripts/alfred/sinon_adapter_spec.js.coffee +33 -0
  39. data/spec/javascripts/alfred_spec.js.coffee +46 -0
  40. data/spec/javascripts/spec_helper.coffee +5 -0
  41. data/spec/mock_spec.rb +18 -0
  42. data/spec/registry_spec.rb +78 -0
  43. data/spec/request_spec.rb +32 -0
  44. data/spec/runner_spec.rb +179 -0
  45. data/spec/scenario_dsl_spec.rb +62 -0
  46. data/spec/scenario_spec.rb +24 -0
  47. data/spec/spec_helper.rb +24 -0
  48. data/spec/support/application.rb +21 -0
  49. data/spec/support/controllers/api/v1/posts_controller.rb +14 -0
  50. data/spec/support/controllers/api/v1/users_controller.rb +14 -0
  51. data/spec/support/lib/response_proxy.rb +11 -0
  52. data/spec/support/models/post.rb +1 -0
  53. data/spec/support/models/user.rb +1 -0
  54. data/spec/support/rails.rb +14 -0
  55. data/spec/support/routes.rb +9 -0
  56. data/spec/support/schema.rb +16 -0
  57. data/spec/teaspoon_env.rb +14 -0
  58. data/spec/ui_spec.rb +72 -0
  59. metadata +316 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5aa092990a0c15473f2de135190053a555556beb
4
+ data.tar.gz: 4c733b4d2437fc8bcb064be5f7b6e0c45e4a8652
5
+ SHA512:
6
+ metadata.gz: 287ec639bca0ca48c0bf5f0690848f8888b271850856f86f6ad2c207a593925c966b16b515bbab5f481256d65a1e5cb807cf0252f292ee151020474485456309
7
+ data.tar.gz: a92f6780d2ee432c6ec1bf77c44d3db50ed9bf4b0caa89afed01e76f9cb7706231435fa3a4462cc5b4ac5e1fb93e4bdbdcb4c9cce7fa4d742f9889017b0f5041
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .DS_Store
7
+ database.sqlite
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,20 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.1
6
+ - ruby-head
7
+
8
+ env:
9
+ - "RAILS_VERSION=3.1.0"
10
+ - "RAILS_VERSION=3.2.0"
11
+ - "RAILS_VERSION=4.0.0"
12
+ - "RAILS_VERSION=4.1.0"
13
+ - "RAILS_VERSION=master"
14
+
15
+ matrix:
16
+ allow_failures:
17
+ - env: "RAILS_VERSION=master"
18
+ - rvm: ruby-head
19
+
20
+ script: "bundle exec teaspoon && rake"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in alfred_rails.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Johan van Zonneveld
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,209 @@
1
+ ## Alfred Rails
2
+
3
+ [![Gem Version](http://img.shields.io/gem/v/alfred_rails.svg)][gem]
4
+ [![Build Status](http://img.shields.io/travis/jhnvz/alfred_rails.svg)][travis]
5
+ [![Coverage Status](http://img.shields.io/coveralls/jhnvz/alfred_rails.svg)][coveralls]
6
+ [![Code Climate](http://img.shields.io/codeclimate/github/jhnvz/alfred_rails.svg)][codeclimate]
7
+ [![Dependency Status](http://img.shields.io/gemnasium/jhnvz/alfred_rails.svg)][gemnasium]
8
+
9
+ [gem]: https://rubygems.org/gems/alfred_rails
10
+ [travis]: http://travis-ci.org/jhnvz/alfred_rails
11
+ [coveralls]: https://coveralls.io/r/jhnvz/alfred_rails
12
+ [codeclimate]: https://codeclimate.com/github/jhnvz/alfred_rails
13
+ [gemnasium]: https://gemnasium.com/jhnvz/alfred_rails
14
+
15
+ Serves controller action responses under several conditions.
16
+
17
+ How it works
18
+ ------------
19
+
20
+ Alfred creates fixture files of your controller responses so you can use them in your tests. Ideal if your app's client is build with a javascript framework and you want to test responses under several conditions.
21
+
22
+ Resources
23
+ ------------
24
+
25
+ - [Installation](#installation)
26
+ - [Defining scenario's](#defining-scenarios)
27
+ - [Configuration](#configuration)
28
+ - [Javascript testing](#javascript-testing)
29
+ - [Guard](#guard)
30
+
31
+ Installation
32
+ ------------
33
+
34
+ 1. Add `gem 'alfred_rails'` to your Gemfile (inside test group).
35
+ 2. Run `bundle install`.
36
+ 3. Run `rails g alfred:install`.
37
+
38
+ Defining scenario's
39
+ ------------
40
+
41
+ You can create empty definitions by running:
42
+ ```
43
+ $ rails g alfred:controller api/v1/posts
44
+ ```
45
+
46
+ Here's an example of a definition:
47
+ ```ruby
48
+ # spec/alfreds/api/v1/posts_controller.rb
49
+
50
+ Alfred.define do
51
+ setup do
52
+ sign_in :user, create(:user)
53
+ end
54
+
55
+ controller Api::V1::PostsController do
56
+ scenario 'update post by manager' do
57
+ setup do
58
+ create(:post, :title => 'Alfred is awesome', :body => 'It saves me time')
59
+ end
60
+
61
+ patch :update, {
62
+ :format => :json,
63
+ :id => 1,
64
+ :post => {
65
+ :title => 'Alfred rocks!'
66
+ }
67
+ }
68
+ end
69
+ end
70
+
71
+ scenario 'update post by manager' do
72
+ controller Api::V1::PostsController
73
+ end
74
+ end
75
+ ```
76
+
77
+ This will create a fixture file which you can use in your javascript tests at:
78
+ ```
79
+ spec/javascripts/fixtures/api/v1/posts/update/update_by_manager.js
80
+ ```
81
+
82
+ Configuration
83
+ ------------
84
+
85
+ ```ruby
86
+ # spec/alfred_helper.rb
87
+
88
+ Alfred.configure do |config|
89
+ ## Includes
90
+ config.include FactoryGirl::Syntax::Methods
91
+ config.include Devise::TestHelpers
92
+
93
+ ## Setup
94
+ config.setup do
95
+ Apartment::Database.stub(:create).and_return(true)
96
+ end
97
+
98
+ ## Mocking framework
99
+ config.mock_with :rspec
100
+
101
+ ## Fixture path
102
+ config.fixture_path 'spec/javascripts/fixtures'
103
+ end
104
+ ```
105
+
106
+ Configuration instructions
107
+
108
+ Javascript testing
109
+ ------------
110
+
111
+ After defining and generating Alfred fixtures they are accessible in your JavaScript tests.
112
+
113
+ ```coffeescript
114
+ # Get request response
115
+ Alfred.serve('posts_controller/update', 'update post by manager')
116
+
117
+ # Example of a test
118
+ describe 'PostModel', ->
119
+
120
+ describe '#update', ->
121
+
122
+ it 'should update model', ->
123
+ response = Alfred.serve('posts_controller/update', 'update post by manager')
124
+ @server = sinon.fakeServer.create()
125
+
126
+ @server.respondWith 'PATCH', 'posts/1', [200, { 'Content-Type': 'application/json' }, response]
127
+
128
+ @post.update()
129
+ @server.respond()
130
+
131
+ @post.updated().should.equal(true)
132
+ ```
133
+
134
+ Implementation on this differs on which libraries you are using to test with. In the above example we're using SinonJS to create a fake server response.
135
+
136
+ ### SinonJS adapter
137
+
138
+ ```coffeescript
139
+ # Creates fake server and calls respondWith
140
+ Alfred.SinonAdapter.serve('posts_controller/update', 'update post by manager')
141
+
142
+ # Example of a test
143
+ describe 'PostModel', ->
144
+
145
+ describe '#update', ->
146
+
147
+ it 'should update model', ->
148
+ @server = Alfred.SinonAdapter.serve('posts_controller/update', 'update post by manager')
149
+
150
+ @post.update()
151
+ @server.respond()
152
+
153
+ @post.updated().should.equal(true)
154
+ ```
155
+
156
+ ### Using any other test adapter
157
+
158
+ By calling `Alfred.fetch` you can fetch a scenario object with meta data, such as path, request method etc. This can be useful when stubbing a request;
159
+
160
+ ```coffeescript
161
+ Alfred.fetch('posts/update', 'update post by manager') # => Object
162
+ ```
163
+
164
+ Guard
165
+ ------------
166
+
167
+ Add the gem to your Gemfile (inside development group):
168
+ ``` ruby
169
+ gem 'guard-alfred', :require => false
170
+ ```
171
+
172
+ Add guard definition to your Guardfile by running this command:
173
+ ```
174
+ $ guard init alfred
175
+ ```
176
+
177
+ Make sure to put this block on top of your Guardfile so all fixtures are created before running tests.
178
+ ```ruby
179
+ guard :alfred do
180
+ watch(%r{^app/controllers/(.+)\.rb$}) { |m| "spec/alfreds/#{m[1]}.rb" }
181
+ watch(%r{^spec/alfreds/(.+)\.rb$}) { |m| "spec/alfreds/#{m[1]}.rb" }
182
+ end
183
+ ```
184
+ Please read [Guard usage doc](https://github.com/guard/guard#readme) for usage instructions.
185
+
186
+ Supported Ruby Versions
187
+ ------------
188
+
189
+ This library is tested against Travis and aims to support the following Ruby
190
+ implementations:
191
+
192
+ * Ruby 1.9.3
193
+ * Ruby 2.0.0
194
+ * Ruby 2.1.1
195
+
196
+ Contributing
197
+ ------------
198
+
199
+ 1. Fork it
200
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
201
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
202
+ 4. Push to the branch (`git push origin my-new-feature`)
203
+ 5. Create new Pull Request
204
+
205
+ Copyright
206
+ ------------
207
+
208
+ Copyright (c) 2014 Johan van Zonneveld. See LICENSE for details.
209
+
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
@@ -0,0 +1,45 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'alfred_rails/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "alfred_rails"
8
+ gem.version = Alfred::VERSION
9
+ gem.authors = ['Johan van Zonneveld', 'Arjen Oosterkamp']
10
+ gem.email = ['johan@vzonneveld.nl', 'mail@arjen.me']
11
+ gem.homepage = 'https://github.com/jhnvz/alfred_rails.git'
12
+ gem.summary = %q{Serves controller responses under several conditions.}
13
+ gem.description = %q{Alfred creates fixture files of your controller responses so you can use them in your tests. Ideal if your app's client is build with a javascript framework and you want to test responses under several conditions.}
14
+ gem.license = 'MIT'
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = ["alfred"]
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ['lib']
20
+
21
+ gem.add_development_dependency 'bundler', '>= 1.0.0'
22
+ gem.add_development_dependency 'rake'
23
+ gem.add_development_dependency 'coveralls'
24
+ gem.add_development_dependency 'rspec', '>= 2.3'
25
+ gem.add_development_dependency 'rspec-rails', '~> 2.0'
26
+ gem.add_development_dependency 'batman-rails'
27
+ gem.add_development_dependency 'sqlite3'
28
+
29
+ gem.add_development_dependency 'teaspoon'
30
+ gem.add_development_dependency 'coffee-script'
31
+
32
+ gem.add_dependency 'database_cleaner'
33
+ gem.add_dependency 'ruby-progressbar'
34
+ gem.add_dependency 'ammeter'
35
+
36
+ if RUBY_VERSION > '1.9.2'
37
+ gem.add_dependency 'rails', '>= 3.2.0'
38
+ else
39
+ gem.add_dependency 'rails', '>= 3.2.0', '< 4.0.0'
40
+ end
41
+
42
+ if File.exists?('UPGRADING')
43
+ gem.post_install_message = File.read("UPGRADING")
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ class Alfred.SinonAdapter
2
+
3
+ ###*
4
+ * Serves an Alfred response server.
5
+ * @action {String} Controller and action
6
+ * @name {String} Name of the scenario
7
+ *
8
+ * @example
9
+ * server = Alfred.SinonAdapter.serve('sessions/current', 'default')
10
+ * server.respond()
11
+ *
12
+ * @returns
13
+ * {Object} Sinon FakeServer
14
+ *
15
+ ###
16
+ @serve: (action, name, path) ->
17
+ scenario = Alfred.fetch(action, name)
18
+ meta = scenario.meta
19
+ path ||= @_path(meta.path)
20
+
21
+ server = sinon.fakeServer.create()
22
+ server.respondWith meta.method, path, [meta.status, { 'Content-Type': meta.type }, scenario.response]
23
+
24
+ server
25
+
26
+ ###*
27
+ * Makes sure the path is correct, without starting slash
28
+ * @path {String} Path to correct
29
+ *
30
+ ###
31
+ @_path: (path) ->
32
+ if path[0] == '/'
33
+ path.slice(1, path.length)
34
+ else
35
+ path
@@ -0,0 +1,61 @@
1
+ class @Alfred
2
+
3
+ @scenarios: {}
4
+
5
+ ###*
6
+ * Fetches an Alfred response.
7
+ * @action {String} Controller and action
8
+ * @name {String} Name of the scenario
9
+ *
10
+ * @example
11
+ * Alfred.fetch('sessions/current', 'default')
12
+ *
13
+ * @returns
14
+ * {Object} Scenario object
15
+ *
16
+ ###
17
+ @fetch: (action, name) ->
18
+ @scenarios[action]?[@_name(name)]
19
+
20
+ ###*
21
+ * Serves an Alfred response.
22
+ * @action {String} Controller and action
23
+ * @name {String} Name of the scenario
24
+ *
25
+ * @example
26
+ * Alfred.serve('sessions/current', 'default')
27
+ *
28
+ * @returns
29
+ * {String} Scenario response string
30
+ *
31
+ ###
32
+ @serve: (action, name) ->
33
+ @fetch(action, name)?.response
34
+
35
+ ###*
36
+ * Registers an Alfred response.
37
+ * @action {String} Controller and action
38
+ * @name {String} Name of the scenario
39
+ * @meta {Object} Meta data of the response
40
+ * @response {String} Scenario response
41
+ *
42
+ * @example
43
+ * Alfred.register({
44
+ * action: 'sessions/current',
45
+ * name: 'default',
46
+ * meta: { path: 'api/1/sessions', method: 'GET' },
47
+ * response: @response
48
+ * })
49
+ *
50
+ ###
51
+ @register: (object) ->
52
+ @scenarios[object.action] ||= {}
53
+ @scenarios[object.action][object.name] = {
54
+ name: object.name
55
+ action: object.action
56
+ meta: object.meta
57
+ response: object.response
58
+ }
59
+
60
+ @_name: (name) ->
61
+ name.replace(/\s+/g, '_').toLowerCase()
data/bin/alfred ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ root = File.expand_path('../../lib', __FILE__)
3
+ $:.unshift(root) unless $:.include?(root)
4
+
5
+ require "alfred_rails/command_line"
6
+ Alfred::CommandLine.new
@@ -0,0 +1,62 @@
1
+ ENV["RAILS_ENV"] ||= 'test'
2
+
3
+ require "optparse"
4
+
5
+ module Alfred
6
+ class CommandLine
7
+
8
+ def initialize
9
+ @options = {}
10
+ @options[:files] = parse_options
11
+
12
+ load_rails!
13
+
14
+ require 'alfred_rails'
15
+ ::Alfred.load!
16
+
17
+ ::Alfred::Runner.new(@options[:files])
18
+ end
19
+
20
+ ##
21
+ # Add abort method in case input is aborted.
22
+ #
23
+ # :nocov:
24
+ def abort(message = nil)
25
+ STDOUT.print(message) if message
26
+ exit(1)
27
+ end
28
+ # :nocov:
29
+
30
+ private
31
+
32
+ ##
33
+ # Parses the options and returns the files if present.
34
+ #
35
+ # === Returns
36
+ #
37
+ # [files (Array)] the files to run
38
+ #
39
+ def parse_options
40
+ options = {}
41
+ OptionParser.new do |options|
42
+ options.banner = "Usage: alfred [options] [files]\n"
43
+
44
+ options.on "-v", "--version", "Display the version.", proc {
45
+ STDOUT.print("#{Alfred::VERSION}\n")
46
+ exit
47
+ }
48
+ end.parse!
49
+ end
50
+
51
+ ##
52
+ # Load Rails environment and Alfred.
53
+ #
54
+ # :nocov:
55
+ def load_rails!
56
+ load 'config/application.rb'
57
+ ::Rails.application.initialize!
58
+ end
59
+ # :nocov:
60
+
61
+ end # CommandLine
62
+ end # Alfred
@@ -0,0 +1,157 @@
1
+ module Alfred
2
+ class Configuration
3
+
4
+ attr_accessor :config
5
+
6
+ def initialize
7
+ @config = {
8
+ :includes => [],
9
+ :setup => []
10
+ }
11
+
12
+ load_defaults!
13
+ end
14
+
15
+ ##
16
+ # Set or get setup for each scenario.
17
+ #
18
+ # === Params
19
+ #
20
+ # [block (Block)] the block to perform
21
+ #
22
+ # === Example
23
+ #
24
+ # setup
25
+ # User.create(:name => 'John Doe')
26
+ # end
27
+ #
28
+ # setup #=> [Proc]
29
+ #
30
+ # === Returns
31
+ #
32
+ # [setup (Array)] array with blocks
33
+ #
34
+ def setup(&block)
35
+ return @config[:setup] unless block_given?
36
+ @config[:setup] << block
37
+ end
38
+
39
+ ##
40
+ # Include modules.
41
+ #
42
+ # === Params
43
+ #
44
+ # [mod (Module)] the module to include
45
+ #
46
+ # === Example
47
+ #
48
+ # include Devise::TestHelpers
49
+ #
50
+ def include(mod)
51
+ @config[:includes] << mod
52
+ end
53
+
54
+ ##
55
+ # Returns array of the modules to include.
56
+ #
57
+ # === Returns
58
+ #
59
+ # [modules (Array)] the modules to include
60
+ #
61
+ def includes
62
+ @config[:includes]
63
+ end
64
+
65
+ ##
66
+ # Set or get the fixture path.
67
+ #
68
+ # === Params
69
+ #
70
+ # [path (String)] the path to set
71
+ #
72
+ # === Examples
73
+ #
74
+ # fixture_path('spec/javascript/fixtures')
75
+ # fixture_path #=> 'spec/javascript/fixtures'
76
+ #
77
+ # === Returns
78
+ #
79
+ # [path (String)] the fixture path
80
+ #
81
+ def fixture_path(path=nil)
82
+ return config[:fixture_path] if path.nil?
83
+ config[:fixture_path] = "#{::Rails.root}/#{path}"
84
+ end
85
+
86
+ ##
87
+ # Set or get the test path.
88
+ #
89
+ # === Params
90
+ #
91
+ # [path (String)] the path to set
92
+ #
93
+ # === Examples
94
+ #
95
+ # test_path('spec')
96
+ # test_path #=> 'spec'
97
+ #
98
+ # === Returns
99
+ #
100
+ # [path (String)] the fixture path
101
+ #
102
+ def test_path(path=nil)
103
+ return config[:test_path] if path.nil?
104
+ config[:test_path] = path
105
+ end
106
+
107
+ ##
108
+ # Set or get the mocking framework.
109
+ #
110
+ # === Params
111
+ #
112
+ # [framework (Symbol)] the mocking framework
113
+ #
114
+ # === Examples
115
+ #
116
+ # mock_with :rspec
117
+ # mock_with #=> :rspec
118
+ #
119
+ # === Returns
120
+ #
121
+ # [framework (Symbol)] mocking framework
122
+ #
123
+ def mock_with(framework=nil)
124
+ return config[:mock_with] if framework.nil?
125
+ config[:mock_with] = framework
126
+ end
127
+
128
+ private
129
+
130
+ ##
131
+ # Wheter rspec is defined.
132
+ #
133
+ def rspec_defined?
134
+ defined?(RSpec)
135
+ end
136
+
137
+ ##
138
+ # Loads defaults based on defined constants.
139
+ # It guesses fixture_path and mocking framework.
140
+ #
141
+ def load_defaults!
142
+ ## Guess test path
143
+ @config[:test_path] = rspec_defined? ? "spec" : "test"
144
+
145
+ ## Guess fixture_path
146
+ @config[:fixture_path] = "#{::Rails.root}/#{test_path}/javascripts/fixtures"
147
+
148
+ ## Guess mocking framework
149
+ @config[:mock_with] = if rspec_defined?
150
+ :rspec
151
+ else
152
+ :test_unit
153
+ end
154
+ end
155
+
156
+ end # Configuration
157
+ end # Alfred