From 45d51e7fb4e3966754fae748797af6f813dc5da8 Mon Sep 17 00:00:00 2001 From: amartincaro Date: Tue, 5 Nov 2013 19:31:40 +0100 Subject: [PATCH 1/4] We will use fabrication as object factory. New user fabricator. --- Gemfile | 2 ++ Gemfile.lock | 5 +++++ spec/fabricators/user_fabricator.rb | 16 ++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 spec/fabricators/user_fabricator.rb diff --git a/Gemfile b/Gemfile index c8a0ca4..818b621 100644 --- a/Gemfile +++ b/Gemfile @@ -51,6 +51,8 @@ gem "rails-erd", group: :development gem 'travis-lint' +gem 'faker' +gem 'fabrication' group :development do gem "binding_of_caller" diff --git a/Gemfile.lock b/Gemfile.lock index 37be44b..7de4158 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -89,6 +89,9 @@ GEM erubis (2.7.0) eventmachine (1.0.0) execjs (2.0.2) + fabrication (2.9.1) + faker (1.2.0) + i18n (~> 0.5) foreman (0.63.0) dotenv (>= 0.7) thor (>= 0.13.6) @@ -244,6 +247,8 @@ DEPENDENCIES dalli devise_browserid_authenticatable dotenv-rails + fabrication + faker foreman haml-rails has_scope diff --git a/spec/fabricators/user_fabricator.rb b/spec/fabricators/user_fabricator.rb new file mode 100644 index 0000000..f1e7f98 --- /dev/null +++ b/spec/fabricators/user_fabricator.rb @@ -0,0 +1,16 @@ +Fabricator(:user) do + transient :with_profile => true + + Faker::Config.locale = :es + + username { Faker::Internet.user_name } + email { Faker::Internet.email } + date_of_birth { DateTime.now.utc } + identity_document { sequence(:identity_document, 1) { |n| "X000000#{n}X" } } + phone { Faker::PhoneNumber.phone_number } + alt_phone { Faker::PhoneNumber.cell_phone } + address { Faker::Address.street_address + " " + Faker::Address.zip_code + " " + Faker::Address.city + " (" + Faker::Address.state + ")"} + gender { ["male", "female"].shuffle.first } + description { Faker::Lorem.paragraph } + +end \ No newline at end of file From db3e6394f3abc3292cf77a3fe1bb50d2cca2532a Mon Sep 17 00:00:00 2001 From: amartincaro Date: Wed, 6 Nov 2013 21:19:44 +0100 Subject: [PATCH 2/4] New spec for TransfersController. --- Gemfile | 1 + Gemfile.lock | 2 + app/controllers/transfers_controller.rb | 12 ++-- spec/controllers/transfers_controller_spec.rb | 62 +++++++++++++++++++ spec/fabricators/member_fabricator.rb | 7 +++ spec/fabricators/organization_fabricator.rb | 3 + spec/fabricators/user_fabricator.rb | 2 - spec/spec_helper.rb | 23 ++++++- spec/support/controller_macros.rb | 18 ++++++ 9 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 spec/controllers/transfers_controller_spec.rb create mode 100644 spec/fabricators/member_fabricator.rb create mode 100644 spec/fabricators/organization_fabricator.rb create mode 100644 spec/support/controller_macros.rb diff --git a/Gemfile b/Gemfile index 818b621..59b0cb9 100644 --- a/Gemfile +++ b/Gemfile @@ -66,4 +66,5 @@ end group :test do # Needed for TravisCI gem 'rake' + gem "database_cleaner" end diff --git a/Gemfile.lock b/Gemfile.lock index 7de4158..5f3079c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -73,6 +73,7 @@ GEM coffee-script-source (1.6.3) daemons (1.1.9) dalli (2.6.4) + database_cleaner (1.2.0) debug_inspector (0.0.2) devise (3.1.1) bcrypt-ruby (~> 3.0) @@ -245,6 +246,7 @@ DEPENDENCIES binding_of_caller coffee-rails dalli + database_cleaner devise_browserid_authenticatable dotenv-rails fabrication diff --git a/app/controllers/transfers_controller.rb b/app/controllers/transfers_controller.rb index 3a123c6..91621f6 100644 --- a/app/controllers/transfers_controller.rb +++ b/app/controllers/transfers_controller.rb @@ -1,15 +1,19 @@ class TransfersController < ApplicationController def create + ap ["Logged user", current_user] + ap ["Current organization", current_organization] + if admin? transfer_params = params.require(:transfer).permit(:source, :destination, :amount) @source = Account.find(transfer_params[:source]) else transfer_params = params.require(:transfer).permit(:destination, :amount) - @source = current_user.account + @source = current_user.members.find_by(organization: current_organization).account end - ap transfer_params - ap @source - ap Account.find(transfer_params[:destination]) + + # ap transfer_params + # ap @source + # ap Account.find(transfer_params[:destination]) Transfer.create(transfer_params.merge source: @source) redirect_to current_user end diff --git a/spec/controllers/transfers_controller_spec.rb b/spec/controllers/transfers_controller_spec.rb new file mode 100644 index 0000000..63d3bfd --- /dev/null +++ b/spec/controllers/transfers_controller_spec.rb @@ -0,0 +1,62 @@ +require 'spec_helper' + +describe TransfersController do + let (:test_organization) { Fabricate(:organization)} + let (:member_giver) { Fabricate(:member, organization: test_organization) } + let (:member_taker) { Fabricate(:member, organization: test_organization) } + + describe "POST 'transfers'" do + context "with valid params" do + subject { post 'create', transfer: {destination: member_taker.account.id, amount: 5} } + + it "creates a new Transfer" do + login(member_giver.user) + + expect { + subject + }.to change(Transfer, :count).by 1 + end + + it "creates two Movements" do + login(member_giver.user) + + expect { + subject + }.to change { Movement.count}.by 2 + end + + it "updates the balance of both accounts" do + login(member_giver.user) + + expect { + subject + member_giver.reload + }.to change { member_giver.account.balance.to_i }.by -5 + + expect { + subject + member_taker.reload + }.to change { member_taker.account.balance.to_i }.by 5 + + end + end + + # context "with valid params" do + # subject { post 'create', transfer: {destination: member_taker.account.id, amount: 5} } + + # it "creates a new Transfer" do + # login(member_giver.user) + + # post 'create', transfer: {destination: member_taker.account.id, amount: 5} + + # expect(Transfer.count).to eq(1) + # expect(Movement.count).to eq(2) + + # member_giver.reload + # member_taker.reload + # expect(member_giver.account.balance.to_i).to eq(-5) + # expect(member_taker.account.balance.to_i).to eq(5) + # end + # end + end +end diff --git a/spec/fabricators/member_fabricator.rb b/spec/fabricators/member_fabricator.rb new file mode 100644 index 0000000..8607954 --- /dev/null +++ b/spec/fabricators/member_fabricator.rb @@ -0,0 +1,7 @@ +Fabricator(:member) do + + user { Fabricate(:user) } + organization { Fabricate(:organization) } + manager false + +end \ No newline at end of file diff --git a/spec/fabricators/organization_fabricator.rb b/spec/fabricators/organization_fabricator.rb new file mode 100644 index 0000000..b446a08 --- /dev/null +++ b/spec/fabricators/organization_fabricator.rb @@ -0,0 +1,3 @@ +Fabricator(:organization) do + name { Faker::Company.name } +end \ No newline at end of file diff --git a/spec/fabricators/user_fabricator.rb b/spec/fabricators/user_fabricator.rb index f1e7f98..da2d769 100644 --- a/spec/fabricators/user_fabricator.rb +++ b/spec/fabricators/user_fabricator.rb @@ -1,6 +1,4 @@ Fabricator(:user) do - transient :with_profile => true - Faker::Config.locale = :es username { Faker::Internet.user_name } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 943bc19..cb1c698 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -27,7 +27,7 @@ RSpec.configure do |config| # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false # instead of true. - config.use_transactional_fixtures = true + config.use_transactional_fixtures = false # If true, the base class of anonymous controllers will be inferred # automatically. This will be the default behavior in future versions of @@ -39,4 +39,25 @@ RSpec.configure do |config| # the seed, which is printed after each run. # --seed 1234 config.order = "random" + + config.include ControllerMacros, :type => :controller + + # Database cleaner configuration + + config.before :suite do + DatabaseCleaner.strategy = :transaction + DatabaseCleaner.clean_with :truncation + + end + + config.before do + DatabaseCleaner.start + end + + config.after do + DatabaseCleaner.clean + end + + # Controllers must render the content of the view + config.render_views end diff --git a/spec/support/controller_macros.rb b/spec/support/controller_macros.rb new file mode 100644 index 0000000..08b7be6 --- /dev/null +++ b/spec/support/controller_macros.rb @@ -0,0 +1,18 @@ +module ControllerMacros + + def login(user = nil) + user = Fabricate(:user) unless user + + request.session["user_id"] = user.id + request.session["email"] = user.email + end + + def current_user + @current_user ||= User.find(request.session["user_id"]) if request.session["user_id"] + end + + def current_organization + @current_organization ||= current_user.try(:organizations).try(:first) + end + +end \ No newline at end of file From 60a85a6c8d2c727901a3acb1a41ef0ca940b52f5 Mon Sep 17 00:00:00 2001 From: amartincaro Date: Thu, 7 Nov 2013 19:44:57 +0100 Subject: [PATCH 3/4] New tests for transfers_controller. New spec for inquiries_controller. New fabricators. --- app/controllers/transfers_controller.rb | 4 +- config/environments/test.rb | 2 + spec/controllers/inquiries_controller_spec.rb | 30 +++++ spec/controllers/transfers_controller_spec.rb | 120 +++++++++++++----- spec/fabricators/post_fabricator.rb | 36 ++++++ spec/spec_helper.rb | 4 +- 6 files changed, 159 insertions(+), 37 deletions(-) create mode 100644 spec/controllers/inquiries_controller_spec.rb create mode 100644 spec/fabricators/post_fabricator.rb diff --git a/app/controllers/transfers_controller.rb b/app/controllers/transfers_controller.rb index 91621f6..bfbd003 100644 --- a/app/controllers/transfers_controller.rb +++ b/app/controllers/transfers_controller.rb @@ -1,7 +1,7 @@ class TransfersController < ApplicationController def create - ap ["Logged user", current_user] - ap ["Current organization", current_organization] + # ap ["Logged user", current_user.username] + # ap ["Current organization", current_organization.name] if admin? transfer_params = params.require(:transfer).permit(:source, :destination, :amount) diff --git a/config/environments/test.rb b/config/environments/test.rb index a8825d9..6cffa8c 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -29,4 +29,6 @@ Timeoverflow::Application.configure do # Print deprecation notices to the stderr config.active_support.deprecation = :stderr + + config.log_level = :error end diff --git a/spec/controllers/inquiries_controller_spec.rb b/spec/controllers/inquiries_controller_spec.rb new file mode 100644 index 0000000..ef0b184 --- /dev/null +++ b/spec/controllers/inquiries_controller_spec.rb @@ -0,0 +1,30 @@ +require 'spec_helper' + +describe InquiriesController do + let (:test_organization) { Fabricate(:organization)} + let (:member) { Fabricate(:member, organization: test_organization)} + let (:another_member) { Fabricate(:member, organization: test_organization)} + let! (:inquiry) { Fabricate(:inquiry, user: member.user)} + + describe "GET #index" do + context "with a logged user" do + it "populates and array of inquiries" do + login(another_member.user) + + get :index + expect(assigns(:inquiries)).to eq([inquiry]) + end + end + end + + describe "GET #show" do + context "with a logged user" do + it "assigns the requested inquiry to @inquiry" do + login(another_member.user) + + get :show, id: inquiry.id + expect(assigns(:inquiry)).to eq(inquiry) + end + end + end +end diff --git a/spec/controllers/transfers_controller_spec.rb b/spec/controllers/transfers_controller_spec.rb index 63d3bfd..b1da638 100644 --- a/spec/controllers/transfers_controller_spec.rb +++ b/spec/controllers/transfers_controller_spec.rb @@ -2,60 +2,114 @@ require 'spec_helper' describe TransfersController do let (:test_organization) { Fabricate(:organization)} + let (:member_admin) { Fabricate(:member, organization: test_organization, manager: true)} let (:member_giver) { Fabricate(:member, organization: test_organization) } let (:member_taker) { Fabricate(:member, organization: test_organization) } - describe "POST 'transfers'" do + describe "POST #create" do context "with valid params" do - subject { post 'create', transfer: {destination: member_taker.account.id, amount: 5} } + context "with an admin user logged" do + subject { post 'create', transfer: {source: member_giver.account.id, destination: member_taker.account.id, amount: 5} } - it "creates a new Transfer" do - login(member_giver.user) + it "creates a new Transfer" do + login(member_admin.user) - expect { - subject - }.to change(Transfer, :count).by 1 + expect { + subject + }.to change(Transfer, :count).by 1 + end + + it "creates two Movements" do + login(member_admin.user) + + expect { + subject + }.to change { Movement.count}.by 2 + end + + it "updates the balance of both accounts" do + login(member_admin.user) + + expect { + subject + member_giver.reload + }.to change { member_giver.account.balance.to_i }.by -5 + + expect { + subject + member_taker.reload + }.to change { member_taker.account.balance.to_i }.by 5 + + end end - it "creates two Movements" do - login(member_giver.user) + context "with a regular user logged" do + subject { post 'create', transfer: {destination: member_taker.account.id, amount: 5} } - expect { - subject - }.to change { Movement.count}.by 2 - end + it "creates a new Transfer" do + login(member_giver.user) - it "updates the balance of both accounts" do - login(member_giver.user) + expect { + subject + }.to change(Transfer, :count).by 1 + end - expect { - subject - member_giver.reload - }.to change { member_giver.account.balance.to_i }.by -5 + it "creates two Movements" do + login(member_giver.user) - expect { - subject - member_taker.reload - }.to change { member_taker.account.balance.to_i }.by 5 + expect { + subject + }.to change { Movement.count}.by 2 + end + it "updates the balance of both accounts" do + login(member_giver.user) + + expect { + subject + member_giver.reload + }.to change { member_giver.account.balance.to_i }.by -5 + + expect { + subject + member_taker.reload + }.to change { member_taker.account.balance.to_i }.by 5 + + end end end # context "with valid params" do - # subject { post 'create', transfer: {destination: member_taker.account.id, amount: 5} } + # context "with an admin user logged" do + # it "creates a new Transfer" do + # login(member_admin.user) - # it "creates a new Transfer" do - # login(member_giver.user) + # post 'create', transfer: {source: member_giver.account.id, destination: member_taker.account.id, amount: 5} - # post 'create', transfer: {destination: member_taker.account.id, amount: 5} + # expect(Transfer.count).to eq(1) + # expect(Movement.count).to eq(2) - # expect(Transfer.count).to eq(1) - # expect(Movement.count).to eq(2) + # member_giver.reload + # member_taker.reload + # expect(member_giver.account.balance.to_i).to eq(-5) + # expect(member_taker.account.balance.to_i).to eq(5) + # end + # end - # member_giver.reload - # member_taker.reload - # expect(member_giver.account.balance.to_i).to eq(-5) - # expect(member_taker.account.balance.to_i).to eq(5) + # context "with a regular user logged" do + # it "creates a new Transfer" do + # login(member_giver.user) + + # post 'create', transfer: {destination: member_taker.account.id, amount: 5} + + # expect(Transfer.count).to eq(1) + # expect(Movement.count).to eq(2) + + # member_giver.reload + # member_taker.reload + # expect(member_giver.account.balance.to_i).to eq(-5) + # expect(member_taker.account.balance.to_i).to eq(5) + # end # end # end end diff --git a/spec/fabricators/post_fabricator.rb b/spec/fabricators/post_fabricator.rb new file mode 100644 index 0000000..816aed6 --- /dev/null +++ b/spec/fabricators/post_fabricator.rb @@ -0,0 +1,36 @@ +Fabricator(:post) do + + title { Faker::Lorem.sentence } + user { Fabricate(:user) } + description { Faker::Lorem.paragraph } + permanent { false } + joinable { false } + global { false } + +end + +Fabricator(:inquiry) do + + type "Inquiry" + + title { Faker::Lorem.sentence } + user { Fabricate(:user) } + description { Faker::Lorem.paragraph } + permanent { false } + joinable { false } + global { false } + +end + +Fabricator(:offer) do + + type "Offer" + + title { Faker::Lorem.sentence } + user { Fabricate(:user) } + description { Faker::Lorem.paragraph } + permanent { false } + joinable { false } + global { false } + +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index cb1c698..c74b8c4 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -50,11 +50,11 @@ RSpec.configure do |config| end - config.before do + config.before(:each) do DatabaseCleaner.start end - config.after do + config.after(:each) do DatabaseCleaner.clean end From cbc1d5386d6645492dd90488c86db28baac11d5f Mon Sep 17 00:00:00 2001 From: amartincaro Date: Tue, 12 Nov 2013 19:30:30 +0100 Subject: [PATCH 4/4] New tests for inquiries_controller. --- spec/controllers/inquiries_controller_spec.rb | 68 +++++++++++++++++-- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/spec/controllers/inquiries_controller_spec.rb b/spec/controllers/inquiries_controller_spec.rb index ef0b184..bab5fac 100644 --- a/spec/controllers/inquiries_controller_spec.rb +++ b/spec/controllers/inquiries_controller_spec.rb @@ -11,20 +11,74 @@ describe InquiriesController do it "populates and array of inquiries" do login(another_member.user) - get :index + get 'index' expect(assigns(:inquiries)).to eq([inquiry]) end end end - describe "GET #show" do - context "with a logged user" do - it "assigns the requested inquiry to @inquiry" do - login(another_member.user) - get :show, id: inquiry.id - expect(assigns(:inquiry)).to eq(inquiry) + describe "GET #show" do + context "with valid params" do + context "with a logged user" do + it "assigns the requested inquiry to @inquiry" do + login(another_member.user) + + get 'show', id: inquiry.id + expect(assigns(:inquiry)).to eq(inquiry) + end end end end + + describe "POST #create" do + context "with valid params" do + context "with a logged user" do + it "creates a new inquiry" do + login(another_member.user) + + expect { + post 'create', inquiry: Fabricate.to_params(:inquiry) + }.to change(Inquiry,:count).by(1) + end + end + end + end + + describe "PUT #update" do + context "with valid params" do + context "with a logged user" do + it "located the requested @inquiry" do + login(member.user) + + put 'update', id: inquiry.id, inquiry: Fabricate.to_params(:inquiry) + expect(assigns(:inquiry)).to eq(inquiry) + end + + it "changes @inquiry's attributes" do + login(member.user) + + put 'update', id: inquiry.id, inquiry: Fabricate.to_params(:inquiry, user: member, title: "New title", description: "New description") + + inquiry.reload + expect(inquiry.title).to eq("New title") + expect(inquiry.description).to eq("New description") + end + end + end + + context "with invalid params" do + context "with a logged user" do + it "does not change @inquiry's attributes" do + login(member.user) + + put :update, id: inquiry.id, inquiry: Fabricate.to_params(:inquiry, user: nil, title: "New title", description: "New description") + + expect(inquiry.title).not_to eq("New title") + expect(inquiry.description).not_to eq("New description") + end + end + end + end + end