add createStakeOrder mutation

This commit is contained in:
João Geonizeli
2021-08-16 15:14:48 -03:00
parent 17d502430f
commit c1bd034f5a
11 changed files with 335 additions and 152 deletions

View File

@@ -4,20 +4,23 @@
#
# Table name: stake_orders
#
# id :bigint not null, primary key
# amount :decimal(20, 10) default(0.0), not null
# pool_name :string not null
# status :string not null
# created_at :datetime not null
# updated_at :datetime not null
# user_id :bigint not null
# id :bigint not null, primary key
# amount :decimal(20, 10) default(0.0), not null
# pool_name :string not null
# status :string not null
# created_at :datetime not null
# updated_at :datetime not null
# currency_id :bigint
# user_id :bigint not null
#
# Indexes
#
# index_stake_orders_on_user_id (user_id)
# index_stake_orders_on_currency_id (currency_id)
# index_stake_orders_on_user_id (user_id)
#
# Foreign Keys
#
# fk_rails_... (currency_id => currencies.id)
# fk_rails_... (user_id => users.id)
#
FactoryBot.define do

View File

@@ -0,0 +1,123 @@
# frozen_string_literal: true
require "rails_helper"
RSpec.describe(Mutations::CreateStakeOrder, type: :mutation) do
let(:query_string) do
<<~GQL
mutation(
$currencyId: ID!,
$amount: String!,
$poolName: String!,
) {
createStakeOrder(input: {
order: {
currencyId: $currencyId,
amount: $amount,
poolName: $poolName,
}
}) {
errors {
fullMessages
fieldName
messages
path
}
order {
poolName
status
amount
}
}
}
GQL
end
context "when the user has enough balance" do
it "withdraws from his account and creates a buy order" do
currency = create(:currency)
user = create(
:user,
balances: [
build(:balance, currency: currency, amount: 1.0034),
]
)
currency_global_id = GraphQL::Schema::UniqueWithinType.encode("Currency", currency.id)
variables = {
"currencyId": currency_global_id,
"amount": "0.80",
"poolName": "CAKE/BNB",
"status": "PROCESSING",
}
context = { current_user: user }
result = XStakeSchema.execute(
query_string,
variables: variables,
context: context
).to_h.with_indifferent_access
expect(result).to(eq({
"data" => {
"createStakeOrder" => {
"errors" => nil,
"order" => {
"status" => "PROCESSING",
"amount" => "0.8",
"poolName" => "CAKE/BNB",
},
},
},
}))
expect(user.balances.first.reload.amount.to_s).to(eq("0.2034"))
end
end
context "when the user does not have enough balance" do
it "returns withdrawl error" do
currency = create(:currency)
user = create(
:user,
balances: [
build(:balance, currency: currency, amount: 0.0034),
]
)
currency_global_id = GraphQL::Schema::UniqueWithinType.encode("Currency", currency.id)
variables = {
"currencyId": currency_global_id,
"amount": "0.80",
"poolName": "CAKE/BNB",
}
context = { current_user: user }
result = XStakeSchema.execute(
query_string,
variables: variables,
context: context
).to_h.with_indifferent_access
expect(result).to(eq({
"data" => {
"createStakeOrder" => {
"errors" => [{
"fullMessages" => ["Quantia saldo insuficiente"],
"fieldName" => "amount",
"messages" => ["saldo insuficiente"],
"path" => ["attributes", "amount"],
}],
"order" => nil,
},
},
}))
expect(user.balances.first.reload.amount.to_s).to(eq("0.0034"))
end
end
end

View File

@@ -4,20 +4,23 @@
#
# Table name: stake_orders
#
# id :bigint not null, primary key
# amount :decimal(20, 10) default(0.0), not null
# pool_name :string not null
# status :string not null
# created_at :datetime not null
# updated_at :datetime not null
# user_id :bigint not null
# id :bigint not null, primary key
# amount :decimal(20, 10) default(0.0), not null
# pool_name :string not null
# status :string not null
# created_at :datetime not null
# updated_at :datetime not null
# currency_id :bigint
# user_id :bigint not null
#
# Indexes
#
# index_stake_orders_on_user_id (user_id)
# index_stake_orders_on_currency_id (currency_id)
# index_stake_orders_on_user_id (user_id)
#
# Foreign Keys
#
# fk_rails_... (currency_id => currencies.id)
# fk_rails_... (user_id => users.id)
#
require "rails_helper"
@@ -30,5 +33,6 @@ RSpec.describe(StakeOrder, type: :model) do
describe "associations" do
it { is_expected.to(belong_to(:user)) }
it { is_expected.to(belong_to(:currency)) }
end
end