From 4b1341677fb4294fdc378bab28e4845db43491e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Geonizeli?= Date: Sun, 15 Aug 2021 01:02:39 -0300 Subject: [PATCH] add withdrawl and deposit to FiatBalance and Balance --- Gemfile | 1 + Gemfile.lock | 4 ++ app/models/balance.rb | 10 ++++- app/models/fiat_balance.rb | 10 +++++ .../locales/{activerecord.yml => pt-BR.yml} | 14 ++++++- spec/factories/fiat_balances.rb | 2 +- spec/models/admin_user_spec.rb | 25 ------------ spec/models/balance_spec.rb | 28 +++++++++++++ spec/models/fiat_balance_spec.rb | 28 +++++++++++++ spec/policies/balance_policy_spec.rb | 38 +++++++++++++++++- spec/policies/fiat_balance_policy_spec.rb | 40 ++++++++++++++++++- 11 files changed, 170 insertions(+), 30 deletions(-) rename config/locales/{activerecord.yml => pt-BR.yml} (66%) delete mode 100644 spec/models/admin_user_spec.rb diff --git a/Gemfile b/Gemfile index eb55e3a..a42fad6 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,7 @@ ruby "2.7.4" gem "pg", "~> 1.1" gem "puma", "~> 5.0" gem "rails", "~> 6.1.4" +gem "rails-i18n", "~> 6.0" gem "sass-rails", ">= 6" gem "turbolinks", "~> 5" gem "webpacker", "~> 5.0" diff --git a/Gemfile.lock b/Gemfile.lock index 0f7b1f1..e0b38e7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -216,6 +216,9 @@ GEM ruby-graphviz (~> 1.2) rails-html-sanitizer (1.3.0) loofah (~> 2.3) + rails-i18n (6.0.0) + i18n (>= 0.7, < 2) + railties (>= 6.0.0, < 7) railties (6.1.4) actionpack (= 6.1.4) activesupport (= 6.1.4) @@ -351,6 +354,7 @@ DEPENDENCIES pundit rails (~> 6.1.4) rails-erd + rails-i18n (~> 6.0) rspec-graphql_matchers (~> 1.3) rspec-rails rubocop-rails diff --git a/app/models/balance.rb b/app/models/balance.rb index 8dfc70b..7f98371 100644 --- a/app/models/balance.rb +++ b/app/models/balance.rb @@ -25,5 +25,13 @@ class Balance < ApplicationRecord belongs_to :user belongs_to :currency - validates :amount, presence: true + validates :amount, presence: true, numericality: { greater_than_or_equal_to: 0 } + + def withdrawal!(value) + update!(amount: amount - value) + end + + def deposit!(value) + update!(amount: amount + value) + end end diff --git a/app/models/fiat_balance.rb b/app/models/fiat_balance.rb index 8722278..b64c62a 100644 --- a/app/models/fiat_balance.rb +++ b/app/models/fiat_balance.rb @@ -24,7 +24,17 @@ class FiatBalance < ApplicationRecord monetize :amount_cents + validates :amount_cents, numericality: { greater_than_or_equal_to: 0 } + def amount_formatted amount.format end + + def withdrawal!(value) + update!(amount_cents: amount_cents - value) + end + + def deposit!(value) + update!(amount_cents: amount_cents + value) + end end diff --git a/config/locales/activerecord.yml b/config/locales/pt-BR.yml similarity index 66% rename from config/locales/activerecord.yml rename to config/locales/pt-BR.yml index 03538e7..ee233df 100644 --- a/config/locales/activerecord.yml +++ b/config/locales/pt-BR.yml @@ -32,6 +32,18 @@ pt-BR: fiat_balance: amount_formatted: Quantia + amount_cents: Quantia currency: - name: Nome \ No newline at end of file + name: Nome + + errors: + models: + balance: + attributes: + amount: + greater_than_or_equal_to: "saldo insuficiente" + fiat_balance: + attributes: + amount_cents: + greater_than_or_equal_to: "saldo insuficiente" \ No newline at end of file diff --git a/spec/factories/fiat_balances.rb b/spec/factories/fiat_balances.rb index 37ac2a4..307c2bb 100644 --- a/spec/factories/fiat_balances.rb +++ b/spec/factories/fiat_balances.rb @@ -23,6 +23,6 @@ FactoryBot.define do factory :fiat_balance do association :user amount_currency { "BRL" } - amount_cents { Faker::Number.number(digits: 10) } + amount_cents { Faker::Number.number(digits: 4) } end end diff --git a/spec/models/admin_user_spec.rb b/spec/models/admin_user_spec.rb deleted file mode 100644 index a6218ff..0000000 --- a/spec/models/admin_user_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -# == Schema Information -# -# Table name: admin_users -# -# id :bigint not null, primary key -# email :string default(""), not null -# encrypted_password :string default(""), not null -# remember_created_at :datetime -# reset_password_sent_at :datetime -# reset_password_token :string -# created_at :datetime not null -# updated_at :datetime not null -# -# Indexes -# -# index_admin_users_on_email (email) UNIQUE -# index_admin_users_on_reset_password_token (reset_password_token) UNIQUE -# -require "rails_helper" - -RSpec.describe(AdminUser, type: :model) do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/models/balance_spec.rb b/spec/models/balance_spec.rb index 67694fc..0a3c3cf 100644 --- a/spec/models/balance_spec.rb +++ b/spec/models/balance_spec.rb @@ -32,4 +32,32 @@ RSpec.describe(Balance, type: :model) do it { is_expected.to(belong_to(:user)) } it { is_expected.to(belong_to(:currency)) } end + + describe ".withdrwal!" do + context "when value is greater than the balance" do + it "raise ActiveRecord::RecordInvalid" do + balance = build(:balance, amount: 70.342) + + expect { balance.withdrawal!(80) }.to( + raise_error(ActiveRecord::RecordInvalid, "A validação falhou: Quantia saldo insuficiente") + ) + end + end + + context "when value is equals to the balance" do + it "returns true" do + balance = build(:balance, amount: 70.342) + + expect(balance.withdrawal!(70.342)).to(eq(true)) + end + end + + context "when value is smaller than the balance" do + it "returns true" do + balance = build(:balance, amount: 70.342) + + expect(balance.withdrawal!(20)).to(eq(true)) + end + end + end end diff --git a/spec/models/fiat_balance_spec.rb b/spec/models/fiat_balance_spec.rb index 704bfc1..957d7f1 100644 --- a/spec/models/fiat_balance_spec.rb +++ b/spec/models/fiat_balance_spec.rb @@ -25,4 +25,32 @@ RSpec.describe(FiatBalance, type: :model) do describe "associations" do it { is_expected.to(belong_to(:user)) } end + + describe ".withdrwal!" do + context "when value is greater than the balance" do + it "raise ActiveRecord::RecordInvalid" do + balance = build(:fiat_balance, amount_cents: 100_00) + + expect { balance.withdrawal!(100_50) }.to( + raise_error(ActiveRecord::RecordInvalid, "A validação falhou: Quantia saldo insuficiente") + ) + end + end + + context "when value is equals to the balance" do + it "returns true" do + balance = build(:fiat_balance, amount_cents: 100_00) + + expect(balance.withdrawal!(100_00)).to(eq(true)) + end + end + + context "when value is smaller than the balance" do + it "returns true" do + balance = build(:fiat_balance, amount_cents: 100_00) + + expect(balance.withdrawal!(90_00)).to(eq(true)) + end + end + end end diff --git a/spec/policies/balance_policy_spec.rb b/spec/policies/balance_policy_spec.rb index eb3c421..158e99e 100644 --- a/spec/policies/balance_policy_spec.rb +++ b/spec/policies/balance_policy_spec.rb @@ -2,5 +2,41 @@ require "rails_helper" RSpec.describe(BalancePolicy, type: :policy) do - pending "add some examples to (or delete) #{__FILE__}" + context "when user has balances" do + it "return only balances from a user" do + create(:balance) + create(:balance) + + user = build(:user) + balance = create(:balance, user: user) + + balances = BalancePolicy::Scope.new(user, Balance).resolve + + expect(balances).to(eq([balance])) + end + end + + context "when user has not balances" do + it "return empty array" do + create(:balance) + create(:balance) + + user = build(:user) + + balances = BalancePolicy::Scope.new(user, Balance).resolve + + expect(balances).to(eq([])) + end + end + + context "when user is nil" do + it "return empty array" do + create(:balance) + create(:balance) + + balances = BalancePolicy::Scope.new(nil, Balance).resolve + + expect(balances).to(eq([])) + end + end end diff --git a/spec/policies/fiat_balance_policy_spec.rb b/spec/policies/fiat_balance_policy_spec.rb index 9bf7e08..9fa3dce 100644 --- a/spec/policies/fiat_balance_policy_spec.rb +++ b/spec/policies/fiat_balance_policy_spec.rb @@ -2,5 +2,43 @@ require "rails_helper" RSpec.describe(FiatBalancePolicy, type: :policy) do - pending "add some examples to (or delete) #{__FILE__}" + describe "::Scope" do + context "when user has balances" do + it "return only balances from a user" do + create(:fiat_balance) + create(:fiat_balance) + + user = build(:user) + balance = create(:fiat_balance, user: user) + + balances = FiatBalancePolicy::Scope.new(user, FiatBalance).resolve + + expect(balances).to(eq([balance])) + end + end + + context "when user has not balances" do + it "return empty array" do + create(:fiat_balance) + create(:fiat_balance) + + user = build(:user) + + balances = FiatBalancePolicy::Scope.new(user, FiatBalance).resolve + + expect(balances).to(eq([])) + end + end + + context "when user is nil" do + it "return empty array" do + create(:fiat_balance) + create(:fiat_balance) + + balances = FiatBalancePolicy::Scope.new(nil, FiatBalance).resolve + + expect(balances).to(eq([])) + end + end + end end