Skip to content

Commit

Permalink
🥗 Tobias: Draft a spec for Payout#issue
Browse files Browse the repository at this point in the history
- zinc-collective#11

I'm starting out by coding by wishful thinking, putting together the
pieces of the pie that I can eat bite by bite.

In this test, I'm using imagining there will be a Model called
`Tobias::Payout`, which will be our computational entrance point into
the [Issuing a Payout](zinc-collective#11)
feature.

I considered starting with a system test, which would have gone through
the User Interface and tied together a bunch of different concepts; but
I figured I would start with a `model` spec; so that I can stay focused
on drawing the computer-facing side of the feature out before worrying
too much about the human-facing bits; which I always find require a lot
more thought for me.

That said, a system test will be useful here at some point.

The computational bits, on the other hand, feel pretty accesible. We
want to create Payments for every Beneficiary of the appropriate amount,
and store records of these Payments so we know who is supposed to get
paid what.

Here's a line-by-line play-by-play of this change:

I'm using the `spec` folder to store executable examples
of a feature.

Because `Issuing Payout` is a feature for the [`TOBIAS`
project](zinc-collective#1), I am storing it
under `spec/tobias`. My choice of what to call the file
(`payout_spec.rb` indicates that this spec will be for the `Payout`
model.

The `require "rails_helper"` line tells our testing framework to load
all the code necessary to run a spec.

The `describe Tobias::Payout do` line groups the examples nested within
it as relating to the `Payout` model.

The `describe "#issue"` line tells me that the `Payout` model will have a
method named `issue`, and also creates a group of examples that describe
how the `Payout#issue` method works.

The `it "issues a Payment..." do` line describes one of the examples we
we plan to use to confirm that the `Payout#issue` method works the way
we hope it will.

The test itself lives on the lines between `it "issues a Payment..." do`
and the `end` that is aligned with the `it`

The `payout = create(:tobias_payout, payout_amount_cents: 150_00) line
says "create a database record of a `Tobias::Payout, and populate it's
`payout_amount_cents` field with $150.00, and store a reference to it in
the `payout` variable.

The `beneficiaries = create_list(10, :tobias_beneficiary, trust:
payout.trust)` line says create 10 `Tobias::Beneficiary` records in the
database, and make sure their `trust` field is pointed at the same
`Tobias::Trust` that our `payout` is pointing to. Store references to
those in the `beneficiaries variable.`

The `payout.issue` line executes the `Payout#issue` method that we are
describing.

The `beneficiaries.each do |beneficiary|` goes over every one of the
newly created `Tobias::Beneficiary` records stored in the
`beneficiaries` variable, expose each one as a variable named
`beneficiary`, and execute the code between it and the next `end`.

The `expect(beneficiaries.payments).to exist(amount_cents)` tells our
example to let us know if there are no `Tobias::Payment` records in the
database for one of the `beneficiaries`.
  • Loading branch information
zspencer committed Jan 22, 2024
1 parent e98d3d1 commit 34d5649
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions spec/furniture/tobias/payout_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
require "rails_helper"

RSpec.describe Tobias::Payout do
describe "#issue" do
it "issues a Payment to each Beneficiary for their share of the #payout_amount" do
payout = create(:tobias_payout, payout_amount_cents: 150_00)

beneficiaries = create_list(10, :tobias_beneficiary, trust: payout.trust)

payout.issue

beneficiaries.each do |beneficiary|
expect(beneficiary.payments).to exist(amount_cents: 15)
end
end
end
end

0 comments on commit 34d5649

Please sign in to comment.