gimme_gimme 0.2.2

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 (33) hide show
  1. data/Gemfile +3 -0
  2. data/Gemfile.lock +143 -0
  3. data/README.md +37 -0
  4. data/Rakefile +10 -0
  5. data/features/run_features.feature +40 -0
  6. data/features/step_definitions/rails_steps.rb +62 -0
  7. data/features/support/env.rb +2 -0
  8. data/features/support/file_helpers.rb +11 -0
  9. data/lib/generators/gimme_gimme/base.rb +17 -0
  10. data/lib/generators/gimme_gimme/install/install_generator.rb +34 -0
  11. data/lib/generators/gimme_gimme/install/templates/controllers/credit_cards_controller.rb +3 -0
  12. data/lib/generators/gimme_gimme/install/templates/create_gimme_gimme_tables.rb +29 -0
  13. data/lib/generators/gimme_gimme/install/templates/models/credit_card.rb +3 -0
  14. data/lib/generators/gimme_gimme/test_support/templates/factories/factories.rb +10 -0
  15. data/lib/generators/gimme_gimme/test_support/templates/support/fake_cim.rb +9 -0
  16. data/lib/generators/gimme_gimme/test_support/templates/testing/fake_cim_gateway.rb +15 -0
  17. data/lib/generators/gimme_gimme/test_support/templates/testing/fake_cim_server.rb +329 -0
  18. data/lib/generators/gimme_gimme/test_support/templates/testing/fake_cim_spec_helpers.rb +21 -0
  19. data/lib/generators/gimme_gimme/test_support/test_support_generator.rb +23 -0
  20. data/lib/gimme_gimme.rb +7 -0
  21. data/lib/gimme_gimme/cim_gateway.rb +16 -0
  22. data/lib/gimme_gimme/credit_card.rb +125 -0
  23. data/lib/gimme_gimme/credit_cards_controller.rb +18 -0
  24. data/lib/gimme_gimme/engine.rb +7 -0
  25. data/lib/gimme_gimme/user.rb +43 -0
  26. data/lib/gimme_gimme/version.rb +3 -0
  27. data/spec/environment.rb +94 -0
  28. data/spec/factories/clearance.rb +8 -0
  29. data/spec/models/credit_card_spec.rb +219 -0
  30. data/spec/models/user_spec.rb +20 -0
  31. data/spec/spec_helper.rb +30 -0
  32. data/spec/testapp/config/routes.rb +4 -0
  33. metadata +226 -0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,143 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ gimme_gimme (0.2)
5
+ activemerchant
6
+ clearance
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ abstract (1.0.0)
12
+ actionmailer (3.0.3)
13
+ actionpack (= 3.0.3)
14
+ mail (~> 2.2.9)
15
+ actionpack (3.0.3)
16
+ activemodel (= 3.0.3)
17
+ activesupport (= 3.0.3)
18
+ builder (~> 2.1.2)
19
+ erubis (~> 2.6.6)
20
+ i18n (~> 0.4)
21
+ rack (~> 1.2.1)
22
+ rack-mount (~> 0.6.13)
23
+ rack-test (~> 0.5.6)
24
+ tzinfo (~> 0.3.23)
25
+ activemerchant (1.9.0)
26
+ activesupport (>= 2.3.2)
27
+ braintree (>= 2.0.0)
28
+ builder (>= 2.0.0)
29
+ activemodel (3.0.3)
30
+ activesupport (= 3.0.3)
31
+ builder (~> 2.1.2)
32
+ i18n (~> 0.4)
33
+ activerecord (3.0.3)
34
+ activemodel (= 3.0.3)
35
+ activesupport (= 3.0.3)
36
+ arel (~> 2.0.2)
37
+ tzinfo (~> 0.3.23)
38
+ activeresource (3.0.3)
39
+ activemodel (= 3.0.3)
40
+ activesupport (= 3.0.3)
41
+ activesupport (3.0.3)
42
+ arel (2.0.6)
43
+ aruba (0.2.7)
44
+ background_process
45
+ cucumber (~> 0.10.0)
46
+ background_process (1.2)
47
+ bourne (1.0)
48
+ mocha (= 0.9.8)
49
+ braintree (2.10.2)
50
+ builder (>= 2.0.0)
51
+ builder (2.1.2)
52
+ clearance (0.12.0)
53
+ diesel (~> 0.1.4)
54
+ rails (>= 3.0)
55
+ cucumber (0.10.0)
56
+ builder (>= 2.1.2)
57
+ diff-lcs (~> 1.1.2)
58
+ gherkin (~> 2.3.2)
59
+ json (~> 1.4.6)
60
+ term-ansicolor (~> 1.0.5)
61
+ daemons (1.1.0)
62
+ diesel (0.1.5)
63
+ railties
64
+ diff-lcs (1.1.2)
65
+ erubis (2.6.6)
66
+ abstract (>= 1.0.0)
67
+ eventmachine (0.12.10)
68
+ factory_girl (1.3.2)
69
+ gherkin (2.3.2)
70
+ json (~> 1.4.6)
71
+ term-ansicolor (~> 1.0.5)
72
+ i18n (0.5.0)
73
+ json (1.4.6)
74
+ mail (2.2.12)
75
+ activesupport (>= 2.3.6)
76
+ i18n (>= 0.4.0)
77
+ mime-types (~> 1.16)
78
+ treetop (~> 1.4.8)
79
+ mime-types (1.16)
80
+ mocha (0.9.8)
81
+ rake
82
+ nokogiri (1.4.4)
83
+ polyglot (0.3.1)
84
+ rack (1.2.1)
85
+ rack-mount (0.6.13)
86
+ rack (>= 1.0.0)
87
+ rack-test (0.5.6)
88
+ rack (>= 1.0)
89
+ rails (3.0.3)
90
+ actionmailer (= 3.0.3)
91
+ actionpack (= 3.0.3)
92
+ activerecord (= 3.0.3)
93
+ activeresource (= 3.0.3)
94
+ activesupport (= 3.0.3)
95
+ bundler (~> 1.0)
96
+ railties (= 3.0.3)
97
+ railties (3.0.3)
98
+ actionpack (= 3.0.3)
99
+ activesupport (= 3.0.3)
100
+ rake (>= 0.8.7)
101
+ thor (~> 0.14.4)
102
+ rake (0.8.7)
103
+ rspec (2.3.0)
104
+ rspec-core (~> 2.3.0)
105
+ rspec-expectations (~> 2.3.0)
106
+ rspec-mocks (~> 2.3.0)
107
+ rspec-core (2.3.1)
108
+ rspec-expectations (2.3.0)
109
+ diff-lcs (~> 1.1.2)
110
+ rspec-mocks (2.3.0)
111
+ rspec-rails (2.3.1)
112
+ actionpack (~> 3.0)
113
+ activesupport (~> 3.0)
114
+ railties (~> 3.0)
115
+ rspec (~> 2.3.0)
116
+ shoulda (2.11.3)
117
+ sqlite3-ruby (1.3.2)
118
+ term-ansicolor (1.0.5)
119
+ thin (1.2.7)
120
+ daemons (>= 1.0.9)
121
+ eventmachine (>= 0.12.6)
122
+ rack (>= 1.0.0)
123
+ thor (0.14.6)
124
+ treetop (1.4.9)
125
+ polyglot (>= 0.3.1)
126
+ tzinfo (0.3.23)
127
+
128
+ PLATFORMS
129
+ ruby
130
+
131
+ DEPENDENCIES
132
+ aruba
133
+ bourne
134
+ cucumber
135
+ factory_girl
136
+ gimme_gimme!
137
+ nokogiri
138
+ rails (>= 3.0.3)
139
+ rake
140
+ rspec-rails (>= 2.3.1)
141
+ shoulda
142
+ sqlite3-ruby
143
+ thin
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Gimme, Gimme!
2
+ gimme_gimme is a Rails engine for managing a User's credit cards. It can
3
+ authorize and charge cards through its Authorize.net gateway.
4
+
5
+ ## Usage
6
+ Important: gimme_gimme assumes that you are using Clearance. If you're not,
7
+ things will probably break.
8
+
9
+ gimme_gimme ships with generators:
10
+
11
+ rails generate gimme_gimme:install
12
+
13
+ This will create a DB migration and include the GimmeGimme::User module into
14
+ the User model.
15
+
16
+ To copy fake server and spec helper files to your
17
+ application, run:
18
+
19
+ rails generate gimme_gimme:test_support
20
+
21
+
22
+ gimme_gimme uses Authorize.net for its CIM (customer information management)
23
+ gateway. To set it up, create config/authorize_net.yml with the following
24
+ info:
25
+
26
+
27
+ test:
28
+ authorize_net_api_login_id: <Fill in login id>
29
+ authorize_net_transaction_key: <Fill in transaction key>
30
+ gateway_mode: 'test'
31
+ <rails_env>:
32
+ authorize_net_api_login_id: <Fill in login id>
33
+ authorize_net_transaction_key: <Fill in transaction key>
34
+ gateway_mode: <Choose a gateway mode>
35
+
36
+ gimme_gimme will use Rails.env to determine which entry in the YAML file to
37
+ use.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'cucumber/rake/task'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+ Cucumber::Rake::Task.new(:cucumber)
8
+
9
+ desc "Run specs and cucumber features"
10
+ task :default => [:spec, :cucumber]
@@ -0,0 +1,40 @@
1
+ @puts @announce @disable-bundler
2
+ Feature: Generators
3
+
4
+ Scenario: Successfully generate a gimme_gimme'd application
5
+ Given I successfully run "bundle exec rails new testapp"
6
+ And I cd to "testapp"
7
+ And I append to "Gemfile" with:
8
+ """
9
+ gem "clearance"
10
+ gem "cucumber-rails"
11
+ gem "capybara"
12
+ gem "factory_girl_rails"
13
+ gem "dynamic_form"
14
+ gem "database_cleaner"
15
+ gem "formtastic"
16
+ gem "rspec-rails", :require => false
17
+ gem "database_cleaner"
18
+ gem "formtastic"
19
+ gem "rspec-rails", :require => false
20
+ """
21
+ When I bootstrap the application for clearance
22
+ And I add the "gimme_gimme" gem from this project as a dependency
23
+ And I successfully run "bundle install"
24
+ And I successfully run "rails generate gimme_gimme:install"
25
+ And I successfully run "rails generate gimme_gimme:test_support"
26
+ And a file named "testapp/config/initializers/authorize_net.yml" with:
27
+ """
28
+ test:
29
+ authorize_net_api_login_id: 'fake login id'
30
+ authorize_net_transaction_key: 'fake transaction key'
31
+ gateway_mode: 'test'
32
+ """
33
+ And I successfully run "rake db:migrate"
34
+ When I run "rake"
35
+ Then it should pass with:
36
+ """
37
+ passed
38
+ """
39
+ Then the output should not contain "failed"
40
+ And the output should not contain "Could not find generator"
@@ -0,0 +1,62 @@
1
+ When /^I add the "([^"]*)" gem from this project as a dependency$/ do |gem_name|
2
+ append_to_file('Gemfile', %{\ngem "#{gem_name}", :path => "#{PROJECT_ROOT}"})
3
+ end
4
+
5
+ When /^I bootstrap the application for clearance$/ do
6
+ steps %{
7
+ When I remove the file "public/index.html"
8
+ And I successfully run "rails generate cucumber:install"
9
+ And I successfully run "rails generate clearance:install"
10
+ And I successfully run "rails generate clearance:features"
11
+ And I configure ActionMailer to use "localhost" as a host
12
+ And I add flash messages to the layout
13
+ And I add session links to the layout
14
+ And I configure "clearance/sessions#new" as the root route
15
+ And I disable Capybara Javascript emulation
16
+ }
17
+ end
18
+
19
+ When /^I configure ActionMailer to use "([^"]+)" as a host$/ do |host|
20
+ mailer_config = "config.action_mailer.default_url_options = { :host => '#{host}' }"
21
+ replace_in_file "config/application.rb",
22
+ /(class .* < Rails::Application)/,
23
+ "\\1\n#{mailer_config}"
24
+ end
25
+
26
+ When /^I add flash messages to the layout$/ do
27
+ flashes = %{
28
+ <% flash.each do |key, value| -%>
29
+ <%= value %>
30
+ <% end -%>
31
+ }
32
+
33
+ replace_in_file "app/views/layouts/application.html.erb",
34
+ /(<body>)/,
35
+ "\\1\n#{flashes}"
36
+ end
37
+
38
+ When /^I add session links to the layout$/ do
39
+ links = %{
40
+ <% if signed_in? -%>
41
+ <%= link_to 'Sign out', sign_out_path, :method => :delete %>
42
+ <% else -%>
43
+ <%= link_to 'Sign in', sign_in_path %>
44
+ <% end -%>
45
+ }
46
+
47
+ replace_in_file "app/views/layouts/application.html.erb",
48
+ /(<body>)/,
49
+ "\\1\n#{links}"
50
+ end
51
+
52
+ When /^I configure "([^"]*)" as the root route$/ do |action|
53
+ replace_in_file "config/routes.rb",
54
+ /(routes\.draw do)/,
55
+ "\\1\nroot :to => '#{action}'"
56
+ end
57
+
58
+ When /^I disable Capybara Javascript emulation$/ do
59
+ replace_in_file "features/support/env.rb",
60
+ %{require 'cucumber/rails/capybara_javascript_emulation'},
61
+ "# Disabled"
62
+ end
@@ -0,0 +1,2 @@
1
+ require 'aruba/cucumber'
2
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), "..", "..")).freeze
@@ -0,0 +1,11 @@
1
+ module FileHelpers
2
+ def replace_in_file(path, find, replace)
3
+ in_current_dir do
4
+ contents = IO.read(path)
5
+ contents.sub!(find, replace)
6
+ File.open(path, "w") { |file| file.write(contents) }
7
+ end
8
+ end
9
+ end
10
+
11
+ World(FileHelpers)
@@ -0,0 +1,17 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/base'
3
+
4
+ module GimmeGimme
5
+ module Generators
6
+ # Base generator for GimmeGimme generators. Setups up the source root.
7
+ class Base < ::Rails::Generators::Base
8
+ # @return [String] source root for tempates within a gimme_gimme generator
9
+ def self.source_root
10
+ @_gimme_gimme_source_root ||=
11
+ File.expand_path(File.join(File.dirname(__FILE__),
12
+ generator_name,
13
+ 'templates'))
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ require 'generators/gimme_gimme/base'
2
+ require 'rails/generators/active_record/migration'
3
+
4
+ module GimmeGimme
5
+ module Generators
6
+ class InstallGenerator < Base
7
+ include Rails::Generators::Migration
8
+ extend ActiveRecord::Generators::Migration
9
+
10
+ desc <<DESC
11
+ Description:
12
+ Copy gimme_gimme files to your application.
13
+ DESC
14
+
15
+ def generate_migration
16
+ migration_template "create_gimme_gimme_tables.rb", "db/migrate/create_gimme_gimme_tables.rb"
17
+ end
18
+
19
+ def create_models
20
+ directory "models", "app/models"
21
+ end
22
+
23
+ def create_controllers
24
+ directory "controllers", "app/controllers"
25
+ end
26
+
27
+ def update_user_model
28
+ insert_into_file "app/models/user.rb",
29
+ "\ninclude GimmeGimme::User",
30
+ :after => "include Clearance::User"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ class CreditCardsController < ApplicationController
2
+ include GimmeGimme::CreditCardsController
3
+ end
@@ -0,0 +1,29 @@
1
+ class CreateGimmeGimmeTables < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :credit_cards do |t|
4
+ t.integer :user_id, :null => false
5
+ t.string :first_name, :null => false
6
+ t.string :last_name, :null => false
7
+ t.string :remote_customer_payment_profile_id, :null => false
8
+ t.integer :expiration_month, :null => false
9
+ t.integer :expiration_year, :null => false
10
+ t.string :last_four_digits, :limit => 4
11
+ t.string :card_type, :null => false
12
+
13
+ t.timestamps
14
+ end
15
+
16
+ change_table :users do |t|
17
+ t.string :remote_customer_profile_id
18
+ t.string :customer_key
19
+ end
20
+ end
21
+
22
+ def self.down
23
+ remove_table :credit_cards
24
+ change_table :users do |t|
25
+ t.remove :remote_customer_profile_id
26
+ t.remove :customer_key
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ class CreditCard < ActiveRecord::Base
2
+ include GimmeGimme::CreditCard
3
+ end
@@ -0,0 +1,10 @@
1
+ Factory.define :credit_card do |credit_card|
2
+ credit_card.association(:user)
3
+ credit_card.card_number { '4111111111111111' }
4
+ credit_card.first_name { 'Joe' }
5
+ credit_card.last_name { 'Shmoe' }
6
+ credit_card.expiration_month { '01' }
7
+ credit_card.expiration_year { '2015' }
8
+ credit_card.security_code { '123' }
9
+ credit_card.card_type { 'Visa' }
10
+ end
@@ -0,0 +1,9 @@
1
+ require Rails.root.join('lib/gimme_gimme/testing/fake_cim_server')
2
+ require Rails.root.join('lib/gimme_gimme/testing/fake_cim_gateway')
3
+
4
+ $fake_cim_server = GimmeGimme::FakeCimServer.new
5
+
6
+ Before do
7
+ $fake_cim_server.reset
8
+ ::GimmeGimme::CimGateway.instance.gateway = GimmeGimme::FakeCimGateway.new(:server => $fake_cim_server)
9
+ end
@@ -0,0 +1,15 @@
1
+ module GimmeGimme
2
+ class FakeCimGateway < ActiveMerchant::Billing::AuthorizeNetCimGateway
3
+ def initialize(options = {})
4
+ @options = options.update(:login => 'fakelogin', :password => 'fakepassword')
5
+ end
6
+
7
+ def ssl_request(method, url, data, headers = {})
8
+ options[:server].request(method, url, data, headers)
9
+ end
10
+
11
+ def server
12
+ options[:server]
13
+ end
14
+ end
15
+ end