Compare commits

...

9 Commits

Author SHA1 Message Date
Daniel O'Connor
b76cfd3957 Rubocop: RSpec/IncludeExamples 2026-04-23 13:31:16 +00:00
Daniel O'Connor
ea5f93f929 Merge pull request #4541 from Growstuff/Lint/EmptyBlock
Rubocop: Lint/EmptyBlock
2026-04-23 22:53:40 +09:30
Daniel O'Connor
8d8ee7069c Merge pull request #4540 from Growstuff/Bundler/OrderedGems
Rubocop: Bundler/OrderedGems
2026-04-23 22:46:10 +09:30
Daniel O'Connor
5d112e9134 Rubocop: Capybara/RSpec/HaveSelector (#4539)
* Rubocop: Capybara/RSpec/HaveSelector

* Rubocop: Capybara/RSpec/HaveSelector
2026-04-23 22:45:58 +09:30
Daniel O'Connor
6ba4f39b4a Rubocop: Lint/EmptyBlock 2026-04-23 13:14:39 +00:00
Daniel O'Connor
a38d99ed4a Rubocop: Bundler/OrderedGems 2026-04-23 13:07:38 +00:00
Daniel O'Connor
f1acb35520 Merge pull request #4537 from Growstuff/FactoryBot/SyntaxMethods
Rubocop: FactoryBot/SyntaxMethods
2026-04-23 22:29:24 +09:30
Daniel O'Connor
267560aff1 Merge pull request #4494 from Growstuff/dependabot/bundler/puma-8.0.0
Bump puma from 7.2.0 to 8.0.0
2026-04-23 22:26:31 +09:30
dependabot[bot]
e862a5c5b8 Bump puma from 7.2.0 to 8.0.0
Bumps [puma](https://github.com/puma/puma) from 7.2.0 to 8.0.0.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/main/History.md)
- [Commits](https://github.com/puma/puma/compare/v7.2.0...v8.0.0)

---
updated-dependencies:
- dependency-name: puma
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 12:47:21 +00:00
163 changed files with 1428 additions and 1526 deletions

View File

@@ -6,13 +6,6 @@
# Note that changes in the inspected code, or installation of new # Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again. # versions of RuboCop, may require this file to be generated again.
# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation.
Bundler/OrderedGems:
Exclude:
- 'Gemfile'
# Offense count: 19 # Offense count: 19
Capybara/NegationMatcherAfterVisit: Capybara/NegationMatcherAfterVisit:
Exclude: Exclude:
@@ -25,22 +18,6 @@ Capybara/NegationMatcherAfterVisit:
- 'spec/features/members/profile_spec.rb' - 'spec/features/members/profile_spec.rb'
- 'spec/features/plantings/planting_a_crop_spec.rb' - 'spec/features/plantings/planting_a_crop_spec.rb'
# Offense count: 34
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: DefaultSelector.
Capybara/RSpec/HaveSelector:
Exclude:
- 'spec/features/conversations/index_spec.rb'
- 'spec/features/footer_spec.rb'
- 'spec/features/gardens/adding_gardens_spec.rb'
- 'spec/features/harvests/harvesting_a_crop_spec.rb'
- 'spec/features/members/list_spec.rb'
- 'spec/features/plantings/planting_a_crop_spec.rb'
- 'spec/features/seeds/adding_seeds_spec.rb'
- 'spec/features/shared_examples/crop_suggest.rb'
- 'spec/support/feature_helpers.rb'
- 'spec/views/posts/show.html.haml_spec.rb'
# Offense count: 14 # Offense count: 14
Capybara/SpecificMatcher: Capybara/SpecificMatcher:
Exclude: Exclude:
@@ -86,11 +63,6 @@ FactoryBot/ExcessiveCreateList:
- 'spec/features/crops/show_spec.rb' - 'spec/features/crops/show_spec.rb'
- 'spec/features/percy/percy_spec.rb' - 'spec/features/percy/percy_spec.rb'
# Offense count: 1158
# This cop supports unsafe autocorrection (--autocorrect-all).
FactoryBot/SyntaxMethods:
Enabled: false
# Offense count: 312 # Offense count: 312
# This cop supports safe autocorrection (--autocorrect). # This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle. # Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
@@ -164,18 +136,6 @@ Lint/DuplicateMethods:
Exclude: Exclude:
- 'app/models/planting.rb' - 'app/models/planting.rb'
# Offense count: 8
# Configuration parameters: AllowComments, AllowEmptyLambdas.
Lint/EmptyBlock:
Exclude:
- 'db/migrate/20171022032108_all_the_predictions.rb'
- 'spec/controllers/home_controller_spec.rb'
- 'spec/controllers/likes_controller_spec.rb'
- 'spec/controllers/plant_parts_controller_spec.rb'
- 'spec/factories/crop_companions.rb'
- 'spec/features/crops/crop_detail_page_spec.rb'
- 'spec/requests/authentications_spec.rb'
# Offense count: 1 # Offense count: 1
# This cop supports safe autocorrection (--autocorrect). # This cop supports safe autocorrection (--autocorrect).
Lint/RedundantCopDisableDirective: Lint/RedundantCopDisableDirective:
@@ -374,26 +334,6 @@ RSpec/HooksBeforeExamples:
Exclude: Exclude:
- 'spec/features/crops/creating_a_crop_spec.rb' - 'spec/features/crops/creating_a_crop_spec.rb'
# Offense count: 53
# This cop supports unsafe autocorrection (--autocorrect-all).
RSpec/IncludeExamples:
Exclude:
- 'spec/features/conversations/index_spec.rb'
- 'spec/features/crops/alternate_name_spec.rb'
- 'spec/features/crops/browse_crops_spec.rb'
- 'spec/features/crops/creating_a_crop_spec.rb'
- 'spec/features/crops/crop_photos_spec.rb'
- 'spec/features/crops/delete_crop_spec.rb'
- 'spec/features/gardens/actions_spec.rb'
- 'spec/features/gardens/adding_gardens_spec.rb'
- 'spec/features/gardens/index_spec.rb'
- 'spec/features/likeable_spec.rb'
- 'spec/features/signout_spec.rb'
- 'spec/models/crop_spec.rb'
- 'spec/support/feature_helpers.rb'
- 'spec/views/photos/show.html.haml_spec.rb'
- 'spec/views/seeds/index.rss.haml_spec.rb'
# Offense count: 37 # Offense count: 37
# Configuration parameters: Max, AllowedIdentifiers, AllowedPatterns. # Configuration parameters: Max, AllowedIdentifiers, AllowedPatterns.
RSpec/IndexedLet: RSpec/IndexedLet:

View File

@@ -204,5 +204,5 @@ gem "i18n_data", "~> 1.1"
gem "paper_trail", "~> 17.0" gem "paper_trail", "~> 17.0"
gem 'sitemap_generator'
gem 'aws-sdk-s3', '~> 1', '>= 1.114.0' gem 'aws-sdk-s3', '~> 1', '>= 1.114.0'
gem 'sitemap_generator'

View File

@@ -498,7 +498,7 @@ GEM
date date
stringio stringio
public_suffix (7.0.5) public_suffix (7.0.5)
puma (7.2.0) puma (8.0.0)
nio4r (~> 2.0) nio4r (~> 2.0)
query_diet (0.7.3) query_diet (0.7.3)
racc (1.8.1) racc (1.8.1)

View File

@@ -18,7 +18,6 @@ class AllThePredictions < ActiveRecord::Migration[4.2]
remove_column :plantings, :days_before_maturity, :integer remove_column :plantings, :days_before_maturity, :integer
create_table :median_functions do |t| create_table :median_functions
end
end end
end end

View File

@@ -14,7 +14,7 @@ describe AdminController do
end end
describe 'assigns @members' do describe 'assigns @members' do
let!(:m) { FactoryBot.create(:newsletter_recipient_member) } let!(:m) { create(:newsletter_recipient_member) }
it { expect(assigns(:members)).to eq [m] } it { expect(assigns(:members)).to eq [m] }
end end

View File

@@ -5,14 +5,14 @@ require 'rails_helper'
RSpec.describe Api::V1::PlantingsController, type: :controller do RSpec.describe Api::V1::PlantingsController, type: :controller do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let!(:member) { FactoryBot.create(:member) } let!(:member) { create(:member) }
describe '#index' do describe '#index' do
let(:matching_planting) { subject['data'].select { |planting| planting['id'] == my_planting.id.to_s }.first } let(:matching_planting) { subject['data'].select { |planting| planting['id'] == my_planting.id.to_s }.first }
describe 'GET #index' do describe 'GET #index' do
context 'basic planting' do context 'basic planting' do
let!(:my_planting) { FactoryBot.create(:planting, owner: member, planted_at: '2000-01-01') } let!(:my_planting) { create(:planting, owner: member, planted_at: '2000-01-01') }
let(:expected_attributes) do let(:expected_attributes) do
{ {
'crop-name' => my_planting.crop.name, 'crop-name' => my_planting.crop.name,
@@ -46,7 +46,7 @@ RSpec.describe Api::V1::PlantingsController, type: :controller do
end end
context 'with photo' do context 'with photo' do
let!(:my_planting) { FactoryBot.create(:planting, owner: member, planted_at: '2000-01-01') } let!(:my_planting) { create(:planting, owner: member, planted_at: '2000-01-01') }
let(:expected_attributes) do let(:expected_attributes) do
{ {
@@ -72,7 +72,7 @@ RSpec.describe Api::V1::PlantingsController, type: :controller do
'thumbnail' => photo.thumbnail_url 'thumbnail' => photo.thumbnail_url
} }
end end
let(:photo) { FactoryBot.create(:photo, owner: my_planting.owner) } let(:photo) { create(:photo, owner: my_planting.owner) }
before do before do
my_planting.photos << photo my_planting.photos << photo

View File

@@ -4,10 +4,10 @@ require 'rails_helper'
describe AuthenticationsController do describe AuthenticationsController do
before do before do
@member = FactoryBot.create(:member) @member = create(:member)
sign_in @member sign_in @member
controller.stub(:current_member) { @member } controller.stub(:current_member) { @member }
@auth = FactoryBot.create(:authentication, member: @member) @auth = create(:authentication, member: @member)
request.env['omniauth.auth'] = { request.env['omniauth.auth'] = {
'provider' => 'foo', 'provider' => 'foo',
'uid' => 'bar', 'uid' => 'bar',

View File

@@ -4,7 +4,7 @@ require 'rails_helper'
describe Charts::CropsController do describe Charts::CropsController do
describe 'GET charts' do describe 'GET charts' do
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
describe 'sunniness' do describe 'sunniness' do
before { get :sunniness, params: { crop_slug: crop.to_param } } before { get :sunniness, params: { crop_slug: crop.to_param } }

View File

@@ -5,7 +5,7 @@ require 'rails_helper'
describe Charts::GardensController do describe Charts::GardensController do
include Devise::Test::ControllerHelpers include Devise::Test::ControllerHelpers
let(:garden) { FactoryBot.create(:garden) } let(:garden) { create(:garden) }
context "when not signed in" do context "when not signed in" do
describe 'GET timeline' do describe 'GET timeline' do
@@ -18,7 +18,7 @@ describe Charts::GardensController do
context "when signed in" do context "when signed in" do
before { sign_in member } before { sign_in member }
let!(:member) { FactoryBot.create(:member) } let!(:member) { create(:member) }
describe 'GET timeline' do describe 'GET timeline' do
before { get :timeline, params: { garden_slug: garden.to_param } } before { get :timeline, params: { garden_slug: garden.to_param } }

View File

@@ -5,7 +5,7 @@ require 'rails_helper'
describe CommentsController do describe CommentsController do
subject { response } subject { response }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
before do before do
sign_in member sign_in member
@@ -13,13 +13,13 @@ describe CommentsController do
end end
def valid_attributes def valid_attributes
@post = FactoryBot.create(:post) @post = create(:post)
{ post_id: @post.id, body: "some text" } { post_id: @post.id, body: "some text" }
end end
describe "GET RSS feed" do describe "GET RSS feed" do
let!(:first_comment) { FactoryBot.create(:comment, created_at: 10.days.ago) } let!(:first_comment) { create(:comment, created_at: 10.days.ago) }
let!(:last_comment) { FactoryBot.create(:comment, created_at: 4.minutes.ago) } let!(:last_comment) { create(:comment, created_at: 4.minutes.ago) }
describe "returns an RSS feed" do describe "returns an RSS feed" do
before { get :index, format: "rss" } before { get :index, format: "rss" }
@@ -32,7 +32,7 @@ describe CommentsController do
end end
describe "GET new" do describe "GET new" do
let(:post) { FactoryBot.create(:post) } let(:post) { create(:post) }
describe "with valid params" do describe "with valid params" do
before do before do
@@ -41,7 +41,7 @@ describe CommentsController do
} }
end end
let(:old_comment) { FactoryBot.create(:comment, commentable: post) } let(:old_comment) { create(:comment, commentable: post) }
it "picks up post from params" do it "picks up post from params" do
expect(assigns(:commentable)).to eq(post) expect(assigns(:commentable)).to eq(post)
@@ -59,13 +59,13 @@ describe CommentsController do
end end
describe "GET edit" do describe "GET edit" do
let(:post) { FactoryBot.create(:post) } let(:post) { create(:post) }
before { get :edit, params: { id: comment.to_param } } before { get :edit, params: { id: comment.to_param } }
describe "my comment" do describe "my comment" do
let!(:comment) { FactoryBot.create(:comment, author: member, commentable: post) } let!(:comment) { create(:comment, author: member, commentable: post) }
let!(:old_comment) { FactoryBot.create(:comment, commentable: post, created_at: Time.zone.yesterday) } let!(:old_comment) { create(:comment, commentable: post, created_at: Time.zone.yesterday) }
it "assigns previous comments as @comments" do it "assigns previous comments as @comments" do
expect(assigns(:comments)).to eq([comment, old_comment]) expect(assigns(:comments)).to eq([comment, old_comment])
@@ -73,7 +73,7 @@ describe CommentsController do
end end
describe "not my comment" do describe "not my comment" do
let(:comment) { FactoryBot.create(:comment, commentable: post) } let(:comment) { create(:comment, commentable: post) }
it { expect(response).not_to be_successful } it { expect(response).not_to be_successful }
end end
@@ -83,7 +83,7 @@ describe CommentsController do
before { put :update, params: { id: comment.to_param, comment: valid_attributes } } before { put :update, params: { id: comment.to_param, comment: valid_attributes } }
describe "my comment" do describe "my comment" do
let(:comment) { FactoryBot.create(:comment, author: member) } let(:comment) { create(:comment, author: member) }
it "redirects to the comment's post" do it "redirects to the comment's post" do
expect(response).to redirect_to(comment.commentable) expect(response).to redirect_to(comment.commentable)
@@ -91,16 +91,16 @@ describe CommentsController do
end end
describe "not my comment" do describe "not my comment" do
let(:comment) { FactoryBot.create(:comment) } let(:comment) { create(:comment) }
it { expect(response).not_to be_successful } it { expect(response).not_to be_successful }
end end
describe "attempting to change post_id" do describe "attempting to change post_id" do
let(:post) { FactoryBot.create(:post, subject: 'our post') } let(:post) { create(:post, subject: 'our post') }
let(:other_post) { FactoryBot.create(:post, subject: 'the other post') } let(:other_post) { create(:post, subject: 'the other post') }
let(:valid_attributes) { { commentable_type: "Post", commentable_id: other_post.id, body: "kōrero" } } let(:valid_attributes) { { commentable_type: "Post", commentable_id: other_post.id, body: "kōrero" } }
let(:comment) { FactoryBot.create(:comment, author: member, commentable: post) } let(:comment) { create(:comment, author: member, commentable: post) }
it "does not change post_id" do it "does not change post_id" do
comment.reload comment.reload
@@ -113,7 +113,7 @@ describe CommentsController do
before { delete :destroy, params: { id: comment.to_param } } before { delete :destroy, params: { id: comment.to_param } }
describe "my comment" do describe "my comment" do
let(:comment) { FactoryBot.create(:comment, author: member) } let(:comment) { create(:comment, author: member) }
it "redirects to the post the comment was on" do it "redirects to the post the comment was on" do
expect(response).to redirect_to(comment.commentable) expect(response).to redirect_to(comment.commentable)
@@ -121,7 +121,7 @@ describe CommentsController do
end end
describe "not my comment" do describe "not my comment" do
let(:comment) { FactoryBot.create(:comment) } let(:comment) { create(:comment) }
it { expect(response).not_to be_successful } it { expect(response).not_to be_successful }
end end

View File

@@ -42,8 +42,8 @@ describe CropsController do
describe "GET crop search" do describe "GET crop search" do
describe 'fetches the crop search page' do describe 'fetches the crop search page' do
let!(:tomato) { FactoryBot.create(:tomato) } let!(:tomato) { create(:tomato) }
let!(:maize) { FactoryBot.create(:maize) } let!(:maize) { create(:maize) }
before { Crop.reindex } before { Crop.reindex }
@@ -140,7 +140,7 @@ describe CropsController do
describe 'DELETE destroy' do describe 'DELETE destroy' do
subject { delete :destroy, params: { slug: crop.to_param } } subject { delete :destroy, params: { slug: crop.to_param } }
let!(:crop) { FactoryBot.create(:crop) } let!(:crop) { create(:crop) }
context 'not logged in' do context 'not logged in' do
it { expect { subject }.not_to change(Crop, :count) } it { expect { subject }.not_to change(Crop, :count) }

View File

@@ -6,7 +6,7 @@ RSpec.describe GardenTypesController, type: :controller do
include Devise::Test::ControllerHelpers include Devise::Test::ControllerHelpers
let(:valid_params) { { name: 'My second GardenType' } } let(:valid_params) { { name: 'My second GardenType' } }
let(:garden_type) { FactoryBot.create(:garden_type) } let(:garden_type) { create(:garden_type) }
context "when not signed in" do context "when not signed in" do
describe 'GET new' do describe 'GET new' do
@@ -54,7 +54,7 @@ RSpec.describe GardenTypesController, type: :controller do
context "when signed in as a member" do context "when signed in as a member" do
before { sign_in member } before { sign_in member }
let!(:member) { FactoryBot.create(:member) } let!(:member) { create(:member) }
describe "for any garden_type" do describe "for any garden_type" do
let(:any_garden_type) { double('garden_type') } let(:any_garden_type) { double('garden_type') }

View File

@@ -7,7 +7,7 @@ RSpec.describe GardensController, type: :controller do
let(:valid_params) { { name: 'My second Garden' } } let(:valid_params) { { name: 'My second Garden' } }
let(:garden) { FactoryBot.create(:garden) } let(:garden) { create(:garden) }
context "when not signed in" do context "when not signed in" do
describe 'GET new' do describe 'GET new' do
@@ -55,7 +55,7 @@ RSpec.describe GardensController, type: :controller do
context "when signed in" do context "when signed in" do
before { sign_in member } before { sign_in member }
let!(:member) { FactoryBot.create(:member) } let!(:member) { create(:member) }
describe "for another member's garden" do describe "for another member's garden" do
let(:not_my_garden) { double('garden') } let(:not_my_garden) { double('garden') }

View File

@@ -8,19 +8,19 @@ describe HarvestsController, :search do
def valid_attributes def valid_attributes
{ {
owner_id: subject.current_member.id, owner_id: subject.current_member.id,
crop_id: FactoryBot.create(:crop).id, crop_id: create(:crop).id,
plant_part_id: FactoryBot.create(:plant_part).id, plant_part_id: create(:plant_part).id,
harvested_at: '2017-01-01' harvested_at: '2017-01-01'
} }
end end
describe "GET index" do describe "GET index" do
let!(:member1) { FactoryBot.create(:member) } let!(:member1) { create(:member) }
let(:member2) { FactoryBot.create(:member) } let(:member2) { create(:member) }
let(:tomato) { FactoryBot.create(:tomato) } let(:tomato) { create(:tomato) }
let(:maize) { FactoryBot.create(:maize) } let(:maize) { create(:maize) }
let!(:harvest1) { FactoryBot.create(:harvest, owner_id: member1.id, crop_id: tomato.id) } let!(:harvest1) { create(:harvest, owner_id: member1.id, crop_id: tomato.id) }
let!(:harvest2) { FactoryBot.create(:harvest, owner_id: member2.id, crop_id: maize.id) } let!(:harvest2) { create(:harvest, owner_id: member2.id, crop_id: maize.id) }
before { Harvest.reindex } before { Harvest.reindex }
@@ -109,7 +109,7 @@ describe HarvestsController, :search do
end end
describe "links to planting" do describe "links to planting" do
let(:planting) { FactoryBot.create(:planting, owner_id: member.id, garden: member.gardens.first) } let(:planting) { create(:planting, owner_id: member.id, garden: member.gardens.first) }
before { post :create, params: { harvest: valid_attributes.merge(planting_id: planting.id) } } before { post :create, params: { harvest: valid_attributes.merge(planting_id: planting.id) } }
@@ -134,8 +134,8 @@ describe HarvestsController, :search do
end end
describe "not my planting" do describe "not my planting" do
let(:not_my_planting) { FactoryBot.create(:planting) } let(:not_my_planting) { create(:planting) }
let(:harvest) { FactoryBot.create(:harvest) } let(:harvest) { create(:harvest) }
describe "does not save planting_id" do describe "does not save planting_id" do
before do before do
@@ -153,7 +153,7 @@ describe HarvestsController, :search do
let(:harvest) { Harvest.create! valid_attributes } let(:harvest) { Harvest.create! valid_attributes }
it "updates the requested harvest" do it "updates the requested harvest" do
new_crop = FactoryBot.create(:crop) new_crop = create(:crop)
expect do expect do
put :update, params: { slug: harvest.to_param, harvest: { crop_id: new_crop.id } } put :update, params: { slug: harvest.to_param, harvest: { crop_id: new_crop.id } }
harvest.reload harvest.reload
@@ -190,8 +190,8 @@ describe HarvestsController, :search do
end end
describe "not my planting" do describe "not my planting" do
let(:not_my_planting) { FactoryBot.create(:planting) } let(:not_my_planting) { create(:planting) }
let(:harvest) { FactoryBot.create(:harvest) } let(:harvest) { create(:harvest) }
describe "does not save planting_id" do describe "does not save planting_id" do
before do before do

View File

@@ -1,8 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
describe HomeController do
describe "GET index" do
end
end

View File

@@ -3,9 +3,9 @@
require 'rails_helper' require 'rails_helper'
describe LikesController do describe LikesController do
let(:like) { FactoryBot.create(:like, member:) } let(:like) { create(:like, member:) }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:blogpost) { FactoryBot.create(:post) } let(:blogpost) { create(:post) }
before { sign_in member } before { sign_in member }
@@ -21,9 +21,6 @@ describe LikesController do
describe "Liking someone else's post" do describe "Liking someone else's post" do
it { expect(response.code).to eq('201') } it { expect(response.code).to eq('201') }
end end
describe "Liking your own post" do
end
end end
describe "DELETE destroy" do describe "DELETE destroy" do
@@ -37,7 +34,7 @@ describe LikesController do
end end
describe "Deleting someone else's like" do describe "Deleting someone else's like" do
let(:like) { FactoryBot.create(:like) } let(:like) { create(:like) }
it { expect(response.code).to eq('403') } it { expect(response.code).to eq('403') }
it { JSON.parse(response.body)["error"] == "Unable to like" } it { JSON.parse(response.body)["error"] == "Unable to like" }

View File

@@ -4,8 +4,8 @@ require 'rails_helper'
describe MembersController do describe MembersController do
before do before do
@member = FactoryBot.create(:member) @member = create(:member)
@flickr_auth = FactoryBot.create(:flickr_authentication, member: @member) @flickr_auth = create(:flickr_authentication, member: @member)
end end
describe "GET index" do describe "GET index" do
@@ -39,7 +39,7 @@ describe MembersController do
end end
it "doesn't show unconfirmed members" do it "doesn't show unconfirmed members" do
@member2 = FactoryBot.create(:unconfirmed_member) @member2 = create(:unconfirmed_member)
get :show, params: { slug: @member2.id } get :show, params: { slug: @member2.id }
expect(response).to have_http_status(:not_found) expect(response).to have_http_status(:not_found)
end end

View File

@@ -17,8 +17,8 @@ describe PhotoAssociationsController do
before { photo.harvests << harvest } before { photo.harvests << harvest }
describe "my harvest my photo" do describe "my harvest my photo" do
let(:harvest) { FactoryBot.create(:harvest, owner: member) } let(:harvest) { create(:harvest, owner: member) }
let(:photo) { FactoryBot.create(:photo, owner: member) } let(:photo) { create(:photo, owner: member) }
it "removes link" do it "removes link" do
expect { delete :destroy, params: valid_params }.to change { photo.harvests.count }.by(-1) expect { delete :destroy, params: valid_params }.to change { photo.harvests.count }.by(-1)
@@ -26,8 +26,8 @@ describe PhotoAssociationsController do
end end
describe "another member's harvest from another member's photo" do describe "another member's harvest from another member's photo" do
let(:harvest) { FactoryBot.create(:harvest, owner: photo.owner) } let(:harvest) { create(:harvest, owner: photo.owner) }
let(:photo) { FactoryBot.create(:photo) } let(:photo) { create(:photo) }
it do it do
expect do expect do

View File

@@ -7,7 +7,7 @@ describe PhotosController, :search do
describe 'GET index' do describe 'GET index' do
describe 'all photos' do describe 'all photos' do
let!(:photo) { FactoryBot.create(:photo, :reindex) } let!(:photo) { create(:photo, :reindex) }
before do before do
Photo.reindex Photo.reindex
@@ -21,10 +21,10 @@ describe PhotosController, :search do
end end
describe '#index crop photos' do describe '#index crop photos' do
let!(:photo) { FactoryBot.create(:photo, :reindex, owner: member, title: 'no assocations photo') } let!(:photo) { create(:photo, :reindex, owner: member, title: 'no assocations photo') }
let!(:crop_photo) { FactoryBot.create(:photo, :reindex, owner: member, title: 'photos of planting') } let!(:crop_photo) { create(:photo, :reindex, owner: member, title: 'photos of planting') }
let!(:planting) { FactoryBot.create(:planting, :reindex, crop:, owner: member) } let!(:planting) { create(:planting, :reindex, crop:, owner: member) }
let!(:crop) { FactoryBot.create(:crop, :reindex) } let!(:crop) { create(:crop, :reindex) }
before do before do
planting.photos << crop_photo planting.photos << crop_photo
@@ -49,12 +49,12 @@ describe PhotosController, :search do
end end
describe "GET new" do describe "GET new" do
let(:tomato) { FactoryBot.create(:tomato) } let(:tomato) { create(:tomato) }
let(:planting) { FactoryBot.create(:planting, crop: tomato, owner: member) } let(:planting) { create(:planting, crop: tomato, owner: member) }
let(:garden) { FactoryBot.create(:garden, owner: member) } let(:garden) { create(:garden, owner: member) }
let(:harvest) { FactoryBot.create(:harvest, owner: member) } let(:harvest) { create(:harvest, owner: member) }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let!(:auth) { FactoryBot.create(:flickr_authentication, member:) } let!(:auth) { create(:flickr_authentication, member:) }
before do before do
sign_in member sign_in member
@@ -97,11 +97,11 @@ describe PhotosController, :search do
link_url: "http://example.com") link_url: "http://example.com")
end end
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:garden) { FactoryBot.create(:garden, owner: member) } let(:garden) { create(:garden, owner: member) }
let(:planting) { FactoryBot.create(:planting, garden:, owner: member) } let(:planting) { create(:planting, garden:, owner: member) }
let(:harvest) { FactoryBot.create(:harvest, owner: member) } let(:harvest) { create(:harvest, owner: member) }
let(:photo) { FactoryBot.create(:photo, owner: member) } let(:photo) { create(:photo, owner: member) }
describe "with valid params" do describe "with valid params" do
before { controller.stub(:current_member) { member } } before { controller.stub(:current_member) { member } }
@@ -153,7 +153,7 @@ describe PhotosController, :search do
end end
it "doesn't attach photo to a comment" do it "doesn't attach photo to a comment" do
comment = FactoryBot.create(:comment) comment = create(:comment)
expect do expect do
post :create, params: { post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "comment", id: comment.id photo: { source_id: photo.source_id, source: 'flickr' }, type: "comment", id: comment.id
@@ -163,7 +163,7 @@ describe PhotosController, :search do
end end
describe "for the second time" do describe "for the second time" do
let(:planting) { FactoryBot.create(:planting, owner: member) } let(:planting) { create(:planting, owner: member) }
let(:valid_params) { { photo: { source_id: 1 }, id: planting.id, type: 'planting' } } let(:valid_params) { { photo: { source_id: 1 }, id: planting.id, type: 'planting' } }
it "does not add a photo twice" do it "does not add a photo twice" do
@@ -176,8 +176,8 @@ describe PhotosController, :search do
before { controller.stub(:current_member) { member } } before { controller.stub(:current_member) { member } }
describe "creates the planting/photo link" do describe "creates the planting/photo link" do
let(:planting) { FactoryBot.create(:planting, garden:, owner: member) } let(:planting) { create(:planting, garden:, owner: member) }
let(:photo) { FactoryBot.create(:photo, owner: member) } let(:photo) { create(:photo, owner: member) }
before { post :create, params: { photo: { source_id: photo.source_id, source: 'flickr' }, type: "planting", id: planting.id } } before { post :create, params: { photo: { source_id: photo.source_id, source: 'flickr' }, type: "planting", id: planting.id } }
@@ -196,11 +196,11 @@ describe PhotosController, :search do
end end
describe "with mismatched owners" do describe "with mismatched owners" do
let(:photo) { FactoryBot.create(:photo) } let(:photo) { create(:photo) }
it "does not create the planting/photo link" do it "does not create the planting/photo link" do
# members will be auto-created, and different # members will be auto-created, and different
another_planting = FactoryBot.create(:planting) another_planting = create(:planting)
expect do expect do
post :create, params: { post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, photo: { source_id: photo.source_id, source: 'flickr' },
@@ -212,7 +212,7 @@ describe PhotosController, :search do
it "does not create the harvest/photo link" do it "does not create the harvest/photo link" do
# members will be auto-created, and different # members will be auto-created, and different
another_harvest = FactoryBot.create(:harvest) another_harvest = create(:harvest)
expect do expect do
post :create, params: { post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: another_harvest.id photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: another_harvest.id

View File

@@ -9,8 +9,8 @@ describe PlacesController do
describe "GET show" do describe "GET show" do
before do before do
@member_london = FactoryBot.create(:london_member) @member_london = create(:london_member)
@member_south_pole = FactoryBot.create(:south_pole_member) @member_south_pole = create(:south_pole_member)
end end
it "assigns place name" do it "assigns place name" do

View File

@@ -1,6 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
describe PlantPartsController do
end

View File

@@ -7,18 +7,18 @@ describe PlantingsController, :search do
def valid_attributes def valid_attributes
{ {
garden_id: FactoryBot.create(:garden, owner: subject.current_member).id, garden_id: create(:garden, owner: subject.current_member).id,
crop_id: FactoryBot.create(:crop).id crop_id: create(:crop).id
} }
end end
describe "GET index", :search do describe "GET index", :search do
let!(:member1) { FactoryBot.create(:member) } let!(:member1) { create(:member) }
let!(:member2) { FactoryBot.create(:member) } let!(:member2) { create(:member) }
let!(:tomato) { FactoryBot.create(:tomato) } let!(:tomato) { create(:tomato) }
let!(:maize) { FactoryBot.create(:maize) } let!(:maize) { create(:maize) }
let!(:planting1) { FactoryBot.create(:planting, crop: tomato, owner: member1, created_at: 1.day.ago) } let!(:planting1) { create(:planting, crop: tomato, owner: member1, created_at: 1.day.ago) }
let!(:planting2) { FactoryBot.create(:planting, crop: maize, owner: member2, created_at: 5.days.ago) } let!(:planting2) { create(:planting, crop: maize, owner: member2, created_at: 5.days.ago) }
before do before do
Planting.reindex Planting.reindex
@@ -50,7 +50,7 @@ describe PlantingsController, :search do
describe "GET new" do describe "GET new" do
describe "picks up crop from params" do describe "picks up crop from params" do
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
before { get :new, params: { crop_id: crop.id } } before { get :new, params: { crop_id: crop.id } }
@@ -64,7 +64,7 @@ describe PlantingsController, :search do
end end
describe "picks up member's garden from params" do describe "picks up member's garden from params" do
let(:garden) { FactoryBot.create(:garden, owner: member) } let(:garden) { create(:garden, owner: member) }
before { get :new, params: { garden_id: garden.id } } before { get :new, params: { garden_id: garden.id } }
@@ -72,8 +72,8 @@ describe PlantingsController, :search do
end end
describe "Doesn't display another member's garden on planting form" do describe "Doesn't display another member's garden on planting form" do
let(:another_member) { FactoryBot.create(:member) } # over-riding member from login_member() let(:another_member) { create(:member) } # over-riding member from login_member()
let(:garden) { FactoryBot.create(:garden, owner: another_member) } let(:garden) { create(:garden, owner: another_member) }
before { get :new, params: { garden_id: garden.id } } before { get :new, params: { garden_id: garden.id } }
@@ -81,8 +81,8 @@ describe PlantingsController, :search do
end end
describe "Doesn't display un-approved crops on planting form" do describe "Doesn't display un-approved crops on planting form" do
let(:crop) { FactoryBot.create(:crop, approval_status: 'pending') } let(:crop) { create(:crop, approval_status: 'pending') }
let!(:garden) { FactoryBot.create(:garden, owner: member) } let!(:garden) { create(:garden, owner: member) }
before { get :new, params: { crop_id: crop.id } } before { get :new, params: { crop_id: crop.id } }
@@ -90,8 +90,8 @@ describe PlantingsController, :search do
end end
describe "Doesn't display rejected crops on planting form" do describe "Doesn't display rejected crops on planting form" do
let(:crop) { FactoryBot.create(:crop, approval_status: 'rejected', reason_for_rejection: 'nope') } let(:crop) { create(:crop, approval_status: 'rejected', reason_for_rejection: 'nope') }
let!(:garden) { FactoryBot.create(:garden, owner: member) } let!(:garden) { create(:garden, owner: member) }
before { get :new, params: { crop_id: crop.id } } before { get :new, params: { crop_id: crop.id } }
@@ -111,7 +111,7 @@ describe PlantingsController, :search do
end end
context 'with parent seed' do context 'with parent seed' do
let(:seed) { FactoryBot.create(:seed, owner: member) } let(:seed) { create(:seed, owner: member) }
before { get :new, params: { seed_id: seed.to_param } } before { get :new, params: { seed_id: seed.to_param } }
@@ -128,8 +128,8 @@ describe PlantingsController, :search do
end end
describe 'GET :edit' do describe 'GET :edit' do
let(:my_planting) { FactoryBot.create(:planting, owner: member) } let(:my_planting) { create(:planting, owner: member) }
let(:not_my_planting) { FactoryBot.create(:planting) } let(:not_my_planting) { create(:planting) }
context 'my planting' do context 'my planting' do
before { get :edit, params: { slug: my_planting } } before { get :edit, params: { slug: my_planting } }

View File

@@ -6,14 +6,14 @@ describe PostsController do
login_member login_member
def valid_attributes def valid_attributes
member = FactoryBot.create(:member) member = create(:member)
{ author_id: member.id, subject: "blah", body: "blah blah" } { author_id: member.id, subject: "blah", body: "blah blah" }
end end
describe '#index' do describe '#index' do
before do before do
FactoryBot.create_list(:post, 100) create_list(:post, 100)
FactoryBot.create_list(:post, 5, author: member) create_list(:post, 5, author: member)
end end
describe "everyone's posts" do describe "everyone's posts" do

View File

@@ -4,7 +4,7 @@ require 'rails_helper'
describe RegistrationsController do describe RegistrationsController do
before do before do
@member = FactoryBot.create(:member) @member = create(:member)
sign_in @member sign_in @member
controller.stub(:current_user) { @member } controller.stub(:current_user) { @member }
controller.stub(:devise_mapping).and_return(Devise.mappings[:member]) controller.stub(:devise_mapping).and_return(Devise.mappings[:member])
@@ -17,7 +17,7 @@ describe RegistrationsController do
end end
it "picks up the flickr auth" do it "picks up the flickr auth" do
@auth = FactoryBot.create(:flickr_authentication, member: @member) @auth = create(:flickr_authentication, member: @member)
get :edit get :edit
assigns(:flickr_auth).should eq @auth assigns(:flickr_auth).should eq @auth
end end

View File

@@ -5,7 +5,7 @@ require 'rails_helper'
describe ScientificNamesController do describe ScientificNamesController do
login_member(:crop_wrangling_member) login_member(:crop_wrangling_member)
let!(:crop) { FactoryBot.create(:tomato) } let!(:crop) { create(:tomato) }
def valid_attributes def valid_attributes
{ name: 'Solanum lycopersicum', crop_id: crop.id } { name: 'Solanum lycopersicum', crop_id: crop.id }

View File

@@ -3,7 +3,7 @@
require 'rails_helper' require 'rails_helper'
describe SeedsController, :search do describe SeedsController, :search do
let(:owner) { FactoryBot.create(:member) } let(:owner) { create(:member) }
describe "GET index" do describe "GET index" do
describe "picks up owner from params" do describe "picks up owner from params" do
@@ -26,7 +26,7 @@ describe SeedsController, :search do
end end
context 'with parent planting' do context 'with parent planting' do
let!(:planting) { FactoryBot.create(:planting, owner:) } let!(:planting) { create(:planting, owner:) }
before do before do
Seed.reindex Seed.reindex

View File

@@ -1,6 +0,0 @@
# frozen_string_literal: true
FactoryBot.define do
factory :crop_companion do
end
end

View File

@@ -18,7 +18,7 @@ describe "Conversations", :js do
click_link 'Inbox' click_link 'Inbox'
end end
include_examples 'is accessible' it_behaves_like 'is accessible'
it { expect(page).to have_content 'something i want to say' } it { expect(page).to have_content 'something i want to say' }
it { page.percy_snapshot(page, name: 'conversations#index') } it { page.percy_snapshot(page, name: 'conversations#index') }
@@ -73,13 +73,13 @@ describe "Conversations", :js do
click_link recipient.login_name click_link recipient.login_name
click_link 'Inbox' click_link 'Inbox'
expect(page).to have_selector('.sent') expect(page).to have_css('.sent')
find('.sent').click find('.sent').click
all('input[type=checkbox]').each(&:click) all('input[type=checkbox]').each(&:click)
click_button 'Delete' click_button 'Delete'
expect(page).to have_selector('.sent') expect(page).to have_css('.sent')
find('.sent').click find('.sent').click
expect(page).to have_no_content 'this is a message' expect(page).to have_no_content 'this is a message'
expect(page).to have_no_content 'this is another message' expect(page).to have_no_content 'this is another message'

View File

@@ -83,23 +83,23 @@ describe "Alternate names", :js do
end end
context 'Anonymous' do context 'Anonymous' do
include_examples 'show alt names' it_behaves_like 'show alt names'
end end
context 'Signed in member' do context 'Signed in member' do
include_context 'signed in member' include_context 'signed in member'
include_examples 'show alt names' it_behaves_like 'show alt names'
end end
context 'Crop wrangler' do context 'Crop wrangler' do
include_context 'signed in crop wrangler' include_context 'signed in crop wrangler'
include_examples 'show alt names' it_behaves_like 'show alt names'
include_examples 'edit alt names' it_behaves_like 'edit alt names'
end end
context 'Admin' do context 'Admin' do
include_context 'signed in admin' include_context 'signed in admin'
include_examples 'show alt names' it_behaves_like 'show alt names'
include_examples 'edit alt names' it_behaves_like 'edit alt names'
end end
end end

View File

@@ -3,10 +3,10 @@
require 'rails_helper' require 'rails_helper'
describe "browse crops", :search do describe "browse crops", :search do
let!(:tomato) { FactoryBot.create(:tomato, :reindex) } let!(:tomato) { create(:tomato, :reindex) }
let!(:maize) { FactoryBot.create(:maize, :reindex) } let!(:maize) { create(:maize, :reindex) }
let!(:pending_crop) { FactoryBot.create(:crop_request, :reindex) } let!(:pending_crop) { create(:crop_request, :reindex) }
let!(:rejected_crop) { FactoryBot.create(:rejected_crop, :reindex) } let!(:rejected_crop) { create(:rejected_crop, :reindex) }
shared_examples 'shows crops' do shared_examples 'shows crops' do
before do before do
@@ -34,25 +34,25 @@ describe "browse crops", :search do
end end
context 'anon' do context 'anon' do
include_examples 'shows crops' it_behaves_like 'shows crops'
it { expect(page).to have_no_link "Add New Crop" } it { expect(page).to have_no_link "Add New Crop" }
end end
context 'member' do context 'member' do
include_context 'signed in member' include_context 'signed in member'
include_examples 'shows crops' it_behaves_like 'shows crops'
include_examples 'add new crop' it_behaves_like 'add new crop'
end end
context 'wrangler' do context 'wrangler' do
include_context 'signed in crop wrangler' include_context 'signed in crop wrangler'
include_examples 'shows crops' it_behaves_like 'shows crops'
include_examples 'add new crop' it_behaves_like 'add new crop'
end end
context 'admin' do context 'admin' do
include_context 'signed in admin' include_context 'signed in admin'
include_examples 'shows crops' it_behaves_like 'shows crops'
include_examples 'add new crop' it_behaves_like 'add new crop'
end end
end end

View File

@@ -33,7 +33,7 @@ describe "Crop", :js do
shared_examples 'request crop' do shared_examples 'request crop' do
describe "requesting a crop with multiple scientific and alternate name" do describe "requesting a crop with multiple scientific and alternate name" do
include_examples 'fill in form' it_behaves_like 'fill in form'
before do before do
within "form#new_crop" do within "form#new_crop" do
fill_in "request_notes", with: "This is the Philippine national flower." fill_in "request_notes", with: "This is the Philippine national flower."
@@ -50,7 +50,7 @@ describe "Crop", :js do
shared_examples 'create crop' do shared_examples 'create crop' do
describe "creating a crop with multiple scientific and alternate name" do describe "creating a crop with multiple scientific and alternate name" do
include_examples 'fill in form' it_behaves_like 'fill in form'
before do before do
click_button "Save" click_button "Save"
end end
@@ -69,16 +69,16 @@ describe "Crop", :js do
context 'member' do context 'member' do
include_context 'signed in member' include_context 'signed in member'
include_examples 'request crop' it_behaves_like 'request crop'
end end
context 'crop wrangler' do context 'crop wrangler' do
include_context 'signed in crop wrangler' include_context 'signed in crop wrangler'
include_examples 'create crop' it_behaves_like 'create crop'
end end
context 'admin' do context 'admin' do
include_context 'signed in admin' include_context 'signed in admin'
include_examples 'create crop' it_behaves_like 'create crop'
end end
end end

View File

@@ -14,7 +14,7 @@ describe "crop detail page", :js do
end end
before do before do
FactoryBot.create(:plant_part, name: 'leaf') create(:plant_part, name: 'leaf')
end end
let(:crop) { create(:crop) } let(:crop) { create(:crop) }
@@ -112,14 +112,14 @@ describe "crop detail page", :js do
describe 'with harvest history data' do describe 'with harvest history data' do
before do before do
# 50 days to harvest # 50 days to harvest
FactoryBot.create(:harvest, harvested_at: 150.days.ago, crop:, create(:harvest, harvested_at: 150.days.ago, crop:,
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:)) planting: create(:planting, planted_at: 200.days.ago, crop:))
# 20 days to harvest # 20 days to harvest
FactoryBot.create(:harvest, harvested_at: 180.days.ago, crop:, create(:harvest, harvested_at: 180.days.ago, crop:,
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:)) planting: create(:planting, planted_at: 200.days.ago, crop:))
# 10 days to harvest # 10 days to harvest
FactoryBot.create(:harvest, harvested_at: 190.days.ago, crop:, create(:harvest, harvested_at: 190.days.ago, crop:,
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:)) planting: create(:planting, planted_at: 200.days.ago, crop:))
crop.update_medians crop.update_medians
end end
@@ -131,13 +131,13 @@ describe "crop detail page", :js do
context 'predictions' do context 'predictions' do
let!(:planting) do let!(:planting) do
FactoryBot.create(:planting, crop:, create(:planting, crop:,
planted_at: 100.days.ago, planted_at: 100.days.ago,
finished_at: 1.day.ago) finished_at: 1.day.ago)
end end
context 'crop is an Annual' do context 'crop is an Annual' do
let(:crop) { FactoryBot.create(:annual_crop) } let(:crop) { create(:annual_crop) }
describe 'with harvests' do describe 'with harvests' do
it_behaves_like "predicts harvest" it_behaves_like "predicts harvest"
@@ -155,10 +155,7 @@ describe "crop detail page", :js do
end end
context 'crop is Perennial' do context 'crop is Perennial' do
let(:crop) { FactoryBot.create(:perennial_crop) } let(:crop) { create(:perennial_crop) }
describe 'with no harvests' do
end
describe 'with harvests' do describe 'with harvests' do
it_behaves_like "predicts harvest" it_behaves_like "predicts harvest"
@@ -171,10 +168,7 @@ describe "crop detail page", :js do
end end
context 'crop Perennial value is null' do context 'crop Perennial value is null' do
let(:crop) { FactoryBot.create(:crop, perennial: nil) } let(:crop) { create(:crop, perennial: nil) }
describe 'with no harvests' do
end
describe 'with harvests' do describe 'with harvests' do
it_behaves_like "predicts harvest" it_behaves_like "predicts harvest"
@@ -186,7 +180,7 @@ describe "crop detail page", :js do
before { visit crop_path(crop) } before { visit crop_path(crop) }
context 'crop is an Annual' do context 'crop is an Annual' do
let(:crop) { FactoryBot.create(:annual_crop) } let(:crop) { create(:annual_crop) }
it { expect(page).to have_text 'Annual' } it { expect(page).to have_text 'Annual' }
it { expect(page).to have_text 'living and reproducing in a single year or less' } it { expect(page).to have_text 'living and reproducing in a single year or less' }
@@ -194,7 +188,7 @@ describe "crop detail page", :js do
end end
context 'crop is Perennial' do context 'crop is Perennial' do
let(:crop) { FactoryBot.create(:perennial_crop) } let(:crop) { create(:perennial_crop) }
it { expect(find('.index-cards.facts')).to have_text 'Perennial' } it { expect(find('.index-cards.facts')).to have_text 'Perennial' }
it { expect(page).to have_text 'living more than two years' } it { expect(page).to have_text 'living more than two years' }
@@ -202,7 +196,7 @@ describe "crop detail page", :js do
end end
context 'crop Perennial value is null' do context 'crop Perennial value is null' do
let(:crop) { FactoryBot.create(:crop, perennial: nil) } let(:crop) { create(:crop, perennial: nil) }
it { expect(find('.index-cards.facts')).to have_no_text 'Perennial' } it { expect(find('.index-cards.facts')).to have_no_text 'Perennial' }
it { expect(page).to have_no_text 'Annual' } it { expect(page).to have_no_text 'Annual' }

View File

@@ -5,22 +5,22 @@ require 'rails_helper'
describe "crop detail page", :js, :search do describe "crop detail page", :js, :search do
subject { page } subject { page }
let!(:owner_member) { FactoryBot.create(:member) } let!(:owner_member) { create(:member) }
let!(:crop) { FactoryBot.create(:crop, :reindex) } let!(:crop) { create(:crop, :reindex) }
let(:plant_part) { FactoryBot.create(:plant_part, name: 'fruit') } let(:plant_part) { create(:plant_part, name: 'fruit') }
let!(:harvest) { FactoryBot.create(:harvest, crop:, owner: owner_member, plant_part:) } let!(:harvest) { create(:harvest, crop:, owner: owner_member, plant_part:) }
let!(:planting) { FactoryBot.create(:planting, crop:, owner: owner_member) } let!(:planting) { create(:planting, crop:, owner: owner_member) }
let!(:seed) { FactoryBot.create(:seed, crop:, owner: owner_member) } let!(:seed) { create(:seed, crop:, owner: owner_member) }
let!(:photo1) { FactoryBot.create(:photo, owner: owner_member) } let!(:photo1) { create(:photo, owner: owner_member) }
let!(:photo2) { FactoryBot.create(:photo, owner: owner_member) } let!(:photo2) { create(:photo, owner: owner_member) }
let!(:photo3) { FactoryBot.create(:photo, owner: owner_member) } let!(:photo3) { create(:photo, owner: owner_member) }
let!(:photo4) { FactoryBot.create(:photo, owner: owner_member) } let!(:photo4) { create(:photo, owner: owner_member) }
let!(:photo5) { FactoryBot.create(:photo, owner: owner_member) } let!(:photo5) { create(:photo, owner: owner_member) }
let!(:photo6) { FactoryBot.create(:photo, owner: owner_member) } let!(:photo6) { create(:photo, owner: owner_member) }
before do before do
planting.photos << photo1 planting.photos << photo1
@@ -59,17 +59,17 @@ describe "crop detail page", :js, :search do
context "when signed in" do context "when signed in" do
include_context 'signed in member' include_context 'signed in member'
include_examples "shows photos" it_behaves_like "shows photos"
end end
context "when signed in as photos owner" do context "when signed in as photos owner" do
include_context 'signed in member' include_context 'signed in member'
let(:member) { owner_member } let(:member) { owner_member }
include_examples "shows photos" it_behaves_like "shows photos"
end end
context "when not signed in" do context "when not signed in" do
include_examples "shows photos" it_behaves_like "shows photos"
end end
end end

View File

@@ -4,8 +4,8 @@ require 'rails_helper'
describe "Delete crop spec" do describe "Delete crop spec" do
shared_examples 'delete crop' do shared_examples 'delete crop' do
let!(:pending_crop) { FactoryBot.create(:crop_request) } let!(:pending_crop) { create(:crop_request) }
let!(:approved_crop) { FactoryBot.create(:crop) } let!(:approved_crop) { create(:crop) }
it "deletes approved crop" do it "deletes approved crop" do
visit crop_path(approved_crop) visit crop_path(approved_crop)
click_link 'Actions' click_link 'Actions'
@@ -27,11 +27,11 @@ describe "Delete crop spec" do
context "As a crop wrangler" do context "As a crop wrangler" do
include_context 'signed in crop wrangler' include_context 'signed in crop wrangler'
include_examples 'delete crop' it_behaves_like 'delete crop'
end end
context 'admin' do context 'admin' do
include_context 'signed in admin' include_context 'signed in admin'
include_examples 'delete crop' it_behaves_like 'delete crop'
end end
end end

View File

@@ -3,7 +3,7 @@
require 'rails_helper' require 'rails_helper'
describe "browse crops" do describe "browse crops" do
let(:tomato) { FactoryBot.create(:tomato) } let(:tomato) { create(:tomato) }
it "Show crop info" do it "Show crop info" do
visit crop_path(tomato) visit crop_path(tomato)
@@ -11,9 +11,9 @@ describe "browse crops" do
end end
describe "shows varieties" do describe "shows varieties" do
let!(:cherry) { FactoryBot.create(:crop, name: 'cherry tomato', parent: tomato) } let!(:cherry) { create(:crop, name: 'cherry tomato', parent: tomato) }
let!(:heirloom) { FactoryBot.create(:crop, name: 'heirloom tomato', parent: tomato) } let!(:heirloom) { create(:crop, name: 'heirloom tomato', parent: tomato) }
let!(:striped) { FactoryBot.create(:crop, name: 'striped tomato', parent: heirloom) } let!(:striped) { create(:crop, name: 'striped tomato', parent: heirloom) }
before { visit crop_path(tomato) } before { visit crop_path(tomato) }
@@ -23,10 +23,10 @@ describe "browse crops" do
end end
context "when the most recently created harvest is not the most recently harvested" do context "when the most recently created harvest is not the most recently harvested" do
before { FactoryBot.create_list(:harvest, 20, crop: tomato, harvested_at: 1.year.ago, created_at: 1.minute.ago) } before { create_list(:harvest, 20, crop: tomato, harvested_at: 1.year.ago, created_at: 1.minute.ago) }
let!(:most_recent_harvest) do let!(:most_recent_harvest) do
FactoryBot.create(:harvest, crop: tomato, harvested_at: 60.minutes.ago, created_at: 10.minutes.ago) create(:harvest, crop: tomato, harvested_at: 60.minutes.ago, created_at: 10.minutes.ago)
end end
it "Shows most recently harvested harvest" do it "Shows most recently harvested harvest" do
@@ -36,10 +36,10 @@ describe "browse crops" do
end end
context "when the most recently created planting is not the most recently planted" do context "when the most recently created planting is not the most recently planted" do
before { FactoryBot.create_list(:planting, 20, crop: tomato, planted_at: 1.year.ago, created_at: 1.minute.ago) } before { create_list(:planting, 20, crop: tomato, planted_at: 1.year.ago, created_at: 1.minute.ago) }
let!(:most_recent_planting) do let!(:most_recent_planting) do
FactoryBot.create(:planting, crop: tomato, planted_at: 60.minutes.ago, created_at: 10.minutes.ago) create(:planting, crop: tomato, planted_at: 60.minutes.ago, created_at: 10.minutes.ago)
end end
it "Shows most recently planted planting" do it "Shows most recently planted planting" do

View File

@@ -10,7 +10,7 @@ describe "footer" do
end end
it 'has the Open Service link and graphic' do it 'has the Open Service link and graphic' do
expect(page).to have_selector 'a[href="https://opendefinition.org/ossd/"]' expect(page).to have_css 'a[href="https://opendefinition.org/ossd/"]'
end end
# NB: not testing specific content in the footer since I'm going to put them # NB: not testing specific content in the footer since I'm going to put them

View File

@@ -9,7 +9,7 @@ describe "Gardens" do
include_context 'signed in member' include_context 'signed in member'
let(:garden) { member.gardens.first } let(:garden) { member.gardens.first }
let(:other_member_garden) { FactoryBot.create(:garden) } let(:other_member_garden) { create(:garden) }
describe '#index' do describe '#index' do
shared_examples "has buttons bar at top" do shared_examples "has buttons bar at top" do
@@ -25,7 +25,7 @@ describe "Gardens" do
context 'my gardens' do context 'my gardens' do
before { visit gardens_path(member_slug: member.slug) } before { visit gardens_path(member_slug: member.slug) }
include_examples "has buttons bar at top" it_behaves_like "has buttons bar at top"
context 'with actions menu expanded' do context 'with actions menu expanded' do
before { click_link 'Actions' } before { click_link 'Actions' }
@@ -43,13 +43,13 @@ describe "Gardens" do
context 'all gardens' do context 'all gardens' do
before { visit gardens_path } before { visit gardens_path }
include_examples "has buttons bar at top" it_behaves_like "has buttons bar at top"
end end
context "other member's garden" do context "other member's garden" do
before { visit gardens_path(member_slug: FactoryBot.create(:member).slug) } before { visit gardens_path(member_slug: create(:member).slug) }
include_examples "has buttons bar at top" it_behaves_like "has buttons bar at top"
describe 'does not show actions on other member garden' do describe 'does not show actions on other member garden' do
it { is_expected.to have_no_link 'Actions' } it { is_expected.to have_no_link 'Actions' }
end end

View File

@@ -8,13 +8,13 @@ describe "Gardens", :js do
include_context 'signed in member' include_context 'signed in member'
before { visit new_garden_path } before { visit new_garden_path }
include_examples 'is accessible' it_behaves_like 'is accessible'
it "displays required and optional fields properly" do it "displays required and optional fields properly" do
expect(page).to have_selector ".required", text: "Name" expect(page).to have_css ".required", text: "Name"
expect(page).to have_selector 'textarea#garden_description' expect(page).to have_css 'textarea#garden_description'
expect(page).to have_selector 'input#garden_location' expect(page).to have_css 'input#garden_location'
expect(page).to have_selector 'input#garden_area' expect(page).to have_css 'input#garden_area'
end end
it "Create new garden" do it "Create new garden" do

View File

@@ -6,15 +6,15 @@ require 'custom_matchers'
describe "Gardens#index", :js do describe "Gardens#index", :js do
context "Logged in as member" do context "Logged in as member" do
include_context 'signed in member' include_context 'signed in member'
let(:member) { FactoryBot.create(:member, login_name: 'shadow') } let(:member) { create(:member, login_name: 'shadow') }
context "with 10 gardens" do context "with 10 gardens" do
before do before do
FactoryBot.create_list(:garden, 10, owner: member) create_list(:garden, 10, owner: member)
visit member_gardens_path(member_slug: member.slug) visit member_gardens_path(member_slug: member.slug)
end end
include_examples 'is accessible' it_behaves_like 'is accessible'
it "displays each of the gardens" do it "displays each of the gardens" do
member.gardens.each do |garden| member.gardens.each do |garden|
@@ -30,8 +30,8 @@ describe "Gardens#index", :js do
end end
context "with inactive gardens" do context "with inactive gardens" do
let!(:active_garden) { FactoryBot.create(:garden, name: "My active garden", owner: member) } let!(:active_garden) { create(:garden, name: "My active garden", owner: member) }
let!(:inactive_garden) { FactoryBot.create(:inactive_garden, name: "retired garden", owner: member) } let!(:inactive_garden) { create(:inactive_garden, name: "retired garden", owner: member) }
before { visit member_gardens_path(member_slug: member.slug) } before { visit member_gardens_path(member_slug: member.slug) }
@@ -53,14 +53,14 @@ describe "Gardens#index", :js do
end end
context 'with plantings' do context 'with plantings' do
let(:maize) { FactoryBot.create(:maize) } let(:maize) { create(:maize) }
let(:tomato) { FactoryBot.create(:tomato) } let(:tomato) { create(:tomato) }
let!(:planting) do let!(:planting) do
FactoryBot.create(:planting, owner: member, crop: maize, garden: member.gardens.first) create(:planting, owner: member, crop: maize, garden: member.gardens.first)
end end
let!(:finished_planting) do let!(:finished_planting) do
FactoryBot.create(:finished_planting, owner: member, crop: tomato, garden: member.gardens.first) create(:finished_planting, owner: member, crop: tomato, garden: member.gardens.first)
end end
before do before do
@@ -79,19 +79,19 @@ describe "Gardens#index", :js do
describe 'badges' do describe 'badges' do
let(:garden) { member.gardens.first } let(:garden) { member.gardens.first }
let(:member) { FactoryBot.create(:member, login_name: 'robbieburns') } let(:member) { create(:member, login_name: 'robbieburns') }
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
before do before do
# time to harvest = 50 day # time to harvest = 50 day
# time to finished = 90 days # time to finished = 90 days
FactoryBot.create(:harvest, create(:harvest,
harvested_at: 50.days.ago, harvested_at: 50.days.ago,
crop:, crop:,
planting: FactoryBot.create(:planting, planting: create(:planting,
crop:, crop:,
planted_at: 100.days.ago, planted_at: 100.days.ago,
finished_at: 10.days.ago)) finished_at: 10.days.ago))
crop.plantings.each(&:update_harvest_days!) crop.plantings.each(&:update_harvest_days!)
crop.update_lifespan_medians crop.update_lifespan_medians
crop.update_harvest_medians crop.update_harvest_medians
@@ -103,11 +103,11 @@ describe "Gardens#index", :js do
describe 'harvest still growing' do describe 'harvest still growing' do
let!(:planting) do let!(:planting) do
FactoryBot.create(:planting, create(:planting,
crop:, crop:,
owner: member, owner: member,
garden:, garden:,
planted_at: Time.zone.today) planted_at: Time.zone.today)
end end
it { expect(page).to have_link href: planting_path(planting) } it { expect(page).to have_link href: planting_path(planting) }
@@ -118,10 +118,10 @@ describe "Gardens#index", :js do
describe 'harvesting now' do describe 'harvesting now' do
let!(:planting) do let!(:planting) do
FactoryBot.create(:planting, create(:planting,
crop:, crop:,
owner: member, garden:, owner: member, garden:,
planted_at: 51.days.ago) planted_at: 51.days.ago)
end end
it { expect(crop.median_days_to_first_harvest).to eq 50 } it { expect(crop.median_days_to_first_harvest).to eq 50 }
@@ -133,9 +133,9 @@ describe "Gardens#index", :js do
describe 'super late' do describe 'super late' do
let!(:planting) do let!(:planting) do
FactoryBot.create(:planting, create(:planting,
crop:, owner: member, crop:, owner: member,
garden:, planted_at: 260.days.ago) garden:, planted_at: 260.days.ago)
end end
it { expect(page).to have_text 'super late' } it { expect(page).to have_text 'super late' }

View File

@@ -14,10 +14,10 @@ describe "Harvesting a crop", :js, :search do
it_behaves_like "crop suggest", "harvest", "crop" it_behaves_like "crop suggest", "harvest", "crop"
describe "displays required and optional fields properly" do describe "displays required and optional fields properly" do
it { expect(page).to have_selector ".required", text: "What did you harvest?" } it { expect(page).to have_css ".required", text: "What did you harvest?" }
it { expect(page).to have_selector 'input#harvest_quantity' } it { expect(page).to have_css 'input#harvest_quantity' }
it { expect(page).to have_selector 'input#harvest_weight_quantity' } it { expect(page).to have_css 'input#harvest_weight_quantity' }
it { expect(page).to have_selector 'textarea#harvest_description' } it { expect(page).to have_css 'textarea#harvest_description' }
end end
it "Creating a new harvest", :js do it "Creating a new harvest", :js do

View File

@@ -5,18 +5,18 @@ require 'rails_helper'
describe "home page", :search do describe "home page", :search do
subject { page } subject { page }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:photo) { FactoryBot.create(:photo, owner: member) } let(:photo) { create(:photo, owner: member) }
let(:crop) { FactoryBot.create(:crop, created_at: 1.day.ago) } let(:crop) { create(:crop, created_at: 1.day.ago) }
let(:planting) { FactoryBot.create(:planting, owner: member, crop:) } let(:planting) { create(:planting, owner: member, crop:) }
let(:seed) { FactoryBot.create(:tradable_seed, owner: member, crop:) } let(:seed) { create(:tradable_seed, owner: member, crop:) }
let(:harvest) { FactoryBot.create(:harvest, owner: member, crop:) } let(:harvest) { create(:harvest, owner: member, crop:) }
let!(:tradable_seed) { FactoryBot.create(:tradable_seed, :reindex, finished: false) } let!(:tradable_seed) { create(:tradable_seed, :reindex, finished: false) }
let!(:finished_seed) { FactoryBot.create(:tradable_seed, :reindex, finished: true) } let!(:finished_seed) { create(:tradable_seed, :reindex, finished: true) }
let!(:untradable_seed) { FactoryBot.create(:untradable_seed, :reindex) } let!(:untradable_seed) { create(:untradable_seed, :reindex) }
before do before do
# Add photos, so they can appear on home page # Add photos, so they can appear on home page

View File

@@ -3,12 +3,12 @@
require 'rails_helper' require 'rails_helper'
describe 'Likeable', :js, :search do describe 'Likeable', :js, :search do
let(:another_member) { FactoryBot.create(:london_member) } let(:another_member) { create(:london_member) }
let!(:post) { FactoryBot.create(:post, :reindex, author: member) } let!(:post) { create(:post, :reindex, author: member) }
let!(:activity) { FactoryBot.create(:activity, :reindex, owner: member) } let!(:activity) { create(:activity, :reindex, owner: member) }
let!(:photo) { FactoryBot.create(:photo, :reindex, owner: member) } let!(:photo) { create(:photo, :reindex, owner: member) }
let!(:harvest) { FactoryBot.create(:harvest, :reindex, owner: member) } let!(:harvest) { create(:harvest, :reindex, owner: member) }
let!(:planting) { FactoryBot.create(:planting, :reindex, owner: member) } let!(:planting) { create(:planting, :reindex, owner: member) }
before do before do
Photo.reindex Photo.reindex
@@ -58,23 +58,23 @@ describe 'Likeable', :js, :search do
describe 'photos#index' do describe 'photos#index' do
let(:path) { photos_path } let(:path) { photos_path }
include_examples 'object can be liked' it_behaves_like 'object can be liked'
end end
describe 'photos#show' do describe 'photos#show' do
let(:path) { photo_path(photo) } let(:path) { photo_path(photo) }
include_examples 'object can be liked' it_behaves_like 'object can be liked'
end end
describe 'crops#show' do describe 'crops#show' do
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
let(:planting) { FactoryBot.create(:planting, owner: member, crop:) } let(:planting) { create(:planting, owner: member, crop:) }
let(:path) { crop_path(crop) } let(:path) { crop_path(crop) }
before { planting.photos << photo } before { planting.photos << photo }
include_examples 'object can be liked' it_behaves_like 'object can be liked'
end end
end end
@@ -82,27 +82,27 @@ describe 'Likeable', :js, :search do
let(:like_count_class) { ".post-#{post.id} .like-count" } let(:like_count_class) { ".post-#{post.id} .like-count" }
let(:path) { post_path(post) } let(:path) { post_path(post) }
include_examples 'object can be liked' it_behaves_like 'object can be liked'
end end
describe 'activities' do describe 'activities' do
let(:like_count_class) { ".activity-#{activity.id} .like-count" } let(:like_count_class) { ".activity-#{activity.id} .like-count" }
let(:path) { activity_path(activity) } let(:path) { activity_path(activity) }
include_examples 'object can be liked' it_behaves_like 'object can be liked'
end end
describe 'plantings' do describe 'plantings' do
let(:like_count_class) { ".planting-#{planting.id} .like-count" } let(:like_count_class) { ".planting-#{planting.id} .like-count" }
let(:path) { planting_path(planting) } let(:path) { planting_path(planting) }
include_examples 'object can be liked' it_behaves_like 'object can be liked'
end end
describe 'harvests' do describe 'harvests' do
let(:like_count_class) { ".harvest-#{harvest.id} .like-count" } let(:like_count_class) { ".harvest-#{harvest.id} .like-count" }
let(:path) { harvest_path(harvest) } let(:path) { harvest_path(harvest) }
include_examples 'object can be liked' it_behaves_like 'object can be liked'
end end
end end

View File

@@ -5,7 +5,7 @@ require 'rails_helper'
describe "Changing locales", :js do describe "Changing locales", :js do
after { I18n.locale = :en } after { I18n.locale = :en }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
it "Locale can be set with a query param" do it "Locale can be set with a query param" do
# Login then log out, to ensure we're now logged out # Login then log out, to ensure we're now logged out

View File

@@ -3,8 +3,8 @@
require 'rails_helper' require 'rails_helper'
describe "members list" do describe "members list" do
let!(:spammer) { FactoryBot.create(:member) } let!(:spammer) { create(:member) }
let!(:admin) { FactoryBot.create(:admin_member) } let!(:admin) { create(:admin_member) }
context 'logged in as admin' do context 'logged in as admin' do
include_context 'signed in admin' include_context 'signed in admin'

View File

@@ -4,26 +4,26 @@ require 'rails_helper'
describe "member deletion", :flaky do describe "member deletion", :flaky do
context "with activity and followers" do context "with activity and followers" do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:other_member) { FactoryBot.create(:member) } let(:other_member) { create(:member) }
let(:memberpost) { FactoryBot.create(:post, author: member) } let(:memberpost) { create(:post, author: member) }
let(:othermemberpost) { FactoryBot.create(:post, author: other_member) } let(:othermemberpost) { create(:post, author: other_member) }
let!(:planting) { FactoryBot.create(:planting, owner: member) } let!(:planting) { create(:planting, owner: member) }
let!(:harvest) { FactoryBot.create(:harvest, owner: member) } let!(:harvest) { create(:harvest, owner: member) }
let!(:seed) { FactoryBot.create(:seed, owner: member) } let!(:seed) { create(:seed, owner: member) }
let!(:secondgarden) { FactoryBot.create(:garden, owner: member) } let!(:secondgarden) { create(:garden, owner: member) }
before do before do
member.follows.create!(followed: other_member) member.follows.create!(followed: other_member)
other_member.follows.create!(followed: member) other_member.follows.create!(followed: member)
login_as(member) login_as(member)
FactoryBot.create(:comment, author: member, post: othermemberpost) create(:comment, author: member, post: othermemberpost)
FactoryBot.create(:comment, author: other_member, post: memberpost, body: "Fun comment-y thing") create(:comment, author: other_member, post: memberpost, body: "Fun comment-y thing")
# deletion breaks if no wranglers exist # deletion breaks if no wranglers exist
FactoryBot.create(:cropbot) create(:cropbot)
# deletion breaks if ex_member doesn't exist # deletion breaks if ex_member doesn't exist
FactoryBot.create(:member, login_name: "ex_member") create(:member, login_name: "ex_member")
end end
it "has option to delete on member profile page" do it "has option to delete on member profile page" do
@@ -136,7 +136,7 @@ describe "member deletion", :flaky do
end end
it "replaces comments on others' posts with deletion note, leaving post intact" do it "replaces comments on others' posts with deletion note, leaving post intact" do
FactoryBot.create(:comment, post: othermemberpost, author: member, body: 'i am deleting my account') create(:comment, post: othermemberpost, author: member, body: 'i am deleting my account')
visit post_path(othermemberpost) visit post_path(othermemberpost)
expect(page).to have_no_content member.login_name expect(page).to have_no_content member.login_name
@@ -163,12 +163,12 @@ describe "member deletion", :flaky do
end end
context "for a crop wrangler" do context "for a crop wrangler" do
let(:member) { FactoryBot.create(:crop_wrangling_member) } let(:member) { create(:crop_wrangling_member) }
let!(:ex_wrangler) { FactoryBot.create(:crop_wrangling_member, login_name: "ex_wrangler") } let!(:ex_wrangler) { create(:crop_wrangling_member, login_name: "ex_wrangler") }
let(:otherwrangler) { FactoryBot.create(:crop_wrangling_member) } let(:otherwrangler) { create(:crop_wrangling_member) }
let(:crop) { FactoryBot.create(:crop, creator: member) } let(:crop) { create(:crop, creator: member) }
before { FactoryBot.create(:cropbot) } before { create(:cropbot) }
it "leaves crops behind" do it "leaves crops behind" do
login_as(otherwrangler) login_as(otherwrangler)

View File

@@ -13,7 +13,7 @@ describe "members list" do
before do before do
visit members_path visit members_path
expect(page).to have_css "#sort" expect(page).to have_css "#sort"
expect(page).to have_selector "form" expect(page).to have_css "form"
end end
it "default alphabetical sort" do it "default alphabetical sort" do

View File

@@ -62,10 +62,10 @@ describe "member profile", :js do
end end
context "with some activity" do context "with some activity" do
let!(:planting) { FactoryBot.create(:planting, owner: member) } let!(:planting) { create(:planting, owner: member) }
let!(:harvest) { FactoryBot.create(:harvest, owner: member) } let!(:harvest) { create(:harvest, owner: member) }
let!(:seed) { FactoryBot.create(:seed, owner: member) } let!(:seed) { create(:seed, owner: member) }
let!(:post) { FactoryBot.create(:post, author: member) } let!(:post) { create(:post, author: member) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -104,10 +104,10 @@ describe "member profile", :js do
shared_examples 'member activity' do shared_examples 'member activity' do
context 'member has plantings' do context 'member has plantings' do
let!(:new_planting) { FactoryBot.create(:planting, owner: member, planted_at: Time.zone.now) } let!(:new_planting) { create(:planting, owner: member, planted_at: Time.zone.now) }
let!(:old_planting) { FactoryBot.create(:planting, owner: member, planted_at: 3.years.ago) } let!(:old_planting) { create(:planting, owner: member, planted_at: 3.years.ago) }
let!(:finished_planting) { FactoryBot.create(:finished_planting, owner: member) } let!(:finished_planting) { create(:finished_planting, owner: member) }
let!(:no_planted_at_planting) { FactoryBot.create(:planting, owner: member, planted_at: nil) } let!(:no_planted_at_planting) { create(:planting, owner: member, planted_at: nil) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -118,9 +118,9 @@ describe "member profile", :js do
end end
context 'member has activities' do context 'member has activities' do
let!(:activity) { FactoryBot.create(:activity, owner: member, due_date: 3.days.ago) } let!(:activity) { create(:activity, owner: member, due_date: 3.days.ago) }
let!(:activity2) { FactoryBot.create(:activity, :planting, owner: member) } let!(:activity2) { create(:activity, :planting, owner: member) }
let!(:activity3) { FactoryBot.create(:activity, :garden, owner: member) } let!(:activity3) { create(:activity, :garden, owner: member) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -130,7 +130,7 @@ describe "member profile", :js do
end end
context 'member has seeds' do context 'member has seeds' do
let!(:seed) { FactoryBot.create(:seed, owner: member) } let!(:seed) { create(:seed, owner: member) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -138,7 +138,7 @@ describe "member profile", :js do
end end
context 'member has harvests' do context 'member has harvests' do
let!(:harvest) { FactoryBot.create(:harvest, owner: member) } let!(:harvest) { create(:harvest, owner: member) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -146,7 +146,7 @@ describe "member profile", :js do
end end
context 'member has posts' do context 'member has posts' do
let!(:post) { FactoryBot.create(:post, author: member) } let!(:post) { create(:post, author: member) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -154,8 +154,8 @@ describe "member profile", :js do
end end
context 'member has comments' do context 'member has comments' do
let(:post) { FactoryBot.create(:post) } let(:post) { create(:post) }
let!(:comment) { FactoryBot.create(:comment, commentable: post, author: member) } let!(:comment) { create(:comment, commentable: post, author: member) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -164,8 +164,8 @@ describe "member profile", :js do
end end
context 'photos' do context 'photos' do
let(:planting) { FactoryBot.create(:planting, owner: member) } let(:planting) { create(:planting, owner: member) }
let!(:photo) { FactoryBot.create(:photo, owner: member, plantings: [planting]) } let!(:photo) { create(:photo, owner: member, plantings: [planting]) }
before { visit member_path(member) } before { visit member_path(member) }
@@ -174,35 +174,35 @@ describe "member profile", :js do
end end
context 'plantings' do context 'plantings' do
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
let(:growing_planting) do let(:growing_planting) do
FactoryBot.create(:planting, create(:planting,
crop:, crop:,
owner: member, owner: member,
planted_at: Time.zone.today) planted_at: Time.zone.today)
end end
let(:harvesting_planting) do let(:harvesting_planting) do
FactoryBot.create(:planting, create(:planting,
crop:, crop:,
owner: member, owner: member,
planted_at: 51.days.ago) planted_at: 51.days.ago)
end end
let(:super_late_planting) do let(:super_late_planting) do
FactoryBot.create(:planting, create(:planting,
crop:, owner: member, crop:, owner: member,
planted_at: 260.days.ago) planted_at: 260.days.ago)
end end
before do before do
# time to harvest = 50 day # time to harvest = 50 day
# time to finished = 90 days # time to finished = 90 days
FactoryBot.create(:harvest, create(:harvest,
harvested_at: 50.days.ago, harvested_at: 50.days.ago,
crop:, crop:,
planting: FactoryBot.create(:planting, planting: create(:planting,
crop:, crop:,
planted_at: 100.days.ago, planted_at: 100.days.ago,
finished_at: 10.days.ago)) finished_at: 10.days.ago))
crop.plantings.each(&:update_harvest_days!) crop.plantings.each(&:update_harvest_days!)
crop.update_lifespan_medians crop.update_lifespan_medians
crop.update_harvest_medians crop.update_harvest_medians

View File

@@ -7,25 +7,25 @@ describe 'Test with visual testing', :js, type: :feature do
# on every run, so doesn't trigger percy to see changes # on every run, so doesn't trigger percy to see changes
before { Faker::Config.random = Random.new(42) } before { Faker::Config.random = Random.new(42) }
let!(:member) { FactoryBot.create(:member, login_name: 'percy', preferred_avatar_uri: gravatar) } let!(:member) { create(:member, login_name: 'percy', preferred_avatar_uri: gravatar) }
let!(:crop_wrangler) { FactoryBot.create(:crop_wrangling_member, login_name: 'croppy', preferred_avatar_uri: gravatar2) } let!(:crop_wrangler) { create(:crop_wrangling_member, login_name: 'croppy', preferred_avatar_uri: gravatar2) }
let!(:admin_user) { FactoryBot.create(:admin_member, login_name: 'janitor', preferred_avatar_uri: gravatar3) } let!(:admin_user) { create(:admin_member, login_name: 'janitor', preferred_avatar_uri: gravatar3) }
let!(:someone_else) { FactoryBot.create(:edinburgh_member, login_name: 'ruby', preferred_avatar_uri: gravatar4) } let!(:someone_else) { create(:edinburgh_member, login_name: 'ruby', preferred_avatar_uri: gravatar4) }
let(:gravatar) { 'https://secure.gravatar.com/avatar/d021434aac03a7f7c7c0de60d07dad1c?size=150&default=identicon' } let(:gravatar) { 'https://secure.gravatar.com/avatar/d021434aac03a7f7c7c0de60d07dad1c?size=150&default=identicon' }
let(:gravatar2) { 'https://secure.gravatar.com/avatar/353d83d3677b142520987e1936fd093c?size=150&default=identicon' } let(:gravatar2) { 'https://secure.gravatar.com/avatar/353d83d3677b142520987e1936fd093c?size=150&default=identicon' }
let(:gravatar3) { 'https://secure.gravatar.com/avatar/622db62c7beab8d5d8b7a80aa6385b2f?size=150&default=identicon' } let(:gravatar3) { 'https://secure.gravatar.com/avatar/622db62c7beab8d5d8b7a80aa6385b2f?size=150&default=identicon' }
let(:gravatar4) { 'https://secure.gravatar.com/avatar/7fd767571ff5ceefc7a687a543b2c402?size=150&default=identicon' } let(:gravatar4) { 'https://secure.gravatar.com/avatar/7fd767571ff5ceefc7a687a543b2c402?size=150&default=identicon' }
let!(:tomato) { FactoryBot.create(:tomato, creator: someone_else) } let!(:tomato) { create(:tomato, creator: someone_else) }
let(:plant_part) { FactoryBot.create(:plant_part, name: 'fruit') } let(:plant_part) { create(:plant_part, name: 'fruit') }
let(:tomato_photo) do let(:tomato_photo) do
FactoryBot.create(:photo, create(:photo,
title: 'look at my tomatoes', title: 'look at my tomatoes',
owner: member, owner: member,
fullsize_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_z.jpg', fullsize_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_z.jpg',
thumbnail_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_q.jpg') thumbnail_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_q.jpg')
end end
let(:post_body) do let(:post_body) do
"So, um, watering's important. Yep. Very important. "So, um, watering's important. Yep. Very important.
@@ -66,7 +66,7 @@ rest of the garden.
[apple](crop) [apple](crop)
" "
end end
let(:post) { FactoryBot.create(:post, author: member, subject: "Watering", body: post_body) } let(:post) { create(:post, author: member, subject: "Watering", body: post_body) }
before do before do
# Freeze time, so we don't have variations in timestamps on the page # Freeze time, so we don't have variations in timestamps on the page
@@ -80,23 +80,23 @@ rest of the garden.
eggplant: 'https://farm8.staticflickr.com/7856/47068736892_1af9b8a4ba_q.jpg', eggplant: 'https://farm8.staticflickr.com/7856/47068736892_1af9b8a4ba_q.jpg',
maize: 'https://farm66.staticflickr.com/65535/46739264475_7cb55b2cbb_q.jpg' maize: 'https://farm66.staticflickr.com/65535/46739264475_7cb55b2cbb_q.jpg'
}.each do |crop_type, photo_url| }.each do |crop_type, photo_url|
crop = FactoryBot.create(crop_type, creator: someone_else) crop = create(crop_type, creator: someone_else)
crop.reindex crop.reindex
owner = FactoryBot.create(:interesting_member, login_name: crop_type.to_s.reverse, email: "#{crop.name}@example.com") owner = create(:interesting_member, login_name: crop_type.to_s.reverse, email: "#{crop.name}@example.com")
planting = FactoryBot.create(:planting, crop:, owner:, garden: owner.gardens.first) planting = create(:planting, crop:, owner:, garden: owner.gardens.first)
photo = FactoryBot.create(:photo, owner:, photo = create(:photo, owner:,
thumbnail_url: "#{photo_url}_q.jpg", fullsize_url: "#{photo_url}_z.jpg") thumbnail_url: "#{photo_url}_q.jpg", fullsize_url: "#{photo_url}_z.jpg")
planting.photos << photo planting.photos << photo
harvest = FactoryBot.create(:harvest, crop:, owner:, plant_part:) harvest = create(:harvest, crop:, owner:, plant_part:)
harvest.photos << photo harvest.photos << photo
FactoryBot.create(:planting, crop: tomato, create(:planting, crop: tomato,
planted_at: 1.year.ago, finished_at: 2.months.ago, planted_at: 1.year.ago, finished_at: 2.months.ago,
sunniness: 'sun', planted_from: 'seed') sunniness: 'sun', planted_from: 'seed')
end end
FactoryBot.create(:seed, owner: member, tradable_to: 'nationally') create(:seed, owner: member, tradable_to: 'nationally')
FactoryBot.create(:seed, owner: someone_else, tradable_to: 'nationally') create(:seed, owner: someone_else, tradable_to: 'nationally')
end end
after { Timecop.return } after { Timecop.return }
@@ -111,16 +111,16 @@ rest of the garden.
describe 'crops' do describe 'crops' do
it 'loads crops#show' do it 'loads crops#show' do
FactoryBot.create(:planting, planted_at: 2.months.ago, sunniness: 'shade', planted_from: 'seedling') create(:planting, planted_at: 2.months.ago, sunniness: 'shade', planted_from: 'seedling')
planting = FactoryBot.create(:planting, planted_at: 1.year.ago, sunniness: 'sun', planted_from: 'seed', crop: tomato) planting = create(:planting, planted_at: 1.year.ago, sunniness: 'sun', planted_from: 'seed', crop: tomato)
FactoryBot.create(:harvest, create(:harvest,
crop: tomato, crop: tomato,
plant_part: FactoryBot.create(:plant_part, name: 'berry'), plant_part: create(:plant_part, name: 'berry'),
planting:, planting:,
harvested_at: 1.day.ago) harvested_at: 1.day.ago)
post = FactoryBot.create(:post, subject: 'tomatoes are delicious') post = create(:post, subject: 'tomatoes are delicious')
tomato.posts << post tomato.posts << post
visit crop_path(tomato) visit crop_path(tomato)
@@ -141,7 +141,7 @@ rest of the garden.
end end
it 'load another member plantings#show' do it 'load another member plantings#show' do
planting = FactoryBot.create(:planting, crop: tomato, owner: someone_else, garden: someone_else.gardens.first) planting = create(:planting, crop: tomato, owner: someone_else, garden: someone_else.gardens.first)
visit planting_path(planting) visit planting_path(planting)
page.percy_snapshot(page, name: "#{prefix}/plantings#show") page.percy_snapshot(page, name: "#{prefix}/plantings#show")
end end
@@ -155,14 +155,14 @@ rest of the garden.
it 'gardens#show' do it 'gardens#show' do
# a garden # a garden
garden = FactoryBot.create(:garden, name: 'paradise', owner: member) garden = create(:garden, name: 'paradise', owner: member)
# with some lettuce (finished) # with some lettuce (finished)
FactoryBot.create( create(
:planting, crop: FactoryBot.create(:crop, name: 'lettuce'), :planting, crop: create(:crop, name: 'lettuce'),
garden:, owner: member, finished_at: 2.weeks.ago garden:, owner: member, finished_at: 2.weeks.ago
) )
# tomato still growing # tomato still growing
tomato_planting = FactoryBot.create(:planting, garden:, owner: member, crop: tomato) tomato_planting = create(:planting, garden:, owner: member, crop: tomato)
tomato_photo.plantings << tomato_planting tomato_photo.plantings << tomato_planting
visit garden_path(garden) visit garden_path(garden)
page.percy_snapshot(page, name: "#{prefix}/gardens#show") page.percy_snapshot(page, name: "#{prefix}/gardens#show")
@@ -176,10 +176,10 @@ rest of the garden.
end end
it 'loads another members#show' do it 'loads another members#show' do
FactoryBot.create(:planting, owner: someone_else, created_at: 30.days.ago, crop: tomato) create(:planting, owner: someone_else, created_at: 30.days.ago, crop: tomato)
FactoryBot.create(:planting, owner: someone_else, created_at: 24.days.ago, crop: tomato) create(:planting, owner: someone_else, created_at: 24.days.ago, crop: tomato)
FactoryBot.create(:post, author: someone_else, created_at: 4.days.ago, subject: 'waiting for my tomatoes') create(:post, author: someone_else, created_at: 4.days.ago, subject: 'waiting for my tomatoes')
FactoryBot.create(:harvest, owner: someone_else, created_at: 1.day.ago, crop: tomato) create(:harvest, owner: someone_else, created_at: 1.day.ago, crop: tomato)
visit member_path(someone_else) visit member_path(someone_else)
page.percy_snapshot(page, name: "#{prefix}/members#show") page.percy_snapshot(page, name: "#{prefix}/members#show")
@@ -188,18 +188,18 @@ rest of the garden.
describe 'posts' do describe 'posts' do
it 'loads posts#show' do it 'loads posts#show' do
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
visit post_path(post) visit post_path(post)
page.percy_snapshot(page, name: "#{prefix}/posts#show") page.percy_snapshot(page, name: "#{prefix}/posts#show")
end end
it 'loads posts#index' do it 'loads posts#index' do
Member.all.limit(5).each do |member| Member.all.limit(5).each do |member|
FactoryBot.create_list(:post, 12, author: member) create_list(:post, 12, author: member)
end end
Post.all.order(id: :desc).limit(4) do |post| Post.all.order(id: :desc).limit(4) do |post|
FactoryBot.create_list(:comment, rand(1..5), commentable: post) create_list(:comment, rand(1..5), commentable: post)
end end
visit posts_path visit posts_path
page.percy_snapshot(page, name: "#{prefix}/posts#index") page.percy_snapshot(page, name: "#{prefix}/posts#index")
@@ -208,7 +208,7 @@ rest of the garden.
describe 'photos' do describe 'photos' do
it 'loads photos#show' do it 'loads photos#show' do
tomato_photo.plantings << FactoryBot.create(:planting, owner: member, crop: tomato) tomato_photo.plantings << create(:planting, owner: member, crop: tomato)
visit photo_path(tomato_photo) visit photo_path(tomato_photo)
page.percy_snapshot(page, name: "#{prefix}/photos#show") page.percy_snapshot(page, name: "#{prefix}/photos#show")
end end
@@ -250,7 +250,7 @@ rest of the garden.
it_behaves_like 'visit pages' it_behaves_like 'visit pages'
it 'load my plantings#show' do it 'load my plantings#show' do
planting = FactoryBot.create(:planting, crop: tomato, owner: member, garden: member.gardens.first) planting = create(:planting, crop: tomato, owner: member, garden: member.gardens.first)
visit planting_path(planting) visit planting_path(planting)
page.percy_snapshot(page, name: "#{prefix}/self/plantings#show") page.percy_snapshot(page, name: "#{prefix}/self/plantings#show")
end end
@@ -261,7 +261,7 @@ rest of the garden.
end end
it 'load my gardens#show' do it 'load my gardens#show' do
garden = FactoryBot.create(:garden, name: 'paradise', owner: member) garden = create(:garden, name: 'paradise', owner: member)
visit garden_path(garden) visit garden_path(garden)
page.percy_snapshot(page, name: "#{prefix}/self/gardens#show") page.percy_snapshot(page, name: "#{prefix}/self/gardens#show")
end end
@@ -306,19 +306,19 @@ rest of the garden.
describe '#edit' do describe '#edit' do
it 'loads gardens#edit' do it 'loads gardens#edit' do
garden = FactoryBot.create(:garden, owner: member) garden = create(:garden, owner: member)
visit edit_garden_path(garden) visit edit_garden_path(garden)
page.percy_snapshot(page, name: "#{prefix}/gardens#edit") page.percy_snapshot(page, name: "#{prefix}/gardens#edit")
end end
it 'loads harvests#edit' do it 'loads harvests#edit' do
harvest = FactoryBot.create(:harvest, owner: member) harvest = create(:harvest, owner: member)
visit edit_harvest_path(harvest) visit edit_harvest_path(harvest)
page.percy_snapshot(page, name: "#{prefix}/harvests#edit") page.percy_snapshot(page, name: "#{prefix}/harvests#edit")
end end
it 'loads planting#edit' do it 'loads planting#edit' do
planting = FactoryBot.create(:planting, owner: member) planting = create(:planting, owner: member)
visit edit_planting_path(planting) visit edit_planting_path(planting)
page.percy_snapshot(page, name: "#{prefix}/plantings#edit") page.percy_snapshot(page, name: "#{prefix}/plantings#edit")
end end
@@ -350,7 +350,7 @@ rest of the garden.
context 'wrangling crops' do context 'wrangling crops' do
include_context 'signed in crop wrangler' include_context 'signed in crop wrangler'
let!(:candy) { FactoryBot.create(:crop_request, name: 'candy') } let!(:candy) { create(:crop_request, name: 'candy') }
it 'crop wrangling page' do it 'crop wrangling page' do
visit wrangle_crops_path visit wrangle_crops_path

View File

@@ -6,7 +6,7 @@ describe "new photo page" do
context "signed in member" do context "signed in member" do
include_context 'signed in member' include_context 'signed in member'
context "viewing a planting" do context "viewing a planting" do
let(:planting) { FactoryBot.create(:planting, owner: member) } let(:planting) { create(:planting, owner: member) }
it "add photo" do it "add photo" do
visit planting_path(planting) visit planting_path(planting)
@@ -20,7 +20,7 @@ describe "new photo page" do
end end
context "viewing a harvest" do context "viewing a harvest" do
let(:harvest) { FactoryBot.create(:harvest, owner: member) } let(:harvest) { create(:harvest, owner: member) }
it "add photo" do it "add photo" do
visit harvest_path(harvest) visit harvest_path(harvest)
@@ -33,7 +33,7 @@ describe "new photo page" do
end end
context "viewing a garden" do context "viewing a garden" do
let(:garden) { FactoryBot.create(:garden, owner: member) } let(:garden) { create(:garden, owner: member) }
it "add photo" do it "add photo" do
visit garden_path(garden) visit garden_path(garden)
@@ -46,7 +46,7 @@ describe "new photo page" do
end end
describe "viewing a seed" do describe "viewing a seed" do
let(:seed) { FactoryBot.create(:seed, owner: member) } let(:seed) { create(:seed, owner: member) }
it "add photo" do it "add photo" do
visit seed_path(seed) visit seed_path(seed)

View File

@@ -30,8 +30,8 @@ describe "Planting reminder email", :js do
context "when member has some plantings" do context "when member has some plantings" do
# Bangs are used on the following 2 let blocks in order to ensure that the plantings are present # Bangs are used on the following 2 let blocks in order to ensure that the plantings are present
# in the database before the email is generated: otherwise, they won't be present in the email. # in the database before the email is generated: otherwise, they won't be present in the email.
let!(:p1) { FactoryBot.create(:predictable_planting, planted_at: 10.days.ago, garden: member.gardens.first, owner: member) } let!(:p1) { create(:predictable_planting, planted_at: 10.days.ago, garden: member.gardens.first, owner: member) }
let!(:p2) { FactoryBot.create(:predictable_planting, planted_at: 30.days.ago, garden: member.gardens.first, owner: member) } let!(:p2) { create(:predictable_planting, planted_at: 30.days.ago, garden: member.gardens.first, owner: member) }
describe "lists plantings" do describe "lists plantings" do
it { expect(mail).to have_content "Progress report" } it { expect(mail).to have_content "Progress report" }
@@ -50,10 +50,10 @@ describe "Planting reminder email", :js do
context "when member has some harvests" do context "when member has some harvests" do
# Bangs are used on the following 2 let blocks in order to ensure that the plantings are present # Bangs are used on the following 2 let blocks in order to ensure that the plantings are present
# in the database before the spec is run. # in the database before the spec is run.
let!(:p1) { FactoryBot.create(:predictable_planting, garden: member.gardens.first, owner: member, planted_at: 20.days.ago) } let!(:p1) { create(:predictable_planting, garden: member.gardens.first, owner: member, planted_at: 20.days.ago) }
let!(:p2) { FactoryBot.create(:predictable_planting, garden: member.gardens.first, owner: member) } let!(:p2) { create(:predictable_planting, garden: member.gardens.first, owner: member) }
let!(:h1) { FactoryBot.create(:harvest, owner: member, planting: p1, harvested_at: 1.day.ago) } let!(:h1) { create(:harvest, owner: member, planting: p1, harvested_at: 1.day.ago) }
let!(:h2) { FactoryBot.create(:harvest, owner: member, planting: p2, harvested_at: 3.days.ago) } let!(:h2) { create(:harvest, owner: member, planting: p2, harvested_at: 3.days.ago) }
describe "lists planting that are ready for harvest" do describe "lists planting that are ready for harvest" do
it { expect(mail).to have_content "Ready to harvest" } it { expect(mail).to have_content "Ready to harvest" }

View File

@@ -4,10 +4,10 @@ require "rails_helper"
require 'custom_matchers' require 'custom_matchers'
describe "Planting a crop", :js, :search do describe "Planting a crop", :js, :search do
let!(:maize) { FactoryBot.create(:maize) } let!(:maize) { create(:maize) }
let(:garden) { FactoryBot.create(:garden, owner: member, name: 'Orchard') } let(:garden) { create(:garden, owner: member, name: 'Orchard') }
let!(:planting) do let!(:planting) do
FactoryBot.create(:planting, garden:, owner: member, planted_at: Date.parse("2013-03-10")) create(:planting, garden:, owner: member, planted_at: Date.parse("2013-03-10"))
end end
before { Planting.reindex } before { Planting.reindex }
@@ -19,14 +19,14 @@ describe "Planting a crop", :js, :search do
it_behaves_like "crop suggest", "planting" it_behaves_like "crop suggest", "planting"
describe "displays required and optional fields properly" do describe "displays required and optional fields properly" do
it { expect(page).to have_selector ".required", text: "What did you plant?" } it { expect(page).to have_css ".required", text: "What did you plant?" }
it { expect(page).to have_selector ".required", text: "Where did you plant it?" } it { expect(page).to have_css ".required", text: "Where did you plant it?" }
it { expect(page).to have_selector 'input#planting_planted_at' } it { expect(page).to have_css 'input#planting_planted_at' }
it { expect(page).to have_selector 'input#planting_quantity' } it { expect(page).to have_css 'input#planting_quantity' }
it { expect(page).to have_selector 'select#planting_planted_from' } it { expect(page).to have_css 'select#planting_planted_from' }
it { expect(page).to have_selector 'select#planting_sunniness' } it { expect(page).to have_css 'select#planting_sunniness' }
it { expect(page).to have_selector 'textarea#planting_description' } it { expect(page).to have_css 'textarea#planting_description' }
it { expect(page).to have_selector 'input#planting_finished_at' } it { expect(page).to have_css 'input#planting_finished_at' }
end end
describe "Creating a new planting" do describe "Creating a new planting" do
@@ -237,7 +237,7 @@ describe "Planting a crop", :js, :search do
describe "Transplanting a planting" do describe "Transplanting a planting" do
it "allows transplanting to another garden" do it "allows transplanting to another garden" do
other_garden = FactoryBot.create(:garden, owner: member, name: 'Backyard') other_garden = create(:garden, owner: member, name: 'Backyard')
visit planting_path(planting) visit planting_path(planting)
click_link 'Actions' click_link 'Actions'
select other_garden.name, from: 'Transplant to:' select other_garden.name, from: 'Transplant to:'

View File

@@ -4,9 +4,9 @@ require "rails_helper"
require 'custom_matchers' require 'custom_matchers'
describe "Display a planting", :js do describe "Display a planting", :js do
describe 'planting perennial' do describe 'planting perennial' do
let(:garden) { FactoryBot.create(:garden, location: 'Edinburgh') } let(:garden) { create(:garden, location: 'Edinburgh') }
let(:crop) { FactoryBot.create(:crop, name: 'feijoa', perennial: true) } let(:crop) { create(:crop, name: 'feijoa', perennial: true) }
let(:planting) { FactoryBot.create(:planting, crop:, garden:, owner: garden.owner) } let(:planting) { create(:planting, crop:, garden:, owner: garden.owner) }
describe 'no harvest to predict from' do describe 'no harvest to predict from' do
before { visit planting_path(planting) } before { visit planting_path(planting) }
@@ -17,9 +17,9 @@ describe "Display a planting", :js do
describe 'harvests used to predict' do describe 'harvests used to predict' do
before do before do
FactoryBot.create(:harvest, planting:, crop:, harvested_at: '1 May 2019') create(:harvest, planting:, crop:, harvested_at: '1 May 2019')
FactoryBot.create(:harvest, planting:, crop:, harvested_at: '18 June 2019') create(:harvest, planting:, crop:, harvested_at: '18 June 2019')
FactoryBot.create_list(:harvest, 4, planting:, crop:, harvested_at: '18 August 2019') create_list(:harvest, 4, planting:, crop:, harvested_at: '18 August 2019')
end end
before { visit planting_path(planting) } before { visit planting_path(planting) }
@@ -36,22 +36,22 @@ describe "Display a planting", :js do
before do before do
# Near by planting with harvests # Near by planting with harvests
nearby_garden = FactoryBot.create(:garden, location: 'Greenwich, UK') nearby_garden = create(:garden, location: 'Greenwich, UK')
nearby_planting = FactoryBot.create(:planting, crop:, nearby_planting = create(:planting, crop:,
garden: nearby_garden, owner: nearby_garden.owner, planted_at: '1 January 2000') garden: nearby_garden, owner: nearby_garden.owner, planted_at: '1 January 2000')
FactoryBot.create(:harvest, planting: nearby_planting, crop:, create(:harvest, planting: nearby_planting, crop:,
harvested_at: '1 May 2019') harvested_at: '1 May 2019')
FactoryBot.create(:harvest, planting: nearby_planting, crop:, create(:harvest, planting: nearby_planting, crop:,
harvested_at: '18 June 2019') harvested_at: '18 June 2019')
FactoryBot.create_list(:harvest, 4, planting: nearby_planting, crop:, create_list(:harvest, 4, planting: nearby_planting, crop:,
harvested_at: '18 August 2008') harvested_at: '18 August 2008')
# far away planting harvests # far away planting harvests
faraway_garden = FactoryBot.create(:garden, location: 'Amundsen-Scott Base, Antarctica') faraway_garden = create(:garden, location: 'Amundsen-Scott Base, Antarctica')
faraway_planting = FactoryBot.create(:planting, garden: faraway_garden, crop:, faraway_planting = create(:planting, garden: faraway_garden, crop:,
owner: faraway_garden.owner, planted_at: '16 May 2001') owner: faraway_garden.owner, planted_at: '16 May 2001')
FactoryBot.create_list(:harvest, 4, planting: faraway_planting, crop:, create_list(:harvest, 4, planting: faraway_planting, crop:,
harvested_at: '18 December 2006') harvested_at: '18 December 2006')
end end

View File

@@ -8,25 +8,25 @@ describe "Display a planting", :js do
before { visit planting_path(planting) } before { visit planting_path(planting) }
context 'Perennial planted long ago' do context 'Perennial planted long ago' do
let(:planting) { FactoryBot.create(:perennial_planting) } let(:planting) { create(:perennial_planting) }
it { expect(page).to have_text 'Perennial' } it { expect(page).to have_text 'Perennial' }
end end
context 'Perennial finished' do context 'Perennial finished' do
let(:planting) { FactoryBot.create(:perennial_planting, planted_at: 6.years.ago, finished: true, finished_at: 1.year.ago) } let(:planting) { create(:perennial_planting, planted_at: 6.years.ago, finished: true, finished_at: 1.year.ago) }
it { expect(page).to have_text 'Perennial' } it { expect(page).to have_text 'Perennial' }
end end
context 'Annual no predictions' do context 'Annual no predictions' do
let(:planting) { FactoryBot.create(:annual_planting) } let(:planting) { create(:annual_planting) }
it { expect(page).to have_no_text 'Finish expected' } it { expect(page).to have_no_text 'Finish expected' }
end end
context 'Annual with predicted finish' do context 'Annual with predicted finish' do
let(:planting) { FactoryBot.create(:predictable_planting, planted_at: 2.weeks.ago) } let(:planting) { create(:predictable_planting, planted_at: 2.weeks.ago) }
it { expect(page).to have_text '28%' } it { expect(page).to have_text '28%' }
it { expect(page).to have_text '14/50 days' } it { expect(page).to have_text '14/50 days' }
@@ -35,39 +35,39 @@ describe "Display a planting", :js do
end end
context 'Annual finished' do context 'Annual finished' do
let(:planting) { FactoryBot.create(:annual_planting, planted_at: 100.days.ago, finished: true, finished_at: 1.day.ago) } let(:planting) { create(:annual_planting, planted_at: 100.days.ago, finished: true, finished_at: 1.day.ago) }
it { expect(page).to have_text "Planted #{I18n.l(planting.planted_at)}" } it { expect(page).to have_text "Planted #{I18n.l(planting.planted_at)}" }
end end
context 'Planting with harvests' do context 'Planting with harvests' do
let(:planting) { FactoryBot.create(:harvest_with_planting).planting } let(:planting) { create(:harvest_with_planting).planting }
it { expect(page).to have_text 'Harvest started' } it { expect(page).to have_text 'Harvest started' }
end end
context 'Planting with harvest predictable' do context 'Planting with harvest predictable' do
let(:planting) do let(:planting) do
crop = FactoryBot.create(:annual_crop) crop = create(:annual_crop)
# 50 days to harvest # 50 days to harvest
FactoryBot.create(:harvest, harvested_at: 150.days.ago, crop:, create(:harvest, harvested_at: 150.days.ago, crop:,
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:)) planting: create(:planting, planted_at: 200.days.ago, crop:))
# 20 days to harvest # 20 days to harvest
FactoryBot.create(:harvest, harvested_at: 180.days.ago, crop:, create(:harvest, harvested_at: 180.days.ago, crop:,
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:)) planting: create(:planting, planted_at: 200.days.ago, crop:))
# 10 days to harvest # 10 days to harvest
FactoryBot.create(:harvest, harvested_at: 190.days.ago, crop:, create(:harvest, harvested_at: 190.days.ago, crop:,
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:)) planting: create(:planting, planted_at: 200.days.ago, crop:))
crop.update_medians crop.update_medians
FactoryBot.create(:annual_planting, planted_at: 200.days.ago, crop:) create(:annual_planting, planted_at: 200.days.ago, crop:)
end end
it { expect(page).to have_text 'First harvest expected' } it { expect(page).to have_text 'First harvest expected' }
end end
context 'with quantity' do context 'with quantity' do
let(:planting) { FactoryBot.create(:planting, quantity: 100) } let(:planting) { create(:planting, quantity: 100) }
it { expect(find('.plantingfact--quantity')).to have_text '100' } it { expect(find('.plantingfact--quantity')).to have_text '100' }
end end
@@ -78,8 +78,8 @@ describe "Display a planting", :js do
before { visit planting_path(planting) } before { visit planting_path(planting) }
context 'with matching seeds' do context 'with matching seeds' do
let(:seed) { FactoryBot.create(:seed, saved_at: 1.month.ago, owner: member) } let(:seed) { create(:seed, saved_at: 1.month.ago, owner: member) }
let(:planting) { FactoryBot.create(:planting, planted_at: 1.day.ago, crop: seed.crop, owner: member) } let(:planting) { create(:planting, planted_at: 1.day.ago, crop: seed.crop, owner: member) }
it { expect(page).to have_text 'Is this from one of these plantings? ' } it { expect(page).to have_text 'Is this from one of these plantings? ' }

View File

@@ -15,16 +15,16 @@ describe "Seeds", :js, :search do
describe "displays required and optional fields properly" do describe "displays required and optional fields properly" do
# NOTE: The required behaviour is pushed down to the control itself, not the form-group as of rails 7.1. # NOTE: The required behaviour is pushed down to the control itself, not the form-group as of rails 7.1.
# Modern browsers enforce the required behaviour better than us doing it ourselves. # Modern browsers enforce the required behaviour better than us doing it ourselves.
it { expect(page).to have_selector "label", text: "Crop" } it { expect(page).to have_css "label", text: "Crop" }
it { expect(page).to have_selector 'input#seed_quantity' } it { expect(page).to have_css 'input#seed_quantity' }
it { expect(page).to have_selector 'input#seed_plant_before' } it { expect(page).to have_css 'input#seed_plant_before' }
it { expect(page).to have_selector 'input#seed_days_until_maturity_min' } it { expect(page).to have_css 'input#seed_days_until_maturity_min' }
it { expect(page).to have_selector 'input#seed_days_until_maturity_max' } it { expect(page).to have_css 'input#seed_days_until_maturity_max' }
it { expect(page).to have_selector 'label', text: 'Organic?' } it { expect(page).to have_css 'label', text: 'Organic?' }
it { expect(page).to have_selector 'label', text: 'GMO?' } it { expect(page).to have_css 'label', text: 'GMO?' }
it { expect(page).to have_selector 'label', text: 'Heirloom?' } it { expect(page).to have_css 'label', text: 'Heirloom?' }
it { expect(page).to have_selector 'textarea#seed_description' } it { expect(page).to have_css 'textarea#seed_description' }
it { expect(page).to have_selector 'label', text: 'Will trade' } it { expect(page).to have_css 'label', text: 'Will trade' }
end end
describe "Adding a new seed", :js do describe "Adding a new seed", :js do

View File

@@ -55,7 +55,7 @@ describe "seeds", :js do
end end
describe "delete seeds" do describe "delete seeds" do
let(:seed) { FactoryBot.create(:seed, owner: member) } let(:seed) { create(:seed, owner: member) }
before do before do
visit seed_path(seed) visit seed_path(seed)
@@ -72,25 +72,25 @@ describe "seeds", :js do
before { visit seed_path(seed) } before { visit seed_path(seed) }
describe "view seeds with max and min days until maturity" do describe "view seeds with max and min days until maturity" do
let(:seed) { FactoryBot.create(:seed, days_until_maturity_min: 5, days_until_maturity_max: 7) } let(:seed) { create(:seed, days_until_maturity_min: 5, days_until_maturity_max: 7) }
it { expect(find('.seedfacts--maturity')).to have_content("57") } it { expect(find('.seedfacts--maturity')).to have_content("57") }
end end
describe "view seeds with only max days until maturity" do describe "view seeds with only max days until maturity" do
let(:seed) { FactoryBot.create(:seed, days_until_maturity_max: 7) } let(:seed) { create(:seed, days_until_maturity_max: 7) }
it { expect(find('.seedfacts--maturity')).to have_content("7") } it { expect(find('.seedfacts--maturity')).to have_content("7") }
end end
describe "view seeds with only min days until maturity" do describe "view seeds with only min days until maturity" do
let(:seed) { FactoryBot.create(:seed, days_until_maturity_min: 5) } let(:seed) { create(:seed, days_until_maturity_min: 5) }
it { expect(find('.seedfacts--maturity')).to have_content("5") } it { expect(find('.seedfacts--maturity')).to have_content("5") }
end end
describe "view seeds with neither max nor min days until maturity" do describe "view seeds with neither max nor min days until maturity" do
let(:seed) { FactoryBot.create(:seed) } let(:seed) { create(:seed) }
it { expect(find('.seedfacts--maturity')).to have_content "unknown" } it { expect(find('.seedfacts--maturity')).to have_content "unknown" }
end end

View File

@@ -10,8 +10,8 @@ describe "Seeds", :js do
include_context 'signed in member' include_context 'signed in member'
before { visit seed_path(seed) } before { visit seed_path(seed) }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let!(:seed) { FactoryBot.create(:seed, owner: member) } let!(:seed) { create(:seed, owner: member) }
it { it {
click_on "Actions" click_on "Actions"
@@ -28,7 +28,7 @@ describe "Seeds", :js do
visit seed_path(seed) visit seed_path(seed)
end end
let!(:photo) { FactoryBot.create(:photo, title: 'hello photo', owner: seed.owner) } let!(:photo) { create(:photo, title: 'hello photo', owner: seed.owner) }
it { is_expected.to have_xpath("//img[contains(@src,'#{photo.thumbnail_url}')]") } it { is_expected.to have_xpath("//img[contains(@src,'#{photo.thumbnail_url}')]") }
it { is_expected.to have_xpath("//a[contains(@href,'#{photo_path(photo)}')]") } it { is_expected.to have_xpath("//a[contains(@href,'#{photo_path(photo)}')]") }
@@ -41,7 +41,7 @@ describe "Seeds", :js do
visit seed_path(seed) visit seed_path(seed)
end end
let!(:photos) { FactoryBot.create_list(:photo, 10 * 5, owner: seed.owner) } let!(:photos) { create_list(:photo, 10 * 5, owner: seed.owner) }
let(:newest_photo) { seed.photos.order(created_at: :desc, id: :desc).first } let(:newest_photo) { seed.photos.order(created_at: :desc, id: :desc).first }
let(:oldest_photo) { seed.photos.order(created_at: :desc, id: :desc).last } let(:oldest_photo) { seed.photos.order(created_at: :desc, id: :desc).last }

View File

@@ -9,7 +9,7 @@ shared_examples "crop suggest" do |resource|
let!(:roma) { create(:roma) } let!(:roma) { create(:roma) }
it "placeholder text in crop auto suggest field" do it "placeholder text in crop auto suggest field" do
expect(page).to have_selector("input[placeholder='e.g. lettuce']") expect(page).to have_css("input[placeholder='e.g. lettuce']")
end end
it "typing in the crop name displays suggestions" do it "typing in the crop name displays suggestions" do
@@ -41,7 +41,7 @@ shared_examples "crop suggest" do |resource|
select_from_autocomplete("pear") select_from_autocomplete("pear")
expect(page).to have_selector("input##{resource}_crop_id[value='#{pear.id}']", visible: false) expect(page).to have_css("input##{resource}_crop_id[value='#{pear.id}']", visible: false)
end end
it "Typing and pausing does not affect input" do it "Typing and pausing does not affect input" do

View File

@@ -3,12 +3,12 @@
require 'rails_helper' require 'rails_helper'
describe "signin" do describe "signin" do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:recipient) { FactoryBot.create(:member) } let(:recipient) { create(:member) }
let(:wrangler) { FactoryBot.create(:crop_wrangling_member) } let(:wrangler) { create(:crop_wrangling_member) }
before do before do
crop = FactoryBot.create(:tomato) crop = create(:tomato)
crop.reindex crop.reindex
end end

View File

@@ -34,15 +34,15 @@ describe "signout" do
end end
describe 'after signout, redirect to signin page if page needs authentication' do describe 'after signout, redirect to signin page if page needs authentication' do
include_examples "sign-in redirects", "/plantings/new" it_behaves_like "sign-in redirects", "/plantings/new"
include_examples "sign-in redirects", "/harvests/new" it_behaves_like "sign-in redirects", "/harvests/new"
include_examples "sign-in redirects", "/posts/new" it_behaves_like "sign-in redirects", "/posts/new"
include_examples "sign-in redirects", "/gardens/new" it_behaves_like "sign-in redirects", "/gardens/new"
include_examples "sign-in redirects", "/seeds/new" it_behaves_like "sign-in redirects", "/seeds/new"
end end
it 'photos' do it 'photos' do
garden = FactoryBot.create(:garden, owner: member) garden = create(:garden, owner: member)
visit "/photos/new?id=#{garden.id}&type=garden" visit "/photos/new?id=#{garden.id}&type=garden"
expect(page).to have_current_path new_member_session_path, ignore_query: true expect(page).to have_current_path new_member_session_path, ignore_query: true
# expect(page).to have_http_status(200) # expect(page).to have_http_status(200)

View File

@@ -3,9 +3,9 @@
require 'rails_helper' require 'rails_helper'
describe "timeline", :js do describe "timeline", :js do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:friend1) { FactoryBot.create(:member) } let(:friend1) { create(:member) }
let(:friend2) { FactoryBot.create(:member) } let(:friend2) { create(:member) }
before do before do
member.followed << friend1 member.followed << friend1
@@ -13,14 +13,14 @@ describe "timeline", :js do
end end
describe 'visit timeline' do describe 'visit timeline' do
let!(:friend_planting) { FactoryBot.create(:planting, owner: friend1, planted_at: 1.day.ago) } let!(:friend_planting) { create(:planting, owner: friend1, planted_at: 1.day.ago) }
let!(:friend_harvest) { FactoryBot.create(:planting, owner: friend2, planted_at: 3.years.ago) } let!(:friend_harvest) { create(:planting, owner: friend2, planted_at: 3.years.ago) }
let!(:finished_planting) { FactoryBot.create(:finished_planting, owner: friend1) } let!(:finished_planting) { create(:finished_planting, owner: friend1) }
let!(:no_planted_at_planting) { FactoryBot.create(:planting, owner: friend2, planted_at: nil) } let!(:no_planted_at_planting) { create(:planting, owner: friend2, planted_at: nil) }
let!(:friend_photo) { FactoryBot.create(:photo, owner: friend1) } let!(:friend_photo) { create(:photo, owner: friend1) }
let!(:friend_post) { FactoryBot.create(:post, author: friend2) } let!(:friend_post) { create(:post, author: friend2) }
let!(:liked_post) { FactoryBot.create(:like, likeable: friend_photo, member: friend2) } let!(:liked_post) { create(:like, likeable: friend_photo, member: friend2) }
let!(:liked_photo) { FactoryBot.create(:like, likeable: friend_post, member: friend1) } let!(:liked_photo) { create(:like, likeable: friend_post, member: friend1) }
before do before do
login_as(member) login_as(member)

View File

@@ -13,7 +13,7 @@ describe ApplicationHelper do
describe '#avatar_uri' do describe '#avatar_uri' do
context 'with a normal user' do context 'with a normal user' do
before do before do
@member = FactoryBot.build(:member, email: 'example@example.com', preferred_avatar_uri: nil) @member = build(:member, email: 'example@example.com', preferred_avatar_uri: nil)
end end
it 'renders a gravatar uri' do it 'renders a gravatar uri' do
@@ -27,7 +27,7 @@ describe ApplicationHelper do
context 'with a user who specified a preferred avatar uri' do context 'with a user who specified a preferred avatar uri' do
before do before do
@member = FactoryBot.build(:member, email: 'example@example.com', preferred_avatar_uri: 'http://media.catmoji.com/post/ujg/cat-in-hat.jpg') @member = build(:member, email: 'example@example.com', preferred_avatar_uri: 'http://media.catmoji.com/post/ujg/cat-in-hat.jpg')
end end
it 'renders a the specified uri' do it 'renders a the specified uri' do

View File

@@ -15,10 +15,10 @@ require 'rails_helper'
RSpec.describe ButtonsHelper, type: :helper do RSpec.describe ButtonsHelper, type: :helper do
before { allow(self).to receive(:can?).and_return(true) } before { allow(self).to receive(:can?).and_return(true) }
let(:garden) { FactoryBot.create(:garden) } let(:garden) { create(:garden) }
let(:planting) { FactoryBot.create(:planting) } let(:planting) { create(:planting) }
let(:harvest) { FactoryBot.create(:harvest) } let(:harvest) { create(:harvest) }
let(:seed) { FactoryBot.create(:seed) } let(:seed) { create(:seed) }
describe 'add_photo_button' do describe 'add_photo_button' do
it { expect(add_photo_button(garden)).to include "/photos/new?id=#{garden.id}&amp;type=garden" } it { expect(add_photo_button(garden)).to include "/photos/new?id=#{garden.id}&amp;type=garden" }

View File

@@ -5,12 +5,12 @@ require 'rails_helper'
RSpec.describe EventHelper, type: :helper do RSpec.describe EventHelper, type: :helper do
subject { resolve_model(event) } subject { resolve_model(event) }
let(:planting) { FactoryBot.create(:planting) } let(:planting) { create(:planting) }
let(:harvest) { FactoryBot.create(:harvest) } let(:harvest) { create(:harvest) }
let(:seed) { FactoryBot.create(:seed) } let(:seed) { create(:seed) }
let(:post) { FactoryBot.create(:post) } let(:post) { create(:post) }
let(:comment) { FactoryBot.create(:comment) } let(:comment) { create(:comment) }
let(:photo) { FactoryBot.create(:photo) } let(:photo) { create(:photo) }
describe 'plantings' do describe 'plantings' do
let(:event) { OpenStruct.new(id: planting.id, event_type: 'planting') } let(:event) { OpenStruct.new(id: planting.id, event_type: 'planting') }

View File

@@ -5,29 +5,29 @@ require 'rails_helper'
describe GardensHelper do describe GardensHelper do
describe "garden description" do describe "garden description" do
it "is missing" do it "is missing" do
garden = FactoryBot.create(:garden, garden = create(:garden,
description: nil) description: nil)
result = helper.display_garden_description(garden) result = helper.display_garden_description(garden)
expect(result).to eq "no description provided." expect(result).to eq "no description provided."
end end
it "is less than 130 characters long" do it "is less than 130 characters long" do
garden = FactoryBot.create(:garden, garden = create(:garden,
description: 'a' * 20) description: 'a' * 20)
result = helper.display_garden_description(garden) result = helper.display_garden_description(garden)
expect(result).to eq 'a' * 20 expect(result).to eq 'a' * 20
end end
it "is 130 characters long" do it "is 130 characters long" do
garden = FactoryBot.create(:garden, garden = create(:garden,
description: 'a' * 130) description: 'a' * 130)
result = helper.display_garden_description(garden) result = helper.display_garden_description(garden)
expect(result).to eq 'a' * 130 expect(result).to eq 'a' * 130
end end
it "is more than 130 characters long" do it "is more than 130 characters long" do
garden = FactoryBot.create(:garden, garden = create(:garden,
description: 'a' * 140) description: 'a' * 140)
result = helper.display_garden_description(garden) result = helper.display_garden_description(garden)
expect(result).to eq ('a' * 126) + '...' + ' ' + link_to("Read more", garden_path(garden)) expect(result).to eq ('a' * 126) + '...' + ' ' + link_to("Read more", garden_path(garden))
end end
@@ -40,8 +40,8 @@ describe GardensHelper do
end end
it "has 1 planting" do it "has 1 planting" do
crop = FactoryBot.create(:crop) crop = create(:crop)
plantings = [FactoryBot.create(:planting, quantity: 10, crop:)] plantings = [create(:planting, quantity: 10, crop:)]
result = helper.display_garden_plantings(plantings) result = helper.display_garden_plantings(plantings)
output = '<ul class="plantings"><li>' output = '<ul class="plantings"><li>'
@@ -54,11 +54,11 @@ describe GardensHelper do
it "has 2 plantings" do it "has 2 plantings" do
plantings = [] plantings = []
crop1 = FactoryBot.create(:crop) crop1 = create(:crop)
plantings << FactoryBot.create(:planting, quantity: 10, crop: crop1) plantings << create(:planting, quantity: 10, crop: crop1)
crop2 = FactoryBot.create(:crop) crop2 = create(:crop)
plantings << FactoryBot.create(:planting, quantity: 10, crop: crop2) plantings << create(:planting, quantity: 10, crop: crop2)
result = helper.display_garden_plantings(plantings.first(2)) result = helper.display_garden_plantings(plantings.first(2))
@@ -76,14 +76,14 @@ describe GardensHelper do
it "has 3 plantings" do it "has 3 plantings" do
plantings = [] plantings = []
crop1 = FactoryBot.create(:crop) crop1 = create(:crop)
plantings << FactoryBot.create(:planting, quantity: 10, crop: crop1) plantings << create(:planting, quantity: 10, crop: crop1)
crop2 = FactoryBot.create(:crop) crop2 = create(:crop)
plantings << FactoryBot.create(:planting, quantity: 10, crop: crop2) plantings << create(:planting, quantity: 10, crop: crop2)
crop3 = FactoryBot.create(:crop) crop3 = create(:crop)
plantings << FactoryBot.create(:planting, quantity: 10, crop: crop3) plantings << create(:planting, quantity: 10, crop: crop3)
result = helper.display_garden_plantings(plantings.first(2)) result = helper.display_garden_plantings(plantings.first(2))

View File

@@ -5,66 +5,66 @@ require 'rails_helper'
describe HarvestsHelper do describe HarvestsHelper do
describe "display_quantity" do describe "display_quantity" do
it "blank" do it "blank" do
harvest = FactoryBot.create(:harvest, harvest = create(:harvest,
quantity: nil, quantity: nil,
weight_quantity: nil) weight_quantity: nil)
result = helper.display_quantity(harvest) result = helper.display_quantity(harvest)
result.should eq 'not specified' result.should eq 'not specified'
end end
it '3 individual' do it '3 individual' do
harvest = FactoryBot.create(:harvest, harvest = create(:harvest,
quantity: 3, quantity: 3,
unit: 'individual', unit: 'individual',
weight_quantity: nil) weight_quantity: nil)
result = helper.display_quantity(harvest) result = helper.display_quantity(harvest)
result.should eq '3' result.should eq '3'
end end
it '1 bunch' do it '1 bunch' do
harvest = FactoryBot.create(:harvest, harvest = create(:harvest,
quantity: 1, quantity: 1,
unit: 'bunch', unit: 'bunch',
weight_quantity: nil) weight_quantity: nil)
result = helper.display_quantity(harvest) result = helper.display_quantity(harvest)
result.should eq '1 bunch' result.should eq '1 bunch'
end end
it '3 bunches' do it '3 bunches' do
harvest = FactoryBot.create(:harvest, harvest = create(:harvest,
quantity: 3, quantity: 3,
unit: 'bunch', unit: 'bunch',
weight_quantity: nil) weight_quantity: nil)
result = helper.display_quantity(harvest) result = helper.display_quantity(harvest)
result.should eq '3 bunches' result.should eq '3 bunches'
end end
it '3 kg' do it '3 kg' do
harvest = FactoryBot.create(:harvest, harvest = create(:harvest,
quantity: nil, quantity: nil,
unit: nil, unit: nil,
weight_quantity: 3, weight_quantity: 3,
weight_unit: 'kg') weight_unit: 'kg')
result = helper.display_quantity(harvest) result = helper.display_quantity(harvest)
result.should eq '3 kg' result.should eq '3 kg'
end end
it '3 individual weighing 3 kg' do it '3 individual weighing 3 kg' do
harvest = FactoryBot.create(:harvest, harvest = create(:harvest,
quantity: 3, quantity: 3,
unit: 'individual', unit: 'individual',
weight_quantity: 3, weight_quantity: 3,
weight_unit: 'kg') weight_unit: 'kg')
result = helper.display_quantity(harvest) result = helper.display_quantity(harvest)
result.should eq '3, weighing 3 kg' result.should eq '3, weighing 3 kg'
end end
it '3 bunches weighing 3 kg' do it '3 bunches weighing 3 kg' do
harvest = FactoryBot.create(:harvest, harvest = create(:harvest,
quantity: 3, quantity: 3,
unit: 'bunch', unit: 'bunch',
weight_quantity: 3, weight_quantity: 3,
weight_unit: 'kg') weight_unit: 'kg')
result = helper.display_quantity(harvest) result = helper.display_quantity(harvest)
result.should eq '3 bunches, weighing 3 kg' result.should eq '3 bunches, weighing 3 kg'
end end

View File

@@ -3,17 +3,17 @@
require 'rails_helper' require 'rails_helper'
describe PhotosHelper do describe PhotosHelper do
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
let(:crop_photo_of) { FactoryBot.create(:photo, source: 'openfarm') } let(:crop_photo_of) { create(:photo, source: 'openfarm') }
let(:crop_photo_flickr) { FactoryBot.create(:photo, source: 'flickr') } let(:crop_photo_flickr) { create(:photo, source: 'flickr') }
let(:garden) { FactoryBot.create(:garden) } let(:garden) { create(:garden) }
let(:planting) { FactoryBot.create(:planting, crop:, owner: garden.owner) } let(:planting) { create(:planting, crop:, owner: garden.owner) }
let(:planting_photo) { FactoryBot.create(:photo, owner: garden.owner) } let(:planting_photo) { create(:photo, owner: garden.owner) }
let(:harvest) { FactoryBot.create(:harvest, crop:, owner: garden.owner) } let(:harvest) { create(:harvest, crop:, owner: garden.owner) }
let(:harvest_photo) { FactoryBot.create(:photo, owner: garden.owner) } let(:harvest_photo) { create(:photo, owner: garden.owner) }
let(:seed) { FactoryBot.create(:seed, crop:, owner: garden.owner) } let(:seed) { create(:seed, crop:, owner: garden.owner) }
let(:seed_photo) { FactoryBot.create(:photo, owner: garden.owner) } let(:seed_photo) { create(:photo, owner: garden.owner) }
describe "crops" do describe "crops" do
subject { crop_image_path(crop) } subject { crop_image_path(crop) }
@@ -51,7 +51,7 @@ describe PhotosHelper do
it { is_expected.to eq 'placeholder_600.png' } it { is_expected.to eq 'placeholder_600.png' }
describe "has a flickr photo" do describe "has a flickr photo" do
let(:garden_photo) { FactoryBot.create(:photo, owner: garden.owner, source: 'flickr') } let(:garden_photo) { create(:photo, owner: garden.owner, source: 'flickr') }
before { garden.photos << garden_photo } before { garden.photos << garden_photo }

View File

@@ -4,41 +4,41 @@ require 'rails_helper'
describe PlantingsHelper do describe PlantingsHelper do
describe "display_planting" do describe "display_planting" do
let!(:member) { FactoryBot.build(:member, login_name: 'crop_lady') } let!(:member) { build(:member, login_name: 'crop_lady') }
it "does not have a quantity nor a planted from value provided" do it "does not have a quantity nor a planted from value provided" do
planting = FactoryBot.build(:planting, planting = build(:planting,
quantity: nil, quantity: nil,
planted_from: '', planted_from: '',
owner: member) owner: member)
result = helper.display_planting(planting) result = helper.display_planting(planting)
expect(result).to eq "crop_lady planted magic bean." expect(result).to eq "crop_lady planted magic bean."
end end
it "does not have a quantity provided" do it "does not have a quantity provided" do
planting = FactoryBot.build(:planting, planting = build(:planting,
quantity: nil, quantity: nil,
planted_from: 'seed', planted_from: 'seed',
owner: member) owner: member)
result = helper.display_planting(planting) result = helper.display_planting(planting)
expect(result).to eq "crop_lady planted seeds." expect(result).to eq "crop_lady planted seeds."
end end
context "when quantity is greater than 1" do context "when quantity is greater than 1" do
it "does not have a planted from value provided" do it "does not have a planted from value provided" do
planting = FactoryBot.build(:planting, planting = build(:planting,
quantity: 10, quantity: 10,
planted_from: '', planted_from: '',
owner: member) owner: member)
result = helper.display_planting(planting) result = helper.display_planting(planting)
expect(result).to eq "crop_lady planted 10 units." expect(result).to eq "crop_lady planted 10 units."
end end
it "does have a planted from value provided" do it "does have a planted from value provided" do
planting = FactoryBot.build(:planting, planting = build(:planting,
quantity: 5, quantity: 5,
planted_from: 'seed', planted_from: 'seed',
owner: member) owner: member)
result = helper.display_planting(planting) result = helper.display_planting(planting)
expect(result).to eq "crop_lady planted 5 seeds." expect(result).to eq "crop_lady planted 5 seeds."
end end
@@ -46,19 +46,19 @@ describe PlantingsHelper do
context "when quantity is 1" do context "when quantity is 1" do
it "does not have a planted from value provided" do it "does not have a planted from value provided" do
planting = FactoryBot.build(:planting, planting = build(:planting,
quantity: 1, quantity: 1,
planted_from: '', planted_from: '',
owner: member) owner: member)
result = helper.display_planting(planting) result = helper.display_planting(planting)
expect(result).to eq "crop_lady planted 1 unit." expect(result).to eq "crop_lady planted 1 unit."
end end
it "does have a planted from value provided" do it "does have a planted from value provided" do
planting = FactoryBot.build(:planting, planting = build(:planting,
quantity: 1, quantity: 1,
planted_from: 'seed', planted_from: 'seed',
owner: member) owner: member)
result = helper.display_planting(planting) result = helper.display_planting(planting)
expect(result).to eq "crop_lady planted 1 seed." expect(result).to eq "crop_lady planted 1 seed."
end end

View File

@@ -5,29 +5,29 @@ require 'rails_helper'
describe SeedsHelper do describe SeedsHelper do
describe "seed description" do describe "seed description" do
it "is missing" do it "is missing" do
seed = FactoryBot.create(:seed, seed = create(:seed,
description: nil) description: nil)
result = helper.display_seed_description(seed) result = helper.display_seed_description(seed)
expect(result).to eq "" expect(result).to eq ""
end end
it "is less than 130 characters long" do it "is less than 130 characters long" do
seed = FactoryBot.create(:seed, seed = create(:seed,
description: 'a' * 20) description: 'a' * 20)
result = helper.display_seed_description(seed) result = helper.display_seed_description(seed)
expect(result).to eq 'a' * 20 expect(result).to eq 'a' * 20
end end
it "is 130 characters long" do it "is 130 characters long" do
seed = FactoryBot.create(:seed, seed = create(:seed,
description: 'a' * 130) description: 'a' * 130)
result = helper.display_seed_description(seed) result = helper.display_seed_description(seed)
expect(result).to eq 'a' * 130 expect(result).to eq 'a' * 130
end end
it "is more than 130 characters long" do it "is more than 130 characters long" do
seed = FactoryBot.create(:seed, seed = create(:seed,
description: 'a' * 140) description: 'a' * 140)
result = helper.display_seed_description(seed) result = helper.display_seed_description(seed)
expect(result).to eq ('a' * 126) + '...' + ' ' + link_to("Read more", seed_path(seed)) expect(result).to eq ('a' * 126) + '...' + ' ' + link_to("Read more", seed_path(seed))
end end

View File

@@ -21,7 +21,7 @@ describe 'Haml::Filters::Escaped_Markdown' do
end end
it 'converts quick crop links' do it 'converts quick crop links' do
@crop = FactoryBot.create(:crop) @crop = create(:crop)
template = <<~HTML template = <<~HTML
:escaped_markdown :escaped_markdown
[#{@crop.name}](crop) [#{@crop.name}](crop)

View File

@@ -28,7 +28,7 @@ describe 'Haml::Filters::Growstuff_Markdown' do
include ApplicationHelper include ApplicationHelper
it 'converts quick crop links' do it 'converts quick crop links' do
@crop = FactoryBot.create(:crop) @crop = create(:crop)
rendered = render_haml(haml_template(input_link(@crop.name))) rendered = render_haml(haml_template(input_link(@crop.name)))
expect(rendered).to match(/#{output_link(@crop)}/) expect(rendered).to match(/#{output_link(@crop)}/)
end end
@@ -39,14 +39,14 @@ describe 'Haml::Filters::Growstuff_Markdown' do
end end
it "doesn't convert escaped crop links" do it "doesn't convert escaped crop links" do
@crop = FactoryBot.create(:crop) @crop = create(:crop)
rendered = render_haml(haml_template("\\" << input_link(@crop.name))) rendered = render_haml(haml_template("\\" << input_link(@crop.name)))
expect(rendered).to match(/\[#{@crop.name}\]\(crop\)/) expect(rendered).to match(/\[#{@crop.name}\]\(crop\)/)
end end
it "handles multiple crop links" do it "handles multiple crop links" do
tomato = FactoryBot.create(:tomato) tomato = create(:tomato)
maize = FactoryBot.create(:maize) maize = create(:maize)
string = "#{input_link(tomato)} #{input_link(maize)}" string = "#{input_link(tomato)} #{input_link(maize)}"
rendered = render_haml(haml_template(string)) rendered = render_haml(haml_template(string))
expect(rendered).to match(/#{output_link(tomato)} #{output_link(maize)}/) expect(rendered).to match(/#{output_link(tomato)} #{output_link(maize)}/)
@@ -59,13 +59,13 @@ describe 'Haml::Filters::Growstuff_Markdown' do
end end
it "finds crops case insensitively" do it "finds crops case insensitively" do
@crop = FactoryBot.create(:crop, name: 'tomato', slug: 'tomato') @crop = create(:crop, name: 'tomato', slug: 'tomato')
rendered = render_haml(haml_template(input_link('ToMaTo'))) rendered = render_haml(haml_template(input_link('ToMaTo')))
expect(rendered).to match(/#{output_link(@crop, 'ToMaTo')}/) expect(rendered).to match(/#{output_link(@crop, 'ToMaTo')}/)
end end
it "fixes PT bug #78615258 (Markdown rendering bug with URLs and crops in same text)" do it "fixes PT bug #78615258 (Markdown rendering bug with URLs and crops in same text)" do
tomato = FactoryBot.create(:tomato) tomato = create(:tomato)
string = "[test](http://example.com) [tomato](crop)" string = "[test](http://example.com) [tomato](crop)"
rendered = render_haml(haml_template(string)) rendered = render_haml(haml_template(string))
@@ -74,7 +74,7 @@ describe 'Haml::Filters::Growstuff_Markdown' do
end end
it 'converts quick member links' do it 'converts quick member links' do
@member = FactoryBot.create(:member) @member = create(:member)
rendered = render_haml(haml_template(input_member_link(@member.login_name))) rendered = render_haml(haml_template(input_member_link(@member.login_name)))
expect(rendered).to match(/#{output_member_link(@member)}/) expect(rendered).to match(/#{output_member_link(@member)}/)
end end
@@ -85,13 +85,13 @@ describe 'Haml::Filters::Growstuff_Markdown' do
end end
it "doesn't convert escaped members" do it "doesn't convert escaped members" do
@member = FactoryBot.create(:member) @member = create(:member)
rendered = render_haml(haml_template("\\" << input_member_link(@member.login_name))) rendered = render_haml(haml_template("\\" << input_member_link(@member.login_name)))
expect(rendered).to match(/\[#{@member.login_name}\]\(member\)/) expect(rendered).to match(/\[#{@member.login_name}\]\(member\)/)
end end
it 'converts @ member links' do it 'converts @ member links' do
@member = FactoryBot.create(:member) @member = create(:member)
rendered = render_haml(haml_template("Hey @#{@member.login_name}! What's up")) rendered = render_haml(haml_template("Hey @#{@member.login_name}! What's up"))
expect(rendered).to match(/#{output_member_link(@member, "@#{@member.login_name}")}/) expect(rendered).to match(/#{output_member_link(@member, "@#{@member.login_name}")}/)
end end
@@ -102,7 +102,7 @@ describe 'Haml::Filters::Growstuff_Markdown' do
end end
it "doesn't convert nonexistent @ members" do it "doesn't convert nonexistent @ members" do
@member = FactoryBot.create(:member) @member = create(:member)
@member_name = @member.login_name @member_name = @member.login_name
@member.destroy @member.destroy
rendered = render_haml(haml_template("Hey @#{@member_name}")) rendered = render_haml(haml_template("Hey @#{@member_name}"))
@@ -110,7 +110,7 @@ describe 'Haml::Filters::Growstuff_Markdown' do
end end
it "doesn't convert escaped @ members" do it "doesn't convert escaped @ members" do
@member = FactoryBot.create(:member) @member = create(:member)
rendered = render_haml(haml_template("Hey \\@#{@member.login_name}! What's up")) rendered = render_haml(haml_template("Hey \\@#{@member.login_name}! What's up"))
expect(rendered).to include("Hey @#{@member.login_name}!") expect(rendered).to include("Hey @#{@member.login_name}!")
end end

View File

@@ -4,38 +4,38 @@ require 'rails_helper'
require 'cancan/matchers' require 'cancan/matchers'
describe Ability do describe Ability do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:ability) { described_class.new(member) } let(:ability) { described_class.new(member) }
context "notifications" do context "notifications" do
it 'member can view their own notifications' do it 'member can view their own notifications' do
notification = FactoryBot.create(:notification, recipient: member) notification = create(:notification, recipient: member)
ability.should be_able_to(:read, notification) ability.should be_able_to(:read, notification)
end end
it "member can't view someone else's notifications" do it "member can't view someone else's notifications" do
notification = FactoryBot.create(:notification, notification = create(:notification,
recipient: FactoryBot.create(:member)) recipient: create(:member))
ability.should_not be_able_to(:read, notification) ability.should_not be_able_to(:read, notification)
end end
it "member can't send messages to themself" do it "member can't send messages to themself" do
ability.should_not be_able_to(:create, ability.should_not be_able_to(:create,
FactoryBot.create(:notification, create(:notification,
recipient: member, recipient: member,
sender: member)) sender: member))
end end
it "member can send messages to someone else" do it "member can send messages to someone else" do
ability.should be_able_to(:create, ability.should be_able_to(:create,
FactoryBot.create(:notification, create(:notification,
recipient: FactoryBot.create(:member), recipient: create(:member),
sender: member)) sender: member))
end end
end end
context "crop wrangling" do context "crop wrangling" do
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
context "standard member" do context "standard member" do
it "can't manage crops" do it "can't manage crops" do
@@ -53,7 +53,7 @@ describe Ability do
end end
context "crop wrangler" do context "crop wrangler" do
let(:role) { FactoryBot.create(:crop_wrangler) } let(:role) { create(:crop_wrangler) }
before do before do
member.roles << role member.roles << role
@@ -78,7 +78,7 @@ describe Ability do
end end
context 'plant parts' do context 'plant parts' do
let(:plant_part) { FactoryBot.create(:plant_part) } let(:plant_part) { create(:plant_part) }
context 'ordinary member' do context 'ordinary member' do
it "can read plant parts" do it "can read plant parts" do
@@ -93,7 +93,7 @@ describe Ability do
end end
context 'admin' do context 'admin' do
let(:role) { FactoryBot.create(:admin) } let(:role) { create(:admin) }
before do before do
member.roles << role member.roles << role
@@ -113,7 +113,7 @@ describe Ability do
end end
it "can't delete a plant part that has harvests" do it "can't delete a plant part that has harvests" do
@harvest = FactoryBot.create(:harvest, plant_part:) @harvest = create(:harvest, plant_part:)
ability.should_not be_able_to(:destroy, plant_part) ability.should_not be_able_to(:destroy, plant_part)
end end
end end
@@ -127,14 +127,14 @@ describe Ability do
end end
context 'admin' do context 'admin' do
let(:role) { FactoryBot.create(:admin) } let(:role) { create(:admin) }
before do before do
member.roles << role member.roles << role
end end
it "can manage members" do it "can manage members" do
ability.should be_able_to(:destroy, FactoryBot.create(:member)) ability.should be_able_to(:destroy, create(:member))
end end
it "cannot delete themselves" do it "cannot delete themselves" do
ability.should_not be_able_to(:destroy, member) ability.should_not be_able_to(:destroy, member)

View File

@@ -3,7 +3,7 @@
require 'rails_helper' require 'rails_helper'
describe AlternateName do describe AlternateName do
let(:an) { FactoryBot.create(:alternate_eggplant) } let(:an) { create(:alternate_eggplant) }
it 'saves a basic alternate name' do it 'saves a basic alternate name' do
expect(an.save).to be(true) expect(an.save).to be(true)
@@ -22,9 +22,9 @@ describe AlternateName do
end end
describe 'relationships' do describe 'relationships' do
let(:alternate_name) { FactoryBot.create(:alternate_name, crop:, creator: member) } let(:alternate_name) { create(:alternate_name, crop:, creator: member) }
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
it { expect(alternate_name.crop).to eq crop } it { expect(alternate_name.crop).to eq crop }
it { expect(alternate_name.creator).to eq member } it { expect(alternate_name.creator).to eq member }

View File

@@ -4,7 +4,7 @@ require 'rails_helper'
describe Authentication do describe Authentication do
it 'creates an authentication' do it 'creates an authentication' do
@auth = FactoryBot.create(:authentication) @auth = create(:authentication)
@auth.should be_an_instance_of described_class @auth.should be_an_instance_of described_class
@auth.member.should be_an_instance_of Member @auth.member.should be_an_instance_of Member
end end

View File

@@ -4,7 +4,7 @@ require 'rails_helper'
describe Comment do describe Comment do
context "basic" do context "basic" do
let(:comment) { FactoryBot.create(:comment) } let(:comment) { create(:comment) }
it "belongs to a post" do it "belongs to a post" do
comment.commentable.should be_an_instance_of Post comment.commentable.should be_an_instance_of Post
@@ -18,12 +18,12 @@ describe Comment do
context "notifications" do context "notifications" do
it "sends a notification when a comment is posted" do it "sends a notification when a comment is posted" do
expect do expect do
FactoryBot.create(:comment) create(:comment)
end.to change(Notification, :count).by(1) end.to change(Notification, :count).by(1)
end end
it "sets the notification fields" do it "sets the notification fields" do
@c = FactoryBot.create(:comment) @c = create(:comment)
@n = Notification.first @n = Notification.first
@n.sender.should eq @c.author @n.sender.should eq @c.author
@n.recipient.should eq @c.commentable.author @n.recipient.should eq @c.commentable.author
@@ -33,20 +33,20 @@ describe Comment do
end end
it "doesn't send notifications to yourself" do it "doesn't send notifications to yourself" do
@m = FactoryBot.create(:member) @m = create(:member)
@p = FactoryBot.create(:post, author: @m) @p = create(:post, author: @m)
expect do expect do
FactoryBot.create(:comment, commentable: @p, author: @m) create(:comment, commentable: @p, author: @m)
end.not_to change(Notification, :count) end.not_to change(Notification, :count)
end end
end end
context "ordering" do context "ordering" do
before do before do
@m = FactoryBot.create(:member) @m = create(:member)
@p = FactoryBot.create(:post, author: @m) @p = create(:post, author: @m)
@c1 = FactoryBot.create(:comment, commentable: @p, author: @m) @c1 = create(:comment, commentable: @p, author: @m)
@c2 = FactoryBot.create(:comment, commentable: @p, author: @m) @c2 = create(:comment, commentable: @p, author: @m)
end end
it 'has a scope for ASC order for displaying on post page' do it 'has a scope for ASC order for displaying on post page' do

View File

@@ -5,8 +5,8 @@ require 'rails_helper'
RSpec.describe CropCompanion, type: :model do RSpec.describe CropCompanion, type: :model do
it 'has a crop' do it 'has a crop' do
cc = described_class.new cc = described_class.new
cc.crop_a = FactoryBot.create :tomato cc.crop_a = create :tomato
cc.crop_b = FactoryBot.create :maize cc.crop_b = create :maize
cc.save! cc.save!
expect(cc.crop_a.name).to eq 'tomato' expect(cc.crop_a.name).to eq 'tomato'

View File

@@ -4,7 +4,7 @@ require 'rails_helper'
describe Crop do describe Crop do
context 'all fields present' do context 'all fields present' do
let(:crop) { FactoryBot.create(:tomato) } let(:crop) { create(:tomato) }
it 'saves a basic crop' do it 'saves a basic crop' do
crop.save.should be(true) crop.save.should be(true)
@@ -30,15 +30,15 @@ describe Crop do
context 'invalid data' do context 'invalid data' do
it 'does not save a crop without a system name' do it 'does not save a crop without a system name' do
crop = FactoryBot.build(:crop, name: nil) crop = build(:crop, name: nil)
expect { crop.save }.to raise_error ActiveRecord::StatementInvalid expect { crop.save }.to raise_error ActiveRecord::StatementInvalid
end end
end end
context 'ordering' do context 'ordering' do
before do before do
@uppercase = FactoryBot.create(:uppercasecrop, created_at: 1.minute.ago) @uppercase = create(:uppercasecrop, created_at: 1.minute.ago)
@lowercase = FactoryBot.create(:lowercasecrop, created_at: 2.days.ago) @lowercase = create(:lowercasecrop, created_at: 2.days.ago)
end end
it 'recent scope sorts by creation date' do it 'recent scope sorts by creation date' do
@@ -47,39 +47,39 @@ describe Crop do
end end
context 'popularity' do context 'popularity' do
let(:tomato) { FactoryBot.create(:tomato) } let(:tomato) { create(:tomato) }
let(:maize) { FactoryBot.create(:maize) } let(:maize) { create(:maize) }
before do before do
FactoryBot.create_list(:planting, 10, crop: maize) create_list(:planting, 10, crop: maize)
FactoryBot.create_list(:planting, 3, crop: tomato) create_list(:planting, 3, crop: tomato)
end end
it "sorts by most plantings" do it "sorts by most plantings" do
expect(described_class.popular.first).to eq maize expect(described_class.popular.first).to eq maize
FactoryBot.create_list(:planting, 10, crop: tomato) create_list(:planting, 10, crop: tomato)
expect(described_class.popular.first).to eq tomato expect(described_class.popular.first).to eq tomato
end end
end end
it 'finds a default scientific name' do it 'finds a default scientific name' do
@crop = FactoryBot.create(:tomato) @crop = create(:tomato)
expect(@crop.default_scientific_name).to be_nil expect(@crop.default_scientific_name).to be_nil
@sn = FactoryBot.create(:solanum_lycopersicum, crop: @crop) @sn = create(:solanum_lycopersicum, crop: @crop)
@crop.reload @crop.reload
expect(@crop.default_scientific_name.to_s).to eq @sn.name expect(@crop.default_scientific_name.to_s).to eq @sn.name
end end
it 'counts plantings' do it 'counts plantings' do
@crop = FactoryBot.create(:tomato) @crop = create(:tomato)
expect(@crop.plantings.size).to eq 0 expect(@crop.plantings.size).to eq 0
@planting = FactoryBot.create(:planting, crop: @crop) @planting = create(:planting, crop: @crop)
@crop.reload @crop.reload
expect(@crop.plantings.size).to eq 1 expect(@crop.plantings.size).to eq 1
end end
context "wikipedia url" do context "wikipedia url" do
subject { FactoryBot.build(:tomato, en_wikipedia_url: wikipedia_url) } subject { build(:tomato, en_wikipedia_url: wikipedia_url) }
context 'not a url' do context 'not a url' do
let(:wikipedia_url) { 'this is not valid' } let(:wikipedia_url) { 'this is not valid' }
@@ -126,15 +126,15 @@ describe Crop do
context 'varieties' do context 'varieties' do
it 'has a crop hierarchy' do it 'has a crop hierarchy' do
@tomato = FactoryBot.create(:tomato) @tomato = create(:tomato)
@roma = FactoryBot.create(:roma, parent_id: @tomato.id) @roma = create(:roma, parent_id: @tomato.id)
expect(@roma.parent).to eq @tomato expect(@roma.parent).to eq @tomato
expect(@tomato.varieties).to eq [@roma] expect(@tomato.varieties).to eq [@roma]
end end
it 'toplevel scope works' do it 'toplevel scope works' do
@tomato = FactoryBot.create(:tomato) @tomato = create(:tomato)
@roma = FactoryBot.create(:roma, parent_id: @tomato.id) @roma = create(:roma, parent_id: @tomato.id)
expect(described_class.toplevel).to eq [@tomato] expect(described_class.toplevel).to eq [@tomato]
end end
end end
@@ -144,32 +144,32 @@ describe Crop do
it { expect(described_class.has_photos).to include(crop) } it { expect(described_class.has_photos).to include(crop) }
end end
let!(:crop) { FactoryBot.create(:tomato) } let!(:crop) { create(:tomato) }
context 'with a planting photo' do context 'with a planting photo' do
let!(:photo) { FactoryBot.create(:photo, owner: planting.owner) } let!(:photo) { create(:photo, owner: planting.owner) }
let!(:planting) { FactoryBot.create(:planting, crop:) } let!(:planting) { create(:planting, crop:) }
before { planting.photos << photo } before { planting.photos << photo }
it { expect(crop.default_photo).to eq photo } it { expect(crop.default_photo).to eq photo }
include_examples 'has default photo' it_behaves_like 'has default photo'
end end
context 'with a harvest photo' do context 'with a harvest photo' do
let!(:harvest) { FactoryBot.create(:harvest, crop:) } let!(:harvest) { create(:harvest, crop:) }
let!(:photo) { FactoryBot.create(:photo, owner: harvest.owner) } let!(:photo) { create(:photo, owner: harvest.owner) }
before { harvest.photos << photo } before { harvest.photos << photo }
it { expect(crop.default_photo).to eq photo } it { expect(crop.default_photo).to eq photo }
include_examples 'has default photo' it_behaves_like 'has default photo'
context 'and planting photo' do context 'and planting photo' do
let(:planting) { FactoryBot.create(:planting, crop:) } let(:planting) { create(:planting, crop:) }
let!(:planting_photo) { FactoryBot.create(:photo, owner: planting.owner) } let!(:planting_photo) { create(:photo, owner: planting.owner) }
before { planting.photos << planting_photo } before { planting.photos << planting_photo }
@@ -191,15 +191,15 @@ describe Crop do
end end
describe 'finding all photos' do describe 'finding all photos' do
let(:planting) { FactoryBot.create(:planting, crop:) } let(:planting) { create(:planting, crop:) }
let(:harvest) { FactoryBot.create(:harvest, crop:) } let(:harvest) { create(:harvest, crop:) }
let(:seed) { FactoryBot.create(:seed, crop:) } let(:seed) { create(:seed, crop:) }
before do before do
# Add photos to all # Add photos to all
planting.photos << FactoryBot.create(:photo, owner: planting.owner) planting.photos << create(:photo, owner: planting.owner)
harvest.photos << FactoryBot.create(:photo, owner: harvest.owner) harvest.photos << create(:photo, owner: harvest.owner)
seed.photos << FactoryBot.create(:photo, owner: seed.owner) seed.photos << create(:photo, owner: seed.owner)
end end
it { expect(crop.photos.size).to eq 3 } it { expect(crop.photos.size).to eq 3 }
@@ -210,83 +210,83 @@ describe Crop do
end end
context 'sunniness' do context 'sunniness' do
let(:crop) { FactoryBot.create(:tomato) } let(:crop) { create(:tomato) }
it 'returns a hash of sunniness values' do it 'returns a hash of sunniness values' do
FactoryBot.create(:sunny_planting, crop:) create(:sunny_planting, crop:)
FactoryBot.create(:sunny_planting, crop:) create(:sunny_planting, crop:)
FactoryBot.create(:semi_shady_planting, crop:) create(:semi_shady_planting, crop:)
FactoryBot.create(:shady_planting, crop:) create(:shady_planting, crop:)
crop.sunniness.should be_an_instance_of Hash crop.sunniness.should be_an_instance_of Hash
end end
it 'counts each sunniness value' do it 'counts each sunniness value' do
FactoryBot.create(:sunny_planting, crop:) create(:sunny_planting, crop:)
FactoryBot.create(:sunny_planting, crop:) create(:sunny_planting, crop:)
FactoryBot.create(:semi_shady_planting, crop:) create(:semi_shady_planting, crop:)
FactoryBot.create(:shady_planting, crop:) create(:shady_planting, crop:)
crop.sunniness.should == { 'sun' => 2, 'shade' => 1, 'semi-shade' => 1 } crop.sunniness.should == { 'sun' => 2, 'shade' => 1, 'semi-shade' => 1 }
end end
it 'ignores unused sunniness values' do it 'ignores unused sunniness values' do
FactoryBot.create(:sunny_planting, crop:) create(:sunny_planting, crop:)
FactoryBot.create(:sunny_planting, crop:) create(:sunny_planting, crop:)
FactoryBot.create(:semi_shady_planting, crop:) create(:semi_shady_planting, crop:)
crop.sunniness.should == { 'sun' => 2, 'semi-shade' => 1 } crop.sunniness.should == { 'sun' => 2, 'semi-shade' => 1 }
end end
end end
context 'planted_from' do context 'planted_from' do
let(:crop) { FactoryBot.create(:tomato) } let(:crop) { create(:tomato) }
it 'returns a hash of sunniness values' do it 'returns a hash of sunniness values' do
FactoryBot.create(:seed_planting, crop:) create(:seed_planting, crop:)
FactoryBot.create(:seed_planting, crop:) create(:seed_planting, crop:)
FactoryBot.create(:seedling_planting, crop:) create(:seedling_planting, crop:)
FactoryBot.create(:cutting_planting, crop:) create(:cutting_planting, crop:)
crop.planted_from.should be_an_instance_of Hash crop.planted_from.should be_an_instance_of Hash
end end
it 'counts each planted_from value' do it 'counts each planted_from value' do
FactoryBot.create(:seed_planting, crop:) create(:seed_planting, crop:)
FactoryBot.create(:seed_planting, crop:) create(:seed_planting, crop:)
FactoryBot.create(:seedling_planting, crop:) create(:seedling_planting, crop:)
FactoryBot.create(:cutting_planting, crop:) create(:cutting_planting, crop:)
crop.planted_from.should == { 'seed' => 2, 'seedling' => 1, 'cutting' => 1 } crop.planted_from.should == { 'seed' => 2, 'seedling' => 1, 'cutting' => 1 }
end end
it 'ignores unused planted_from values' do it 'ignores unused planted_from values' do
FactoryBot.create(:seed_planting, crop:) create(:seed_planting, crop:)
FactoryBot.create(:seed_planting, crop:) create(:seed_planting, crop:)
FactoryBot.create(:seedling_planting, crop:) create(:seedling_planting, crop:)
crop.planted_from.should == { 'seed' => 2, 'seedling' => 1 } crop.planted_from.should == { 'seed' => 2, 'seedling' => 1 }
end end
end end
context 'popular plant parts' do context 'popular plant parts' do
let(:crop) { FactoryBot.create(:tomato) } let(:crop) { create(:tomato) }
it 'returns a hash of plant_part values' do it 'returns a hash of plant_part values' do
crop.popular_plant_parts.should be_an_instance_of Hash crop.popular_plant_parts.should be_an_instance_of Hash
end end
it 'counts each plant_part value' do it 'counts each plant_part value' do
@fruit = FactoryBot.create(:plant_part) @fruit = create(:plant_part)
@seed = FactoryBot.create(:plant_part, name: 'seed') @seed = create(:plant_part, name: 'seed')
@root = FactoryBot.create(:plant_part, name: 'root') @root = create(:plant_part, name: 'root')
@bulb = FactoryBot.create(:plant_part, name: 'bulb') @bulb = create(:plant_part, name: 'bulb')
@harvest1 = FactoryBot.create(:harvest, @harvest1 = create(:harvest,
crop:, crop:,
plant_part: @fruit) plant_part: @fruit)
@harvest2 = FactoryBot.create(:harvest, @harvest2 = create(:harvest,
crop:, crop:,
plant_part: @fruit) plant_part: @fruit)
@harvest3 = FactoryBot.create(:harvest, @harvest3 = create(:harvest,
crop:, crop:,
plant_part: @seed) plant_part: @seed)
@harvest4 = FactoryBot.create(:harvest, @harvest4 = create(:harvest,
crop:, crop:,
plant_part: @root) plant_part: @root)
crop.popular_plant_parts.should == { [@fruit.id, @fruit.name] => 2, crop.popular_plant_parts.should == { [@fruit.id, @fruit.name] => 2,
[@seed.id, @seed.name] => 1, [@seed.id, @seed.name] => 1,
[@root.id, @root.name] => 1 } [@root.id, @root.name] => 1 }
@@ -297,22 +297,22 @@ describe Crop do
subject { described_class.interesting } subject { described_class.interesting }
# first, a couple of candidate crops # first, a couple of candidate crops
let(:crop1) { FactoryBot.create(:crop) } let(:crop1) { create(:crop) }
let(:crop2) { FactoryBot.create(:crop) } let(:crop2) { create(:crop) }
let(:crop1_planting) { crop1.plantings.first } let(:crop1_planting) { crop1.plantings.first }
let(:crop2_planting) { crop2.plantings.first } let(:crop2_planting) { crop2.plantings.first }
let(:member) { FactoryBot.create(:member, login_name: 'pikachu') } let(:member) { create(:member, login_name: 'pikachu') }
describe 'lists interesting crops' do describe 'lists interesting crops' do
before do before do
# they need 3+ plantings each to be interesting # they need 3+ plantings each to be interesting
FactoryBot.create_list(:planting, 3, crop: crop1, owner: member) create_list(:planting, 3, crop: crop1, owner: member)
FactoryBot.create_list(:planting, 3, crop: crop2, owner: member) create_list(:planting, 3, crop: crop2, owner: member)
# crops need 3+ photos to be interesting # crops need 3+ photos to be interesting
crop1_planting.photos = FactoryBot.create_list :photo, 3, owner: member crop1_planting.photos = create_list :photo, 3, owner: member
crop2_planting.photos = FactoryBot.create_list :photo, 3, owner: member crop2_planting.photos = create_list :photo, 3, owner: member
end end
it { is_expected.to include crop1 } it { is_expected.to include crop1 }
@@ -323,9 +323,9 @@ describe Crop do
describe 'crops without plantings are not interesting' do describe 'crops without plantings are not interesting' do
before do before do
# only crop1 has plantings # only crop1 has plantings
FactoryBot.create_list(:planting, 3, crop: crop1, owner: member) create_list(:planting, 3, crop: crop1, owner: member)
# ... and photos # ... and photos
crop1_planting.photos = FactoryBot.create_list(:photo, 3, owner: member) crop1_planting.photos = create_list(:photo, 3, owner: member)
end end
it { is_expected.to include crop1 } it { is_expected.to include crop1 }
@@ -336,11 +336,11 @@ describe Crop do
describe 'crops without photos are not interesting' do describe 'crops without photos are not interesting' do
before do before do
# both crops have plantings # both crops have plantings
FactoryBot.create_list(:planting, 3, crop: crop1, owner: member) create_list(:planting, 3, crop: crop1, owner: member)
FactoryBot.create_list(:planting, 3, crop: crop2, owner: member) create_list(:planting, 3, crop: crop2, owner: member)
# but only crop1 has photos # but only crop1 has photos
crop1_planting.photos = FactoryBot.create_list(:photo, 3, owner: member) crop1_planting.photos = create_list(:photo, 3, owner: member)
end end
it { is_expected.to include crop1 } it { is_expected.to include crop1 }
@@ -350,8 +350,8 @@ describe Crop do
end end
context "harvests" do context "harvests" do
let!(:crop) { FactoryBot.create(:crop) } let!(:crop) { create(:crop) }
let!(:harvest) { FactoryBot.create(:harvest, crop:) } let!(:harvest) { create(:harvest, crop:) }
it "has harvests" do it "has harvests" do
expect(crop.harvests).to eq [harvest] expect(crop.harvests).to eq [harvest]
@@ -359,10 +359,10 @@ describe Crop do
end end
it "doesn't duplicate plant_parts" do it "doesn't duplicate plant_parts" do
@maize = FactoryBot.create(:maize) @maize = create(:maize)
@pp1 = FactoryBot.create(:plant_part) @pp1 = create(:plant_part)
@h1 = FactoryBot.create(:harvest, crop: @maize, plant_part: @pp1) @h1 = create(:harvest, crop: @maize, plant_part: @pp1)
@h2 = FactoryBot.create(:harvest, crop: @maize, plant_part: @pp1) @h2 = create(:harvest, crop: @maize, plant_part: @pp1)
expect(@maize.plant_parts).to eq [@pp1] expect(@maize.plant_parts).to eq [@pp1]
end end
@@ -370,7 +370,7 @@ describe Crop do
before do before do
# don't use 'let' for this -- we need to actually create it, # don't use 'let' for this -- we need to actually create it,
# regardless of whether it's used. # regardless of whether it's used.
@cropbot = FactoryBot.create(:cropbot) @cropbot = create(:cropbot)
end end
context "scientific names" do context "scientific names" do
@@ -492,7 +492,7 @@ describe Crop do
end end
it "loads a crop with a parent" do it "loads a crop with a parent" do
parent = FactoryBot.create(:crop, name: 'parent') parent = create(:crop, name: 'parent')
crop = CsvImporter.new.import_crop( crop = CsvImporter.new.import_crop(
["tomato", "http://en.wikipedia.org/wiki/Tomato", "parent"] ["tomato", "http://en.wikipedia.org/wiki/Tomato", "parent"]
) )
@@ -525,9 +525,9 @@ describe Crop do
end end
context "crop-post association" do context "crop-post association" do
let!(:tomato) { FactoryBot.create(:tomato) } let!(:tomato) { create(:tomato) }
let!(:maize) { FactoryBot.create(:maize) } let!(:maize) { create(:maize) }
let!(:post) { FactoryBot.create(:post, body: "[maize](crop)[tomato](crop)[tomato](crop)") } let!(:post) { create(:post, body: "[maize](crop)[tomato](crop)[tomato](crop)") }
describe "destroying a crop" do describe "destroying a crop" do
before do before do
@@ -545,8 +545,8 @@ describe Crop do
end end
context "destroying a crop" do context "destroying a crop" do
let!(:crop_a) { FactoryBot.create(:crop) } let!(:crop_a) { create(:crop) }
let!(:crop_b) { FactoryBot.create(:crop) } let!(:crop_b) { create(:crop) }
before do before do
CropCompanion.create(crop_a: crop_a, crop_b: crop_b) CropCompanion.create(crop_a: crop_a, crop_b: crop_b)
@@ -560,15 +560,15 @@ describe Crop do
context "crop rejections" do context "crop rejections" do
let!(:rejected_reason) do let!(:rejected_reason) do
FactoryBot.create(:crop, name: 'tomato', create(:crop, name: 'tomato',
approval_status: 'rejected', approval_status: 'rejected',
reason_for_rejection: 'not edible') reason_for_rejection: 'not edible')
end end
let!(:rejected_other) do let!(:rejected_other) do
FactoryBot.create(:crop, name: 'tomato', create(:crop, name: 'tomato',
approval_status: 'rejected', approval_status: 'rejected',
reason_for_rejection: 'other', reason_for_rejection: 'other',
rejection_notes: 'blah blah blah') rejection_notes: 'blah blah blah')
end end
describe "rejecting a crop" do describe "rejecting a crop" do

View File

@@ -4,8 +4,8 @@ require 'spec_helper'
describe Follow do describe Follow do
before do before do
@member1 = FactoryBot.create(:member) @member1 = create(:member)
@member2 = FactoryBot.create(:member) @member2 = create(:member)
end end
it "sends a notification when a follow is created" do it "sends a notification when a follow is created" do

View File

@@ -3,7 +3,7 @@
require 'rails_helper' require 'rails_helper'
describe Forum do describe Forum do
let(:forum) { FactoryBot.create(:forum) } let(:forum) { create(:forum) }
it "belongs to an owner" do it "belongs to an owner" do
forum.owner.should be_an_instance_of Member forum.owner.should be_an_instance_of Member
@@ -18,8 +18,8 @@ describe Forum do
end end
it "has many posts" do it "has many posts" do
@post1 = FactoryBot.create(:forum_post, forum:) @post1 = create(:forum_post, forum:)
@post2 = FactoryBot.create(:forum_post, forum:) @post2 = create(:forum_post, forum:)
forum.posts.size.should == 2 forum.posts.size.should == 2
end end
end end

View File

@@ -3,8 +3,8 @@
require 'rails_helper' require 'rails_helper'
describe Garden do describe Garden do
let(:owner) { FactoryBot.create(:member, login_name: 'hatupatu') } let(:owner) { create(:member, login_name: 'hatupatu') }
let(:garden) { FactoryBot.create(:garden, owner:, name: 'Springfield Community Garden') } let(:garden) { create(:garden, owner:, name: 'Springfield Community Garden') }
it "has a slug" do it "has a slug" do
garden.slug.should match(/hatupatu-springfield-community-garden/) garden.slug.should match(/hatupatu-springfield-community-garden/)
@@ -15,42 +15,42 @@ describe Garden do
end end
it "doesn't allow a nil name" do it "doesn't allow a nil name" do
garden = FactoryBot.build(:garden, name: nil) garden = build(:garden, name: nil)
garden.should_not be_valid garden.should_not be_valid
end end
it "doesn't allow a blank name" do it "doesn't allow a blank name" do
garden = FactoryBot.build(:garden, name: "") garden = build(:garden, name: "")
garden.should_not be_valid garden.should_not be_valid
end end
it "allows numbers" do it "allows numbers" do
garden = FactoryBot.build(:garden, name: "100 vines of 2 kamo-kamo") garden = build(:garden, name: "100 vines of 2 kamo-kamo")
garden.should be_valid garden.should be_valid
end end
it "allows brackets" do it "allows brackets" do
garden = FactoryBot.build(:garden, name: "Garden (second)") garden = build(:garden, name: "Garden (second)")
garden.should be_valid garden.should be_valid
end end
it "allows macrons" do it "allows macrons" do
garden = FactoryBot.build(:garden, name: "Kūmara and pūha patch") garden = build(:garden, name: "Kūmara and pūha patch")
garden.should be_valid garden.should be_valid
end end
it "allows some punctuation" do it "allows some punctuation" do
garden = FactoryBot.build(:garden, name: "best-garden-eva!") garden = build(:garden, name: "best-garden-eva!")
garden.should be_valid garden.should be_valid
end end
it "doesn't allow a name with only spaces" do it "doesn't allow a name with only spaces" do
garden = FactoryBot.build(:garden, name: " ") garden = build(:garden, name: " ")
garden.should_not be_valid garden.should_not be_valid
end end
it "doesn't allow new line chars in garden names" do it "doesn't allow new line chars in garden names" do
garden = FactoryBot.build(:garden, name: "My garden\nI am a 1337 hacker") garden = build(:garden, name: "My garden\nI am a 1337 hacker")
garden.should_not be_valid garden.should_not be_valid
end end
@@ -63,9 +63,9 @@ describe Garden do
end end
it "destroys plantings when deleted" do it "destroys plantings when deleted" do
garden = FactoryBot.create(:garden, owner:) garden = create(:garden, owner:)
@planting1 = FactoryBot.create(:planting, garden:, owner: garden.owner) @planting1 = create(:planting, garden:, owner: garden.owner)
@planting2 = FactoryBot.create(:planting, garden:, owner: garden.owner) @planting2 = create(:planting, garden:, owner: garden.owner)
expect(garden.plantings.size).to eq(2) expect(garden.plantings.size).to eq(2)
all = Planting.count all = Planting.count
garden.destroy garden.destroy
@@ -74,37 +74,37 @@ describe Garden do
context 'area' do context 'area' do
it 'allows numeric area' do it 'allows numeric area' do
garden = FactoryBot.build(:garden, area: 33) garden = build(:garden, area: 33)
garden.should be_valid garden.should be_valid
end end
it "doesn't allow negative area" do it "doesn't allow negative area" do
garden = FactoryBot.build(:garden, area: -5) garden = build(:garden, area: -5)
garden.should_not be_valid garden.should_not be_valid
end end
it 'allows decimal quantities' do it 'allows decimal quantities' do
garden = FactoryBot.build(:garden, area: 3.3) garden = build(:garden, area: 3.3)
garden.should be_valid garden.should be_valid
end end
it 'allows blank quantities' do it 'allows blank quantities' do
garden = FactoryBot.build(:garden, area: '') garden = build(:garden, area: '')
garden.should be_valid garden.should be_valid
end end
it 'allows nil quantities' do it 'allows nil quantities' do
garden = FactoryBot.build(:garden, area: nil) garden = build(:garden, area: nil)
garden.should be_valid garden.should be_valid
end end
it 'cleans up zero quantities' do it 'cleans up zero quantities' do
garden = FactoryBot.build(:garden, area: 0) garden = build(:garden, area: 0)
expect(garden.area).to eq 0 expect(garden.area).to eq 0
end end
it "doesn't allow non-numeric quantities" do it "doesn't allow non-numeric quantities" do
garden = FactoryBot.build(:garden, area: "99a") garden = build(:garden, area: "99a")
garden.should_not be_valid garden.should_not be_valid
end end
end end
@@ -112,27 +112,27 @@ describe Garden do
context 'units' do context 'units' do
Garden::AREA_UNITS_VALUES.values.push(nil, '').each do |s| Garden::AREA_UNITS_VALUES.values.push(nil, '').each do |s|
it "#{s} should be a valid unit" do it "#{s} should be a valid unit" do
garden = FactoryBot.build(:garden, area_unit: s) garden = build(:garden, area_unit: s)
garden.should be_valid garden.should be_valid
end end
end end
it 'refuses invalid unit values' do it 'refuses invalid unit values' do
garden = FactoryBot.build(:garden, area_unit: 'not valid') garden = build(:garden, area_unit: 'not valid')
garden.should_not be_valid garden.should_not be_valid
garden.errors[:area_unit].should include("not valid is not a valid area unit") garden.errors[:area_unit].should include("not valid is not a valid area unit")
end end
it 'sets area unit to blank if area is blank' do it 'sets area unit to blank if area is blank' do
garden = FactoryBot.build(:garden, area: '', area_unit: 'acre') garden = build(:garden, area: '', area_unit: 'acre')
garden.should be_valid garden.should be_valid
expect(garden.area_unit).to be_nil expect(garden.area_unit).to be_nil
end end
end end
context 'active scopes' do context 'active scopes' do
let(:active) { FactoryBot.create(:garden) } let(:active) { create(:garden) }
let(:inactive) { FactoryBot.create(:inactive_garden) } let(:inactive) { create(:inactive_garden) }
it 'includes active garden in active scope' do it 'includes active garden in active scope' do
described_class.active.should include active described_class.active.should include active
@@ -146,9 +146,9 @@ describe Garden do
end end
it "marks plantings as finished when garden is inactive" do it "marks plantings as finished when garden is inactive" do
garden = FactoryBot.create(:garden) garden = create(:garden)
p1 = FactoryBot.create(:planting, garden:, owner: garden.owner) p1 = create(:planting, garden:, owner: garden.owner)
p2 = FactoryBot.create(:planting, garden:, owner: garden.owner) p2 = create(:planting, garden:, owner: garden.owner)
expect(p1.finished).to be false expect(p1.finished).to be false
expect(p2.finished).to be false expect(p2.finished).to be false
@@ -163,10 +163,10 @@ describe Garden do
end end
it "doesn't mark the wrong plantings as finished" do it "doesn't mark the wrong plantings as finished" do
g1 = FactoryBot.create(:garden) g1 = create(:garden)
g2 = FactoryBot.create(:garden) g2 = create(:garden)
p1 = FactoryBot.create(:planting, garden: g1, owner: g1.owner) p1 = create(:planting, garden: g1, owner: g1.owner)
p2 = FactoryBot.create(:planting, garden: g2, owner: g2.owner) p2 = create(:planting, garden: g2, owner: g2.owner)
# mark the garden as inactive # mark the garden as inactive
g1.active = false g1.active = false
@@ -182,8 +182,8 @@ describe Garden do
end end
context 'photos' do context 'photos' do
let(:garden) { FactoryBot.create(:garden) } let(:garden) { create(:garden) }
let(:photo) { FactoryBot.create(:photo, owner: garden.owner) } let(:photo) { create(:photo, owner: garden.owner) }
before do before do
garden.photos << photo garden.photos << photo
@@ -204,7 +204,7 @@ describe Garden do
end end
it 'chooses the most recent photo' do it 'chooses the most recent photo' do
@photo2 = FactoryBot.create(:photo, owner: garden.owner) @photo2 = create(:photo, owner: garden.owner)
garden.photos << @photo2 garden.photos << @photo2
expect(garden.default_photo).to eq @photo2 expect(garden.default_photo).to eq @photo2
end end

View File

@@ -3,36 +3,36 @@
require 'rails_helper' require 'rails_helper'
describe GardenType do describe GardenType do
let(:garden) { FactoryBot.create(:garden, 'Free Carrots') } let(:garden) { create(:garden, 'Free Carrots') }
describe "should have a name" do describe "should have a name" do
let(:garden_type) { FactoryBot.build(:garden_type, name: "organic") } let(:garden_type) { build(:garden_type, name: "organic") }
it { expect(garden_type).to be_valid } it { expect(garden_type).to be_valid }
end end
describe "doesn't allow a nil name" do describe "doesn't allow a nil name" do
let(:garden_type) { FactoryBot.build(:garden_type, name: nil) } let(:garden_type) { build(:garden_type, name: nil) }
it { expect(garden_type).not_to be_valid } it { expect(garden_type).not_to be_valid }
end end
describe "doesn't allow a blank name" do describe "doesn't allow a blank name" do
let(:garden_type) { FactoryBot.build(:garden_type, name: "") } let(:garden_type) { build(:garden_type, name: "") }
it { expect(garden_type).not_to be_valid } it { expect(garden_type).not_to be_valid }
end end
describe "doesn't allow a name with only spaces" do describe "doesn't allow a name with only spaces" do
let(:garden_type) { FactoryBot.build(:garden_type, name: " ") } let(:garden_type) { build(:garden_type, name: " ") }
it { expect(garden_type).not_to be_valid } it { expect(garden_type).not_to be_valid }
end end
describe "does not delete gardens when deleted" do describe "does not delete gardens when deleted" do
before { FactoryBot.create(:garden, garden_type:) } before { create(:garden, garden_type:) }
let(:garden_type) { FactoryBot.create(:garden_type, name: "Massive Flower Pot") } let(:garden_type) { create(:garden_type, name: "Massive Flower Pot") }
it { expect(garden_type.gardens.size).to eq(1) } it { expect(garden_type.gardens.size).to eq(1) }
it { expect { garden_type.destroy }.not_to change(Garden, :count) } it { expect { garden_type.destroy }.not_to change(Garden, :count) }

View File

@@ -4,43 +4,43 @@ require 'rails_helper'
describe Harvest do describe Harvest do
it "has an owner" do it "has an owner" do
harvest = FactoryBot.create(:harvest) harvest = create(:harvest)
harvest.owner.should be_an_instance_of Member harvest.owner.should be_an_instance_of Member
end end
it "has a crop" do it "has a crop" do
harvest = FactoryBot.create(:harvest) harvest = create(:harvest)
harvest.crop.should be_an_instance_of Crop harvest.crop.should be_an_instance_of Crop
end end
context 'quantity' do context 'quantity' do
it 'allows numeric quantities' do it 'allows numeric quantities' do
@harvest = FactoryBot.build(:harvest, quantity: 33) @harvest = build(:harvest, quantity: 33)
@harvest.should be_valid @harvest.should be_valid
end end
it 'allows decimal quantities' do it 'allows decimal quantities' do
@harvest = FactoryBot.build(:harvest, quantity: 3.3) @harvest = build(:harvest, quantity: 3.3)
@harvest.should be_valid @harvest.should be_valid
end end
it 'allows blank quantities' do it 'allows blank quantities' do
@harvest = FactoryBot.build(:harvest, quantity: '') @harvest = build(:harvest, quantity: '')
@harvest.should be_valid @harvest.should be_valid
end end
it 'allows nil quantities' do it 'allows nil quantities' do
@harvest = FactoryBot.build(:harvest, quantity: nil) @harvest = build(:harvest, quantity: nil)
@harvest.should be_valid @harvest.should be_valid
end end
it 'cleans up zero quantities' do it 'cleans up zero quantities' do
@harvest = FactoryBot.build(:harvest, quantity: 0) @harvest = build(:harvest, quantity: 0)
expect(@harvest.quantity).to eq 0 expect(@harvest.quantity).to eq 0
end end
it "doesn't allow non-numeric quantities" do it "doesn't allow non-numeric quantities" do
@harvest = FactoryBot.build(:harvest, quantity: "99a") @harvest = build(:harvest, quantity: "99a")
@harvest.should_not be_valid @harvest.should_not be_valid
end end
end end
@@ -49,19 +49,19 @@ describe Harvest do
it 'all valid units should work' do it 'all valid units should work' do
['individual', 'bunch', 'sprig', 'handful', 'litre', ['individual', 'bunch', 'sprig', 'handful', 'litre',
'pint', 'quart', 'bucket', 'basket', 'bushel', nil, ''].each do |s| 'pint', 'quart', 'bucket', 'basket', 'bushel', nil, ''].each do |s|
@harvest = FactoryBot.build(:harvest, unit: s) @harvest = build(:harvest, unit: s)
@harvest.should be_valid @harvest.should be_valid
end end
end end
it 'refuses invalid unit values' do it 'refuses invalid unit values' do
@harvest = FactoryBot.build(:harvest, unit: 'not valid') @harvest = build(:harvest, unit: 'not valid')
@harvest.should_not be_valid @harvest.should_not be_valid
@harvest.errors[:unit].should include("not valid is not a valid unit") @harvest.errors[:unit].should include("not valid is not a valid unit")
end end
it 'sets unit to blank if quantity is blank' do it 'sets unit to blank if quantity is blank' do
@harvest = FactoryBot.build(:harvest, quantity: '', unit: 'individual') @harvest = build(:harvest, quantity: '', unit: 'individual')
@harvest.should be_valid @harvest.should be_valid
expect(@harvest.unit).to be_nil expect(@harvest.unit).to be_nil
end end
@@ -69,32 +69,32 @@ describe Harvest do
context 'weight quantity' do context 'weight quantity' do
it 'allows numeric weight quantities' do it 'allows numeric weight quantities' do
@harvest = FactoryBot.build(:harvest, weight_quantity: 33) @harvest = build(:harvest, weight_quantity: 33)
@harvest.should be_valid @harvest.should be_valid
end end
it 'allows decimal weight quantities' do it 'allows decimal weight quantities' do
@harvest = FactoryBot.build(:harvest, weight_quantity: 3.3) @harvest = build(:harvest, weight_quantity: 3.3)
@harvest.should be_valid @harvest.should be_valid
end end
it 'allows blank weight quantities' do it 'allows blank weight quantities' do
@harvest = FactoryBot.build(:harvest, weight_quantity: '') @harvest = build(:harvest, weight_quantity: '')
@harvest.should be_valid @harvest.should be_valid
end end
it 'allows nil weight quantities' do it 'allows nil weight quantities' do
@harvest = FactoryBot.build(:harvest, weight_quantity: nil) @harvest = build(:harvest, weight_quantity: nil)
@harvest.should be_valid @harvest.should be_valid
end end
it 'cleans up zero quantities' do it 'cleans up zero quantities' do
@harvest = FactoryBot.build(:harvest, weight_quantity: 0) @harvest = build(:harvest, weight_quantity: 0)
expect(@harvest.weight_quantity).to eq 0 expect(@harvest.weight_quantity).to eq 0
end end
it "doesn't allow non-numeric weight quantities" do it "doesn't allow non-numeric weight quantities" do
@harvest = FactoryBot.build(:harvest, weight_quantity: "99a") @harvest = build(:harvest, weight_quantity: "99a")
@harvest.should_not be_valid @harvest.should_not be_valid
end end
end end
@@ -102,19 +102,19 @@ describe Harvest do
context 'weight units' do context 'weight units' do
it 'all valid units should work' do it 'all valid units should work' do
['kg', 'lb', 'oz', nil, ''].each do |s| ['kg', 'lb', 'oz', nil, ''].each do |s|
@harvest = FactoryBot.build(:harvest, weight_unit: s) @harvest = build(:harvest, weight_unit: s)
@harvest.should be_valid @harvest.should be_valid
end end
end end
it 'refuses invalid weight unit values' do it 'refuses invalid weight unit values' do
@harvest = FactoryBot.build(:harvest, weight_unit: 'not valid') @harvest = build(:harvest, weight_unit: 'not valid')
@harvest.should_not be_valid @harvest.should_not be_valid
@harvest.errors[:weight_unit].should include("not valid is not a valid unit") @harvest.errors[:weight_unit].should include("not valid is not a valid unit")
end end
it 'sets weight_unit to blank if quantity is blank' do it 'sets weight_unit to blank if quantity is blank' do
@harvest = FactoryBot.build(:harvest, weight_quantity: '', weight_unit: 'kg') @harvest = build(:harvest, weight_quantity: '', weight_unit: 'kg')
@harvest.should be_valid @harvest.should be_valid
expect(@harvest.weight_unit).to be_nil expect(@harvest.weight_unit).to be_nil
end end
@@ -122,19 +122,19 @@ describe Harvest do
context "standardized weights" do context "standardized weights" do
it 'converts from pounds' do it 'converts from pounds' do
@harvest = FactoryBot.create(:harvest, weight_quantity: 2, weight_unit: "lb") @harvest = create(:harvest, weight_quantity: 2, weight_unit: "lb")
@harvest.should be_valid @harvest.should be_valid
expect(@harvest.reload.si_weight).to eq 0.907 expect(@harvest.reload.si_weight).to eq 0.907
end end
it 'converts from ounces' do it 'converts from ounces' do
@harvest = FactoryBot.create(:harvest, weight_quantity: 16, weight_unit: "oz") @harvest = create(:harvest, weight_quantity: 16, weight_unit: "oz")
@harvest.should be_valid @harvest.should be_valid
expect(@harvest.reload.si_weight).to eq 0.454 expect(@harvest.reload.si_weight).to eq 0.454
end end
it 'leaves kg alone' do it 'leaves kg alone' do
@harvest = FactoryBot.create(:harvest, weight_quantity: 2, weight_unit: "kg") @harvest = create(:harvest, weight_quantity: 2, weight_unit: "kg")
@harvest.should be_valid @harvest.should be_valid
expect(@harvest.reload.si_weight).to eq 2.0 expect(@harvest.reload.si_weight).to eq 2.0
end end
@@ -142,91 +142,91 @@ describe Harvest do
context 'ordering' do context 'ordering' do
it 'lists most recent harvests first' do it 'lists most recent harvests first' do
@h1 = FactoryBot.create(:harvest, created_at: 1.day.ago) @h1 = create(:harvest, created_at: 1.day.ago)
@h2 = FactoryBot.create(:harvest, created_at: 1.hour.ago) @h2 = create(:harvest, created_at: 1.hour.ago)
expect(described_class.all.order(created_at: :desc)).to eq [@h2, @h1] expect(described_class.all.order(created_at: :desc)).to eq [@h2, @h1]
end end
end end
context "stringification" do context "stringification" do
let(:crop) { FactoryBot.create(:crop, name: "apricot") } let(:crop) { create(:crop, name: "apricot") }
it "apricots" do it "apricots" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: nil, quantity: nil,
unit: nil, unit: nil,
weight_quantity: nil, weight_quantity: nil,
weight_unit: nil) weight_unit: nil)
expect(@h.to_s).to eq "apricots" expect(@h.to_s).to eq "apricots"
end end
it "1 individual apricot" do it "1 individual apricot" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: 1, quantity: 1,
unit: 'individual', unit: 'individual',
weight_quantity: nil, weight_quantity: nil,
weight_unit: nil) weight_unit: nil)
expect(@h.to_s).to eq "1 individual apricot" expect(@h.to_s).to eq "1 individual apricot"
end end
it "10 individual apricots" do it "10 individual apricots" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: 10, quantity: 10,
unit: 'individual', unit: 'individual',
weight_quantity: nil, weight_quantity: nil,
weight_unit: nil) weight_unit: nil)
expect(@h.to_s).to eq "10 individual apricots" expect(@h.to_s).to eq "10 individual apricots"
end end
it "1 bushel of apricots" do it "1 bushel of apricots" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: 1, quantity: 1,
unit: 'bushel', unit: 'bushel',
weight_quantity: nil, weight_quantity: nil,
weight_unit: nil) weight_unit: nil)
expect(@h.to_s).to eq "1 bushel of apricots" expect(@h.to_s).to eq "1 bushel of apricots"
end end
it "1.5 bushels of apricots" do it "1.5 bushels of apricots" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: 1.5, quantity: 1.5,
unit: 'bushel', unit: 'bushel',
weight_quantity: nil, weight_quantity: nil,
weight_unit: nil) weight_unit: nil)
expect(@h.to_s).to eq "1.5 bushels of apricots" expect(@h.to_s).to eq "1.5 bushels of apricots"
end end
it "10 bushels of apricots" do it "10 bushels of apricots" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: 10, quantity: 10,
unit: 'bushel', unit: 'bushel',
weight_quantity: nil, weight_quantity: nil,
weight_unit: nil) weight_unit: nil)
expect(@h.to_s).to eq "10 bushels of apricots" expect(@h.to_s).to eq "10 bushels of apricots"
end end
it "apricots weighing 1.2 kg" do it "apricots weighing 1.2 kg" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: nil, quantity: nil,
unit: nil, unit: nil,
weight_quantity: 1.2, weight_quantity: 1.2,
weight_unit: 'kg') weight_unit: 'kg')
expect(@h.to_s).to eq "apricots weighing 1.2 kg" expect(@h.to_s).to eq "apricots weighing 1.2 kg"
end end
it "10 bushels of apricots weighing 100 kg" do it "10 bushels of apricots weighing 100 kg" do
@h = FactoryBot.create(:harvest, crop:, @h = create(:harvest, crop:,
quantity: 10, quantity: 10,
unit: 'bushel', unit: 'bushel',
weight_quantity: 100, weight_quantity: 100,
weight_unit: 'kg') weight_unit: 'kg')
expect(@h.to_s).to eq "10 bushels of apricots weighing 100 kg" expect(@h.to_s).to eq "10 bushels of apricots weighing 100 kg"
end end
end end
context 'photos' do context 'photos' do
before do before do
@harvest = FactoryBot.create(:harvest) @harvest = create(:harvest)
end end
context 'without a photo' do context 'without a photo' do
@@ -236,8 +236,8 @@ describe Harvest do
context 'and with a crop(planting) photo' do context 'and with a crop(planting) photo' do
before do before do
@planting = FactoryBot.create(:planting, crop: @harvest.crop) @planting = create(:planting, crop: @harvest.crop)
@photo = FactoryBot.create(:photo, owner: @planting.owner) @photo = create(:photo, owner: @planting.owner)
@planting.photos << @photo @planting.photos << @photo
@harvest.update(planting: @planting) @harvest.update(planting: @planting)
end end
@@ -250,7 +250,7 @@ describe Harvest do
context 'with a photo' do context 'with a photo' do
before do before do
@photo = FactoryBot.create(:photo, owner: @harvest.owner) @photo = create(:photo, owner: @harvest.owner)
@harvest.photos << @photo @harvest.photos << @photo
end end
@@ -274,8 +274,8 @@ describe Harvest do
context 'and with a crop(planting) photo' do context 'and with a crop(planting) photo' do
before do before do
@planting = FactoryBot.create(:planting, crop: @harvest.crop) @planting = create(:planting, crop: @harvest.crop)
@crop_photo = FactoryBot.create(:photo, owner: @planting.owner) @crop_photo = create(:photo, owner: @planting.owner)
@planting.photos << @crop_photo @planting.photos << @crop_photo
end end
@@ -286,7 +286,7 @@ describe Harvest do
context 'and a second photo' do context 'and a second photo' do
before do before do
@photo2 = FactoryBot.create(:photo, owner: @harvest.owner) @photo2 = create(:photo, owner: @harvest.owner)
@harvest.photos << @photo2 @harvest.photos << @photo2
end end
@@ -298,8 +298,8 @@ describe Harvest do
end end
it 'excludes deleted members' do it 'excludes deleted members' do
member = FactoryBot.create(:member) member = create(:member)
harvest = FactoryBot.create(:harvest, owner: member) harvest = create(:harvest, owner: member)
expect(described_class.joins(:owner).all).to include(harvest) expect(described_class.joins(:owner).all).to include(harvest)
member.destroy member.destroy
expect(described_class.joins(:owner).all).not_to include(harvest) expect(described_class.joins(:owner).all).not_to include(harvest)

View File

@@ -3,9 +3,9 @@
require 'rails_helper' require 'rails_helper'
describe Like do describe Like do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:post) { FactoryBot.create(:post) } let(:post) { create(:post) }
let(:photo) { FactoryBot.create(:photo) } let(:photo) { create(:photo) }
context 'existing like' do context 'existing like' do
before do before do

View File

@@ -4,7 +4,7 @@ require 'rails_helper'
describe Member do describe Member do
context 'valid member' do context 'valid member' do
let!(:member) { FactoryBot.create(:member, login_name: 'hinemoa') } let!(:member) { create(:member, login_name: 'hinemoa') }
describe 'should be fetchable from the database' do describe 'should be fetchable from the database' do
subject { Member.find(member.id) } subject { Member.find(member.id) }
@@ -35,7 +35,7 @@ describe Member do
end end
it 'is able to fetch posts' do it 'is able to fetch posts' do
post = FactoryBot.create(:post, author: member) post = create(:post, author: member)
expect(member.posts).to eq [post] expect(member.posts).to eq [post]
end end
@@ -44,27 +44,27 @@ describe Member do
end end
it 'has many plantings' do it 'has many plantings' do
FactoryBot.create(:planting, owner: member) create(:planting, owner: member)
member.plantings.size.should eq 1 member.plantings.size.should eq 1
end end
it "has many comments" do it "has many comments" do
FactoryBot.create(:comment, author: member) create(:comment, author: member)
FactoryBot.create(:comment, author: member) create(:comment, author: member)
member.comments.size.should == 2 member.comments.size.should == 2
end end
it "has many forums" do it "has many forums" do
FactoryBot.create(:forum, owner: member) create(:forum, owner: member)
FactoryBot.create(:forum, owner: member) create(:forum, owner: member)
member.forums.size.should == 2 member.forums.size.should == 2
end end
it "has many likes" do it "has many likes" do
@post1 = FactoryBot.create(:post, author: member) @post1 = create(:post, author: member)
@post2 = FactoryBot.create(:post, author: member) @post2 = create(:post, author: member)
@like1 = FactoryBot.create(:like, member:, likeable: @post1) @like1 = create(:like, member:, likeable: @post1)
@like2 = FactoryBot.create(:like, member:, likeable: @post2) @like2 = create(:like, member:, likeable: @post2)
expect(member.likes.length).to eq 2 expect(member.likes.length).to eq 2
end end
@@ -93,7 +93,7 @@ describe Member do
end end
context 'no TOS agreement' do context 'no TOS agreement' do
let(:member) { FactoryBot.build(:no_tos_member) } let(:member) { build(:no_tos_member) }
it "refuses to save a member who hasn't agreed to the TOS" do it "refuses to save a member who hasn't agreed to the TOS" do
member.save.should_not be(true) member.save.should_not be(true)
@@ -102,8 +102,8 @@ describe Member do
context 'newsletter scope' do context 'newsletter scope' do
it 'finds newsletter recipients' do it 'finds newsletter recipients' do
member1 = FactoryBot.create(:member) member1 = create(:member)
member2 = FactoryBot.create(:newsletter_recipient_member) member2 = create(:newsletter_recipient_member)
Member.wants_newsletter.should include member2 Member.wants_newsletter.should include member2
Member.wants_newsletter.should_not include member1 Member.wants_newsletter.should_not include member1
end end
@@ -111,15 +111,15 @@ describe Member do
context 'same :login_name' do context 'same :login_name' do
it "does not allow two members with the same login_name" do it "does not allow two members with the same login_name" do
FactoryBot.create(:member, login_name: "bob") create(:member, login_name: "bob")
member = FactoryBot.build(:member, login_name: "bob") member = build(:member, login_name: "bob")
member.should_not be_valid member.should_not be_valid
member.errors[:login_name].should include("has already been taken") member.errors[:login_name].should include("has already been taken")
end end
it "tests uniqueness case-insensitively" do it "tests uniqueness case-insensitively" do
FactoryBot.create(:member, login_name: "bob") create(:member, login_name: "bob")
member = FactoryBot.build(:member, login_name: "BoB") member = build(:member, login_name: "BoB")
member.should_not be_valid member.should_not be_valid
member.errors[:login_name].should include("has already been taken") member.errors[:login_name].should include("has already been taken")
end end
@@ -127,38 +127,38 @@ describe Member do
context 'case sensitivity' do context 'case sensitivity' do
it 'preserves case of login name' do it 'preserves case of login name' do
FactoryBot.create(:member, login_name: "BOB") create(:member, login_name: "BOB")
Member.find('bob').login_name.should eq 'BOB' Member.find('bob').login_name.should eq 'BOB'
end end
end end
context 'invalid login names' do context 'invalid login names' do
it "doesn't allow short names" do it "doesn't allow short names" do
member = FactoryBot.build(:invalid_member_shortname) member = build(:invalid_member_shortname)
member.should_not be_valid member.should_not be_valid
member.errors[:login_name].should include("should be between 2 and 25 characters long") member.errors[:login_name].should include("should be between 2 and 25 characters long")
end end
it "doesn't allow really long names" do it "doesn't allow really long names" do
member = FactoryBot.build(:invalid_member_longname) member = build(:invalid_member_longname)
member.should_not be_valid member.should_not be_valid
member.errors[:login_name].should include("should be between 2 and 25 characters long") member.errors[:login_name].should include("should be between 2 and 25 characters long")
end end
it "doesn't allow spaces in names" do it "doesn't allow spaces in names" do
member = FactoryBot.build(:invalid_member_spaces) member = build(:invalid_member_spaces)
member.should_not be_valid member.should_not be_valid
member.errors[:login_name].should include("may only include letters, numbers, or underscores") member.errors[:login_name].should include("may only include letters, numbers, or underscores")
end end
it "doesn't allow other chars in names" do it "doesn't allow other chars in names" do
member = FactoryBot.build(:invalid_member_badchars) member = build(:invalid_member_badchars)
member.should_not be_valid member.should_not be_valid
member.errors[:login_name].should include("may only include letters, numbers, or underscores") member.errors[:login_name].should include("may only include letters, numbers, or underscores")
end end
it "doesn't allow reserved names" do it "doesn't allow reserved names" do
member = FactoryBot.build(:invalid_member_badname) member = build(:invalid_member_badname)
member.should_not be_valid member.should_not be_valid
member.errors[:login_name].should include("name is reserved") member.errors[:login_name].should include("name is reserved")
end end
@@ -166,24 +166,24 @@ describe Member do
context 'valid login names' do context 'valid login names' do
it "allows plain alphanumeric chars in names" do it "allows plain alphanumeric chars in names" do
member = FactoryBot.build(:valid_member_alphanumeric) member = build(:valid_member_alphanumeric)
member.should be_valid member.should be_valid
end end
it "allows uppercase chars in names" do it "allows uppercase chars in names" do
member = FactoryBot.build(:valid_member_uppercase) member = build(:valid_member_uppercase)
member.should be_valid member.should be_valid
end end
it "allows underscores in names" do it "allows underscores in names" do
member = FactoryBot.build(:valid_member_underscore) member = build(:valid_member_underscore)
member.should be_valid member.should be_valid
end end
end end
context 'roles' do context 'roles' do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:role) { FactoryBot.create(:role) } let(:role) { create(:role) }
before do before do
member.roles << role member.roles << role
@@ -195,13 +195,13 @@ describe Member do
end end
it 'sets up roles in factories' do it 'sets up roles in factories' do
admin = FactoryBot.create(:admin_member) admin = create(:admin_member)
admin.role?(:admin).should be true admin.role?(:admin).should be true
end end
it 'converts role names properly' do it 'converts role names properly' do
# need to make sure spaces get turned to underscores # need to make sure spaces get turned to underscores
role = FactoryBot.create(:role, name: "a b c") role = create(:role, name: "a b c")
member.roles << role member.roles << role
member.role?(:a_b_c).should be true member.role?(:a_b_c).should be true
end end
@@ -209,8 +209,8 @@ describe Member do
context 'confirmed scope' do context 'confirmed scope' do
before do before do
FactoryBot.create(:member) create(:member)
FactoryBot.create(:member) create(:member)
end end
it 'sees confirmed members' do it 'sees confirmed members' do
@@ -218,7 +218,7 @@ describe Member do
end end
it 'ignores unconfirmed members' do it 'ignores unconfirmed members' do
FactoryBot.create(:unconfirmed_member) create(:unconfirmed_member)
Member.confirmed.size.should == 2 Member.confirmed.size.should == 2
end end
end end
@@ -226,17 +226,17 @@ describe Member do
context 'located scope' do context 'located scope' do
# located members must have location, lat, long # located members must have location, lat, long
it 'finds members who have locations' do it 'finds members who have locations' do
london_member = FactoryBot.create(:london_member) london_member = create(:london_member)
Member.located.should include london_member Member.located.should include london_member
end end
it 'ignores members with blank locations' do it 'ignores members with blank locations' do
nowhere_member = FactoryBot.create(:member) nowhere_member = create(:member)
Member.located.should_not include nowhere_member Member.located.should_not include nowhere_member
end end
it 'ignores members with blank lat/long' do it 'ignores members with blank lat/long' do
london_member = FactoryBot.create(:london_member) london_member = create(:london_member)
london_member.latitude = nil london_member.latitude = nil
london_member.longitude = nil london_member.longitude = nil
london_member.save(validate: false) london_member.save(validate: false)
@@ -246,8 +246,8 @@ describe Member do
context 'near location' do context 'near location' do
it 'finds nearby members and sorts them' do it 'finds nearby members and sorts them' do
edinburgh_member = FactoryBot.create(:edinburgh_member) edinburgh_member = create(:edinburgh_member)
london_member = FactoryBot.create(:london_member) london_member = create(:london_member)
Member.nearest_to('Greenwich, UK').should eq [london_member, edinburgh_member] Member.nearest_to('Greenwich, UK').should eq [london_member, edinburgh_member]
end end
end end
@@ -266,10 +266,10 @@ describe Member do
:unconfirmed_member, # !1 :unconfirmed_member, # !1
:london_member, # 1, 2, !3 :london_member, # 1, 2, !3
:member # 1, !2, 3 :member # 1, !2, 3
].collect { |m| FactoryBot.create(m) } ].collect { |m| create(m) }
[0, 1, 2, 3, 5].each do |i| [0, 1, 2, 3, 5].each do |i|
FactoryBot.create(:planting, owner: @members[i]) create(:planting, owner: @members[i])
end end
@members[0].updated_at = 3.days.ago @members[0].updated_at = 3.days.ago
@@ -281,7 +281,7 @@ describe Member do
@result = Member.interesting @result = Member.interesting
# Some members have multiple plantings, but should only appear once # Some members have multiple plantings, but should only appear once
FactoryBot.create_list(:planting, 3, owner: @members[2]) create_list(:planting, 3, owner: @members[2])
end end
it 'finds interesting members without duplicates in the correct order' do it 'finds interesting members without duplicates in the correct order' do
@@ -292,16 +292,16 @@ describe Member do
context 'harvests' do context 'harvests' do
it 'has harvests' do it 'has harvests' do
member = FactoryBot.create(:member) member = create(:member)
harvest = FactoryBot.create(:harvest, owner: member) harvest = create(:harvest, owner: member)
member.harvests.should eq [harvest] member.harvests.should eq [harvest]
end end
end end
context 'member who followed another member' do context 'member who followed another member' do
let(:member1) { FactoryBot.create(:member) } let(:member1) { create(:member) }
let(:member2) { FactoryBot.create(:member) } let(:member2) { create(:member) }
let(:member3) { FactoryBot.create(:member) } let(:member3) { create(:member) }
before do before do
@follow = member1.follows.create(follower_id: member1.id, followed_id: member2.id) @follow = member1.follows.create(follower_id: member1.id, followed_id: member2.id)
@@ -329,7 +329,7 @@ describe Member do
end end
context 'subscriptions' do context 'subscriptions' do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let(:gb) { instance_double("Gibbon::API.new") } let(:gb) { instance_double("Gibbon::API.new") }
it 'subscribes to the newsletter' do it 'subscribes to the newsletter' do
@@ -344,7 +344,7 @@ describe Member do
end end
context 'member deleted' do context 'member deleted' do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
context 'queries a scope' do context 'queries a scope' do
before { member.destroy } before { member.destroy }
@@ -365,12 +365,12 @@ describe Member do
end end
context "deleted admin member" do context "deleted admin member" do
let(:member) { FactoryBot.create(:admin_member) } let(:member) { create(:admin_member) }
before { member.discard } before { member.discard }
context 'crop creator' do context 'crop creator' do
let!(:crop) { FactoryBot.create(:crop, creator: member) } let!(:crop) { create(:crop, creator: member) }
it "leaves crops behind, reassigned to cropbot" do it "leaves crops behind, reassigned to cropbot" do
expect(Crop.all).to include(crop) expect(Crop.all).to include(crop)
@@ -378,7 +378,7 @@ describe Member do
end end
context 'forum owners' do context 'forum owners' do
let!(:forum) { FactoryBot.create(:forum, owner: member) } let!(:forum) { create(:forum, owner: member) }
it "leaves forums behind, reassigned to ex_admin" do it "leaves forums behind, reassigned to ex_admin" do
expect(forum.owner).to eq(member) expect(forum.owner).to eq(member)

View File

@@ -3,7 +3,7 @@
require 'rails_helper' require 'rails_helper'
describe Notification do describe Notification do
let(:notification) { FactoryBot.create(:notification) } let(:notification) { create(:notification) }
it "belongs to a post" do it "belongs to a post" do
expect(notification.notifiable).to be_an_instance_of Post expect(notification.notifiable).to be_an_instance_of Post
@@ -19,36 +19,36 @@ describe Notification do
it "has a scope for unread" do it "has a scope for unread" do
expect(described_class.unread).to eq [notification] expect(described_class.unread).to eq [notification]
@n2 = FactoryBot.create(:notification, read: true) @n2 = create(:notification, read: true)
expect(described_class.unread).to eq [notification] expect(described_class.unread).to eq [notification]
@n3 = FactoryBot.create(:notification, read: false) @n3 = create(:notification, read: false)
expect(described_class.unread).to include @n3 expect(described_class.unread).to include @n3
expect(described_class.unread).to include notification expect(described_class.unread).to include notification
end end
it "sends email if asked" do it "sends email if asked" do
@notification2 = FactoryBot.create(:notification) @notification2 = create(:notification)
@notification2.send_message @notification2.send_message
expect(ActionMailer::Base.deliveries.last&.to).to eq [@notification2.recipient.email] expect(ActionMailer::Base.deliveries.last&.to).to eq [@notification2.recipient.email]
end end
it "doesn't send email to people who don't want it" do it "doesn't send email to people who don't want it" do
FactoryBot.create(:no_email_notification).send_message create(:no_email_notification).send_message
expect(ActionMailer::Base.deliveries.last&.to).not_to eq [notification.recipient.email] expect(ActionMailer::Base.deliveries.last&.to).not_to eq [notification.recipient.email]
end end
it "sends email on creation" do it "sends email on creation" do
@notification2 = FactoryBot.create(:notification) @notification2 = create(:notification)
expect(ActionMailer::Base.deliveries.last&.to).to eq [@notification2.recipient.email] expect(ActionMailer::Base.deliveries.last&.to).to eq [@notification2.recipient.email]
end end
it "replaces missing subjects with (no subject)" do it "replaces missing subjects with (no subject)" do
notification = FactoryBot.create(:notification, subject: nil) notification = create(:notification, subject: nil)
expect(notification.subject).to eq "(no subject)" expect(notification.subject).to eq "(no subject)"
end end
it "replaces whitespace-only subjects with (no subject)" do it "replaces whitespace-only subjects with (no subject)" do
notification = FactoryBot.create(:notification, subject: " ") notification = create(:notification, subject: " ")
expect(notification.subject).to eq "(no subject)" expect(notification.subject).to eq "(no subject)"
end end
end end

View File

@@ -3,17 +3,17 @@
require 'rails_helper' require 'rails_helper'
describe Photo do describe Photo do
let(:photo) { FactoryBot.create(:photo, :reindex, owner: member) } let(:photo) { create(:photo, :reindex, owner: member) }
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
it_behaves_like "it is likeable" it_behaves_like "it is likeable"
describe 'add/delete functionality' do describe 'add/delete functionality' do
let(:planting) { FactoryBot.create(:planting, owner: member) } let(:planting) { create(:planting, owner: member) }
let(:seed) { FactoryBot.create(:seed, owner: member) } let(:seed) { create(:seed, owner: member) }
let(:harvest) { FactoryBot.create(:harvest, owner: member) } let(:harvest) { create(:harvest, owner: member) }
let(:post) { FactoryBot.create(:post, author: member) } let(:post) { create(:post, author: member) }
let(:garden) { FactoryBot.create(:garden, owner: member) } let(:garden) { create(:garden, owner: member) }
context "adds photos" do context "adds photos" do
describe 'to a planting' do describe 'to a planting' do
@@ -26,7 +26,7 @@ describe Photo do
it { expect(planting.crop.default_photo).to eq photo } it { expect(planting.crop.default_photo).to eq photo }
describe 'with a second older photo' do describe 'with a second older photo' do
let(:old_photo) { FactoryBot.create(:photo, owner: member, created_at: 1.year.ago, date_taken: 2.years.ago) } let(:old_photo) { create(:photo, owner: member, created_at: 1.year.ago, date_taken: 2.years.ago) }
# Add an old photo # Add an old photo
before { planting.photos << old_photo } before { planting.photos << old_photo }
@@ -35,7 +35,7 @@ describe Photo do
it { expect(planting.crop.default_photo).to eq photo } it { expect(planting.crop.default_photo).to eq photo }
describe 'and someone likes the old photo' do describe 'and someone likes the old photo' do
before { FactoryBot.create(:like, likeable: old_photo) } before { create(:like, likeable: old_photo) }
it { expect(planting.default_photo).to eq old_photo } it { expect(planting.default_photo).to eq old_photo }
it { expect(planting.crop.default_photo).to eq old_photo } it { expect(planting.crop.default_photo).to eq old_photo }
@@ -185,17 +185,17 @@ describe Photo do
end end
describe 'assocations' do describe 'assocations' do
let(:harvest_crop) { FactoryBot.create(:crop, name: 'harvest_crop') } let(:harvest_crop) { create(:crop, name: 'harvest_crop') }
let!(:harvest) { FactoryBot.create(:harvest, owner: member, crop: harvest_crop) } let!(:harvest) { create(:harvest, owner: member, crop: harvest_crop) }
let!(:harvest_photo) { FactoryBot.create(:photo, owner: member) } let!(:harvest_photo) { create(:photo, owner: member) }
let(:planting_crop) { FactoryBot.create(:crop, name: 'planting_crop') } let(:planting_crop) { create(:crop, name: 'planting_crop') }
let!(:planting) { FactoryBot.create(:planting, owner: member, crop: planting_crop) } let!(:planting) { create(:planting, owner: member, crop: planting_crop) }
let!(:planting_photo) { FactoryBot.create(:photo, owner: member) } let!(:planting_photo) { create(:photo, owner: member) }
let(:seed_crop) { FactoryBot.create(:crop, name: 'seed_crop') } let(:seed_crop) { create(:crop, name: 'seed_crop') }
let!(:seed) { FactoryBot.create(:seed, owner: member, crop: seed_crop) } let!(:seed) { create(:seed, owner: member, crop: seed_crop) }
let!(:seed_photo) { FactoryBot.create(:photo, owner: member) } let!(:seed_photo) { create(:photo, owner: member) }
before do before do
harvest.photos << harvest_photo harvest.photos << harvest_photo
@@ -238,8 +238,8 @@ describe Photo do
end end
describe 'Elastic search indexing', :search do describe 'Elastic search indexing', :search do
let!(:planting) { FactoryBot.create(:planting, :reindex, owner: photo.owner) } let!(:planting) { create(:planting, :reindex, owner: photo.owner) }
let!(:crop) { FactoryBot.create(:crop, :reindex) } let!(:crop) { create(:crop, :reindex) }
before do before do
planting.photos << photo planting.photos << photo

View File

@@ -4,33 +4,33 @@ require 'rails_helper'
describe PlantPart do describe PlantPart do
it 'stringifies' do it 'stringifies' do
@pp = FactoryBot.create(:plant_part) @pp = create(:plant_part)
@pp.to_s.should eq @pp.name @pp.to_s.should eq @pp.name
end end
it 'has crops' do it 'has crops' do
@maize = FactoryBot.create(:maize) @maize = create(:maize)
@tomato = FactoryBot.create(:tomato) @tomato = create(:tomato)
@pp1 = FactoryBot.create(:plant_part) @pp1 = create(:plant_part)
@h1 = FactoryBot.create(:harvest, @h1 = create(:harvest,
crop: @tomato, crop: @tomato,
plant_part: @pp1) plant_part: @pp1)
@h2 = FactoryBot.create(:harvest, @h2 = create(:harvest,
crop: @maize, crop: @maize,
plant_part: @pp1) plant_part: @pp1)
@pp1.crops.should include @tomato @pp1.crops.should include @tomato
@pp1.crops.should include @maize @pp1.crops.should include @maize
end end
it "doesn't duplicate crops" do it "doesn't duplicate crops" do
@maize = FactoryBot.create(:maize) @maize = create(:maize)
@pp1 = FactoryBot.create(:plant_part) @pp1 = create(:plant_part)
@h1 = FactoryBot.create(:harvest, @h1 = create(:harvest,
crop: @maize, crop: @maize,
plant_part: @pp1) plant_part: @pp1)
@h2 = FactoryBot.create(:harvest, @h2 = create(:harvest,
crop: @maize, crop: @maize,
plant_part: @pp1) plant_part: @pp1)
@pp1.crops.should eq [@maize] @pp1.crops.should eq [@maize]
end end
end end

View File

@@ -3,15 +3,15 @@
require 'rails_helper' require 'rails_helper'
describe Planting do describe Planting do
let(:crop) { FactoryBot.create(:tomato) } let(:crop) { create(:tomato) }
let(:garden_owner) { FactoryBot.create(:member, login_name: 'hatupatu') } let(:garden_owner) { create(:member, login_name: 'hatupatu') }
let(:garden) { FactoryBot.create(:garden, owner: garden_owner, name: 'Springfield Community Garden') } let(:garden) { create(:garden, owner: garden_owner, name: 'Springfield Community Garden') }
let(:planting) { FactoryBot.create(:planting, crop:, garden:, owner: garden.owner) } let(:planting) { create(:planting, crop:, garden:, owner: garden.owner) }
describe 'planting lifespan predictions' do describe 'planting lifespan predictions' do
context 'no predications data yet' do context 'no predications data yet' do
describe 'planting planted, not finished' do describe 'planting planted, not finished' do
let(:planting) { FactoryBot.create(:planting, planted_at: 30.days.ago, finished_at: nil, finished: false) } let(:planting) { create(:planting, planted_at: 30.days.ago, finished_at: nil, finished: false) }
it { expect(planting.crop.median_lifespan).to be_nil } it { expect(planting.crop.median_lifespan).to be_nil }
it { expect(planting.expected_lifespan).to be_nil } it { expect(planting.expected_lifespan).to be_nil }
@@ -20,7 +20,7 @@ describe Planting do
end end
describe 'planting not planted yet' do describe 'planting not planted yet' do
let(:planting) { FactoryBot.create(:planting, planted_at: nil, finished_at: nil, finished: false) } let(:planting) { create(:planting, planted_at: nil, finished_at: nil, finished: false) }
it { expect(planting.crop.median_lifespan).to be_nil } it { expect(planting.crop.median_lifespan).to be_nil }
it { expect(planting.expected_lifespan).to be_nil } it { expect(planting.expected_lifespan).to be_nil }
@@ -29,7 +29,7 @@ describe Planting do
end end
describe 'planting finished, no planted_at' do describe 'planting finished, no planted_at' do
let(:planting) { FactoryBot.create(:planting, planted_at: nil, finished_at: 1.day.ago, finished: true) } let(:planting) { create(:planting, planted_at: nil, finished_at: 1.day.ago, finished: true) }
it { expect(planting.crop.median_lifespan).to be_nil } it { expect(planting.crop.median_lifespan).to be_nil }
it { expect(planting.expected_lifespan).to be_nil } it { expect(planting.expected_lifespan).to be_nil }
@@ -38,7 +38,7 @@ describe Planting do
end end
describe 'planting all finished' do describe 'planting all finished' do
let(:planting) { FactoryBot.create(:planting, planted_at: 30.days.ago, finished_at: 10.days.ago, finished: true) } let(:planting) { create(:planting, planted_at: 30.days.ago, finished_at: 10.days.ago, finished: true) }
it { expect(planting.crop.median_lifespan).to be_nil } it { expect(planting.crop.median_lifespan).to be_nil }
it { expect(planting.expected_lifespan).to eq(20) } it { expect(planting.expected_lifespan).to eq(20) }
@@ -47,7 +47,7 @@ describe Planting do
end end
describe 'planting finishing in the future' do describe 'planting finishing in the future' do
let(:planting) { FactoryBot.create(:planting, planted_at: 30.days.ago, finished_at: 10.days.from_now, finished: false) } let(:planting) { create(:planting, planted_at: 30.days.ago, finished_at: 10.days.from_now, finished: false) }
it { expect(planting.expected_lifespan).to eq(40) } it { expect(planting.expected_lifespan).to eq(40) }
it { expect(planting.age_in_days).to eq(30) } it { expect(planting.age_in_days).to eq(30) }
@@ -57,18 +57,18 @@ describe Planting do
context 'lots of data' do context 'lots of data' do
before do before do
FactoryBot.create(:planting, crop: planting.crop, planted_at: 10.days.ago) create(:planting, crop: planting.crop, planted_at: 10.days.ago)
FactoryBot.create(:planting, crop: planting.crop, planted_at: 100.days.ago, finished_at: 50.days.ago) create(:planting, crop: planting.crop, planted_at: 100.days.ago, finished_at: 50.days.ago)
FactoryBot.create(:planting, crop: planting.crop, planted_at: 100.days.ago, finished_at: 51.days.ago) create(:planting, crop: planting.crop, planted_at: 100.days.ago, finished_at: 51.days.ago)
FactoryBot.create(:planting, crop: planting.crop, planted_at: 2.years.ago, finished_at: 50.days.ago) create(:planting, crop: planting.crop, planted_at: 2.years.ago, finished_at: 50.days.ago)
FactoryBot.create(:planting, crop: planting.crop, planted_at: 150.days.ago, finished_at: 100.days.ago) create(:planting, crop: planting.crop, planted_at: 150.days.ago, finished_at: 100.days.ago)
planting.crop.update_lifespan_medians planting.crop.update_lifespan_medians
end end
it { expect(planting.crop.median_lifespan).to eq 50 } it { expect(planting.crop.median_lifespan).to eq 50 }
describe 'planting 30 days ago, not finished' do describe 'planting 30 days ago, not finished' do
let(:planting) { FactoryBot.create(:planting, planted_at: 30.days.ago) } let(:planting) { create(:planting, planted_at: 30.days.ago) }
# 30 / 50 = 60% # 30 / 50 = 60%
it { expect(planting.percentage_grown).to eq 60.0 } it { expect(planting.percentage_grown).to eq 60.0 }
@@ -79,8 +79,8 @@ describe Planting do
end end
describe 'child crop uses parent data' do describe 'child crop uses parent data' do
let(:child_crop) { FactoryBot.create(:crop, parent: crop, name: 'child') } let(:child_crop) { create(:crop, parent: crop, name: 'child') }
let(:child_planting) { FactoryBot.create(:planting, crop: child_crop, planted_at: 30.days.ago) } let(:child_planting) { create(:planting, crop: child_crop, planted_at: 30.days.ago) }
# not data for this crop # not data for this crop
it { expect(child_crop.median_lifespan).to be_nil } it { expect(child_crop.median_lifespan).to be_nil }
@@ -93,19 +93,19 @@ describe Planting do
end end
describe 'planting not planted yet' do describe 'planting not planted yet' do
let(:planting) { FactoryBot.create(:planting, planted_at: nil, finished_at: nil) } let(:planting) { create(:planting, planted_at: nil, finished_at: nil) }
it { expect(planting.percentage_grown).to eq 0 } it { expect(planting.percentage_grown).to eq 0 }
end end
describe 'planting finished 10 days, but was never planted' do describe 'planting finished 10 days, but was never planted' do
let(:planting) { FactoryBot.create(:planting, planted_at: nil, finished_at: 10.days.ago) } let(:planting) { create(:planting, planted_at: nil, finished_at: 10.days.ago) }
it { expect(planting.percentage_grown).to eq 100 } it { expect(planting.percentage_grown).to eq 100 }
end end
describe 'planted 30 days ago, finished 10 days ago' do describe 'planted 30 days ago, finished 10 days ago' do
let(:planting) { FactoryBot.create(:planting, planted_at: 30.days.ago, finished_at: 10.days.ago) } let(:planting) { create(:planting, planted_at: 30.days.ago, finished_at: 10.days.ago) }
it { expect(planting.age_in_days).to eq 20 } it { expect(planting.age_in_days).to eq 20 }
it { expect(planting.percentage_grown).to eq 100 } it { expect(planting.percentage_grown).to eq 100 }
@@ -115,7 +115,7 @@ describe Planting do
describe 'planting first harvest preductions' do describe 'planting first harvest preductions' do
context 'no data' do context 'no data' do
let(:planting) { FactoryBot.create(:planting) } let(:planting) { create(:planting) }
it { expect(planting.crop.median_days_to_first_harvest).to be_nil } it { expect(planting.crop.median_days_to_first_harvest).to be_nil }
it { expect(planting.crop.median_days_to_last_harvest).to be_nil } it { expect(planting.crop.median_days_to_last_harvest).to be_nil }
@@ -125,21 +125,21 @@ describe Planting do
end end
context 'lots of data' do context 'lots of data' do
let(:crop) { FactoryBot.create(:crop) } let(:crop) { create(:crop) }
# this is a method so it creates a new one each time # this is a method so it creates a new one each time
def one_hundred_day_old_planting def one_hundred_day_old_planting
FactoryBot.create(:planting, crop:, planted_at: 100.days.ago) create(:planting, crop:, planted_at: 100.days.ago)
end end
before do before do
# 50 days to harvest # 50 days to harvest
FactoryBot.create(:harvest, harvested_at: 50.days.ago, crop: planting.crop, create(:harvest, harvested_at: 50.days.ago, crop: planting.crop,
planting: one_hundred_day_old_planting) planting: one_hundred_day_old_planting)
# 20 days to harvest # 20 days to harvest
FactoryBot.create(:harvest, harvested_at: 80.days.ago, crop: planting.crop, create(:harvest, harvested_at: 80.days.ago, crop: planting.crop,
planting: one_hundred_day_old_planting) planting: one_hundred_day_old_planting)
# 10 days to harvest # 10 days to harvest
FactoryBot.create(:harvest, harvested_at: 90.days.ago, crop: planting.crop, create(:harvest, harvested_at: 90.days.ago, crop: planting.crop,
planting: one_hundred_day_old_planting) planting: one_hundred_day_old_planting)
planting.crop.plantings.each(&:update_harvest_days!) planting.crop.plantings.each(&:update_harvest_days!)
@@ -150,20 +150,20 @@ describe Planting do
it { expect(crop.median_days_to_first_harvest).to eq(20) } it { expect(crop.median_days_to_first_harvest).to eq(20) }
describe 'sets median time to harvest' do describe 'sets median time to harvest' do
let(:planting) { FactoryBot.create(:planting, crop:, planted_at: Time.zone.today) } let(:planting) { create(:planting, crop:, planted_at: Time.zone.today) }
it { expect(planting.first_harvest_predicted_at).to eq(Time.zone.today + 20.days) } it { expect(planting.first_harvest_predicted_at).to eq(Time.zone.today + 20.days) }
end end
describe 'harvest still growing' do describe 'harvest still growing' do
let(:planting) { FactoryBot.create(:planting, crop:, planted_at: Time.zone.today) } let(:planting) { create(:planting, crop:, planted_at: Time.zone.today) }
it { expect(planting.before_harvest_time?).to be true } it { expect(planting.before_harvest_time?).to be true }
it { expect(planting.harvest_time?).to be false } it { expect(planting.harvest_time?).to be false }
end end
describe 'harvesting ready now' do describe 'harvesting ready now' do
let(:planting) { FactoryBot.create(:planting, crop:, planted_at: 21.days.ago) } let(:planting) { create(:planting, crop:, planted_at: 21.days.ago) }
it { expect(planting.first_harvest_predicted_at).to eq(1.day.ago.to_date) } it { expect(planting.first_harvest_predicted_at).to eq(1.day.ago.to_date) }
it { expect(planting.before_harvest_time?).to be false } it { expect(planting.before_harvest_time?).to be false }
@@ -172,7 +172,7 @@ describe Planting do
end end
describe 'planting has no harvests' do describe 'planting has no harvests' do
let(:planting) { FactoryBot.create(:planting) } let(:planting) { create(:planting) }
before do before do
planting.update_harvest_days! planting.update_harvest_days!
@@ -184,13 +184,13 @@ describe Planting do
end end
describe 'planting has first harvest' do describe 'planting has first harvest' do
let(:planting) { FactoryBot.create(:planting, planted_at: 100.days.ago) } let(:planting) { create(:planting, planted_at: 100.days.ago) }
before do before do
FactoryBot.create(:harvest, create(:harvest,
planting:, planting:,
crop: planting.crop, crop: planting.crop,
harvested_at: 10.days.ago) harvested_at: 10.days.ago)
planting.update_harvest_days! planting.update_harvest_days!
planting.crop.update_harvest_medians planting.crop.update_harvest_medians
end end
@@ -202,11 +202,11 @@ describe Planting do
end end
describe 'planting has last harvest' do describe 'planting has last harvest' do
let(:planting) { FactoryBot.create(:planting, planted_at: 100.days.ago, finished_at: 1.day.ago, finished: true) } let(:planting) { create(:planting, planted_at: 100.days.ago, finished_at: 1.day.ago, finished: true) }
before do before do
FactoryBot.create(:harvest, planting:, crop: planting.crop, harvested_at: 90.days.ago) create(:harvest, planting:, crop: planting.crop, harvested_at: 90.days.ago)
FactoryBot.create(:harvest, planting:, crop: planting.crop, harvested_at: 10.days.ago) create(:harvest, planting:, crop: planting.crop, harvested_at: 10.days.ago)
planting.update_harvest_days! planting.update_harvest_days!
planting.crop.update_harvest_medians planting.crop.update_harvest_medians
end end
@@ -219,7 +219,7 @@ describe Planting do
end end
describe 'planting perennial' do describe 'planting perennial' do
let(:crop) { FactoryBot.create(:crop, name: 'feijoa', perennial: true) } let(:crop) { create(:crop, name: 'feijoa', perennial: true) }
it { expect(planting.perennial?).to be true } it { expect(planting.perennial?).to be true }
@@ -229,9 +229,9 @@ describe Planting do
describe 'harvests used to predict' do describe 'harvests used to predict' do
before do before do
FactoryBot.create(:harvest, planting:, crop:, harvested_at: '1 May 2019') create(:harvest, planting:, crop:, harvested_at: '1 May 2019')
FactoryBot.create(:harvest, planting:, crop:, harvested_at: '18 June 2019') create(:harvest, planting:, crop:, harvested_at: '18 June 2019')
FactoryBot.create_list(:harvest, 4, planting:, crop:, harvested_at: '18 August 2019') create_list(:harvest, 4, planting:, crop:, harvested_at: '18 August 2019')
end end
it { expect(planting.harvest_months).to eq(5 => 1, 6 => 1, 8 => 4) } it { expect(planting.harvest_months).to eq(5 => 1, 6 => 1, 8 => 4) }
@@ -239,29 +239,29 @@ describe Planting do
describe 'nearby plantings used to predict' do describe 'nearby plantings used to predict' do
# Note the locations used need to be stubbed in geocoder # Note the locations used need to be stubbed in geocoder
let(:garden) { FactoryBot.create(:garden, location: 'Edinburgh', owner: garden_owner) } let(:garden) { create(:garden, location: 'Edinburgh', owner: garden_owner) }
before do before do
# Near by planting with harvests # Near by planting with harvests
nearby_garden = FactoryBot.create(:garden, location: 'Greenwich, UK') nearby_garden = create(:garden, location: 'Greenwich, UK')
nearby_planting = FactoryBot.create(:planting, nearby_planting = create(:planting,
crop:, crop:,
garden: nearby_garden, garden: nearby_garden,
owner: nearby_garden.owner, owner: nearby_garden.owner,
planted_at: '1 January 2000') planted_at: '1 January 2000')
FactoryBot.create(:harvest, planting: nearby_planting, crop:, create(:harvest, planting: nearby_planting, crop:,
harvested_at: '1 May 2019') harvested_at: '1 May 2019')
FactoryBot.create(:harvest, planting: nearby_planting, crop:, create(:harvest, planting: nearby_planting, crop:,
harvested_at: '18 June 2019') harvested_at: '18 June 2019')
FactoryBot.create_list(:harvest, 4, planting: nearby_planting, crop:, create_list(:harvest, 4, planting: nearby_planting, crop:,
harvested_at: '18 August 2008') harvested_at: '18 August 2008')
# far away planting harvests # far away planting harvests
faraway_garden = FactoryBot.create(:garden, location: 'Amundsen-Scott Base, Antarctica') faraway_garden = create(:garden, location: 'Amundsen-Scott Base, Antarctica')
faraway_planting = FactoryBot.create(:planting, garden: faraway_garden, crop:, faraway_planting = create(:planting, garden: faraway_garden, crop:,
owner: faraway_garden.owner, planted_at: '16 May 2001') owner: faraway_garden.owner, planted_at: '16 May 2001')
FactoryBot.create_list(:harvest, 4, planting: faraway_planting, crop:, create_list(:harvest, 4, planting: faraway_planting, crop:,
harvested_at: '18 December 2006') harvested_at: '18 December 2006')
end end
@@ -282,23 +282,23 @@ describe Planting do
end end
it 'sorts in reverse creation order' do it 'sorts in reverse creation order' do
@planting2 = FactoryBot.create(:planting) @planting2 = create(:planting)
described_class.first.should eq @planting2 described_class.first.should eq @planting2
end end
describe '#planted?' do describe '#planted?' do
it "is false for future plantings" do it "is false for future plantings" do
planting = FactoryBot.create(:planting, planted_at: Time.zone.today + 1) planting = create(:planting, planted_at: Time.zone.today + 1)
expect(planting.planted?).to be(false) expect(planting.planted?).to be(false)
end end
it "is false for never planted" do it "is false for never planted" do
planting = FactoryBot.create(:planting, planted_at: nil) planting = create(:planting, planted_at: nil)
expect(planting.planted?).to be(false) expect(planting.planted?).to be(false)
end end
it "is true for past plantings" do it "is true for past plantings" do
planting = FactoryBot.create(:planting, planted_at: Time.zone.today - 1) planting = create(:planting, planted_at: Time.zone.today - 1)
expect(planting.planted?).to be(true) expect(planting.planted?).to be(true)
end end
end end
@@ -323,30 +323,30 @@ describe Planting do
context 'quantity' do context 'quantity' do
it 'allows integer quantities' do it 'allows integer quantities' do
@planting = FactoryBot.build(:planting, quantity: 99) @planting = build(:planting, quantity: 99)
@planting.should be_valid @planting.should be_valid
end end
it "doesn't allow decimal quantities" do it "doesn't allow decimal quantities" do
@planting = FactoryBot.build(:planting, quantity: 99.9) @planting = build(:planting, quantity: 99.9)
@planting.should_not be_valid @planting.should_not be_valid
end end
it "doesn't allow non-numeric quantities" do it "doesn't allow non-numeric quantities" do
@planting = FactoryBot.build(:planting, quantity: 'foo') @planting = build(:planting, quantity: 'foo')
@planting.should_not be_valid @planting.should_not be_valid
end end
it "allows blank quantities" do it "allows blank quantities" do
@planting = FactoryBot.build(:planting, quantity: nil) @planting = build(:planting, quantity: nil)
@planting.should be_valid @planting.should be_valid
@planting = FactoryBot.build(:planting, quantity: '') @planting = build(:planting, quantity: '')
@planting.should be_valid @planting.should be_valid
end end
end end
context 'sunniness' do context 'sunniness' do
let(:planting) { FactoryBot.create(:sunny_planting) } let(:planting) { create(:sunny_planting) }
it 'has a sunniness value' do it 'has a sunniness value' do
planting.sunniness.should eq 'sun' planting.sunniness.should eq 'sun'
@@ -354,13 +354,13 @@ describe Planting do
it 'all three valid sunniness values should work' do it 'all three valid sunniness values should work' do
['sun', 'shade', 'semi-shade', nil, ''].each do |s| ['sun', 'shade', 'semi-shade', nil, ''].each do |s|
@planting = FactoryBot.build(:planting, sunniness: s) @planting = build(:planting, sunniness: s)
@planting.should be_valid @planting.should be_valid
end end
end end
it 'refuses invalid sunniness values' do it 'refuses invalid sunniness values' do
@planting = FactoryBot.build(:planting, sunniness: 'not valid') @planting = build(:planting, sunniness: 'not valid')
@planting.should_not be_valid @planting.should_not be_valid
@planting.errors[:sunniness].should include("not valid is not a valid sunniness value") @planting.errors[:sunniness].should include("not valid is not a valid sunniness value")
end end
@@ -368,7 +368,7 @@ describe Planting do
context 'planted from' do context 'planted from' do
it 'has a planted_from value' do it 'has a planted_from value' do
@planting = FactoryBot.create(:seed_planting) @planting = create(:seed_planting)
@planting.planted_from.should eq 'seed' @planting.planted_from.should eq 'seed'
end end
@@ -378,13 +378,13 @@ describe Planting do
'runner', 'bare root plant', 'advanced plant', 'runner', 'bare root plant', 'advanced plant',
'graft', 'layering', 'bulb', 'root/tuber', nil, '' 'graft', 'layering', 'bulb', 'root/tuber', nil, ''
].each do |p| ].each do |p|
@planting = FactoryBot.build(:planting, planted_from: p) @planting = build(:planting, planted_from: p)
@planting.should be_valid @planting.should be_valid
end end
end end
it 'refuses invalid planted_from values' do it 'refuses invalid planted_from values' do
@planting = FactoryBot.build(:planting, planted_from: 'not valid') @planting = build(:planting, planted_from: 'not valid')
@planting.should_not be_valid @planting.should_not be_valid
@planting.errors[:planted_from].should include("not valid is not a valid planting method") @planting.errors[:planted_from].should include("not valid is not a valid planting method")
end end
@@ -393,8 +393,8 @@ describe Planting do
# we decided that all the tests for the planting/photo association would # we decided that all the tests for the planting/photo association would
# be done on this side, not on the photos side # be done on this side, not on the photos side
context 'photos' do context 'photos' do
let(:planting) { FactoryBot.create(:planting) } let(:planting) { create(:planting) }
let(:photo) { FactoryBot.create(:photo, owner_id: planting.owner_id) } let(:photo) { create(:photo, owner_id: planting.owner_id) }
before { planting.photos << photo } before { planting.photos << photo }
@@ -417,7 +417,7 @@ describe Planting do
end end
it 'chooses the most recent photo' do it 'chooses the most recent photo' do
@photo2 = FactoryBot.create(:photo, owner: planting.owner) @photo2 = create(:photo, owner: planting.owner)
planting.photos << @photo2 planting.photos << @photo2
expect(planting.default_photo).to eq @photo2 expect(planting.default_photo).to eq @photo2
end end
@@ -428,10 +428,10 @@ describe Planting do
before do before do
# plantings have members created implicitly for them # plantings have members created implicitly for them
# each member is different, hence these are all interesting # each member is different, hence these are all interesting
@planting1 = FactoryBot.create(:planting, :with_photo, planted_at: 5.days.ago) @planting1 = create(:planting, :with_photo, planted_at: 5.days.ago)
@planting2 = FactoryBot.create(:planting, :with_photo, planted_at: 4.days.ago) @planting2 = create(:planting, :with_photo, planted_at: 4.days.ago)
@planting3 = FactoryBot.create(:planting, :with_photo, planted_at: 3.days.ago) @planting3 = create(:planting, :with_photo, planted_at: 3.days.ago)
@planting4 = FactoryBot.create(:planting, :with_photo, planted_at: 2.days.ago) @planting4 = create(:planting, :with_photo, planted_at: 2.days.ago)
end end
it { expect(described_class.interesting).to eq([@planting4, @planting3, @planting2, @planting1]) } it { expect(described_class.interesting).to eq([@planting4, @planting3, @planting2, @planting1]) }
@@ -440,12 +440,12 @@ describe Planting do
context "default arguments" do context "default arguments" do
it 'ignores plantings without photos' do it 'ignores plantings without photos' do
# first, an interesting planting # first, an interesting planting
@planting = FactoryBot.create(:planting) @planting = create(:planting)
@planting.photos << FactoryBot.create(:photo, owner: @planting.owner) @planting.photos << create(:photo, owner: @planting.owner)
@planting.save @planting.save
# this one doesn't have a photo # this one doesn't have a photo
@no_photo_planting = FactoryBot.create(:planting) @no_photo_planting = create(:planting)
expect(described_class.interesting).to include @planting expect(described_class.interesting).to include @planting
expect(described_class.interesting).not_to include @no_photo_planting expect(described_class.interesting).not_to include @no_photo_planting
@@ -453,16 +453,16 @@ describe Planting do
it 'ignores plantings with the same owner' do it 'ignores plantings with the same owner' do
# this planting is older # this planting is older
@planting1 = FactoryBot.create(:planting, created_at: 1.day.ago) @planting1 = create(:planting, created_at: 1.day.ago)
@planting1.photos << FactoryBot.create(:photo, owner_id: @planting1.owner_id) @planting1.photos << create(:photo, owner_id: @planting1.owner_id)
@planting1.save @planting1.save
# this one is newer, and has the same owner, through the garden # this one is newer, and has the same owner, through the garden
@planting2 = FactoryBot.create(:planting, @planting2 = create(:planting,
created_at: 1.minute.ago, created_at: 1.minute.ago,
garden: @planting1.garden, garden: @planting1.garden,
owner: @planting1.owner) owner: @planting1.owner)
@planting2.photos << FactoryBot.create(:photo, owner: @planting2.owner) @planting2.photos << create(:photo, owner: @planting2.owner)
@planting2.save @planting2.save
# result: the newer one is interesting, the older one isn't # result: the newer one is interesting, the older one isn't
@@ -473,9 +473,9 @@ describe Planting do
context "with howmany argument" do context "with howmany argument" do
it "only returns the number asked for" do it "only returns the number asked for" do
@plantings = FactoryBot.create_list(:planting, 10) @plantings = create_list(:planting, 10)
@plantings.each do |p| @plantings.each do |p|
p.photos << FactoryBot.create(:photo, owner: p.owner) p.photos << create(:photo, owner: p.owner)
end end
expect(described_class.interesting.limit(3).count).to eq 3 expect(described_class.interesting.limit(3).count).to eq 3
end end
@@ -484,71 +484,71 @@ describe Planting do
context "finished" do context "finished" do
it 'has finished fields' do it 'has finished fields' do
@planting = FactoryBot.create(:finished_planting) @planting = create(:finished_planting)
@planting.finished.should be true @planting.finished.should be true
@planting.finished_at.should be_an_instance_of Date @planting.finished_at.should be_an_instance_of Date
end end
it 'has finished scope' do it 'has finished scope' do
@p = FactoryBot.create(:planting) @p = create(:planting)
@f = FactoryBot.create(:finished_planting) @f = create(:finished_planting)
described_class.finished.should include @f described_class.finished.should include @f
described_class.finished.should_not include @p described_class.finished.should_not include @p
end end
it 'has current scope' do it 'has current scope' do
@p = FactoryBot.create(:planting) @p = create(:planting)
@f = FactoryBot.create(:finished_planting) @f = create(:finished_planting)
described_class.current.should include @p described_class.current.should include @p
described_class.current.should_not include @f described_class.current.should_not include @f
end end
context "finished date validation" do context "finished date validation" do
it 'requires finished date after planting date' do it 'requires finished date after planting date' do
@f = FactoryBot.build(:finished_planting, planted_at: '2014-01-01', finished_at: '2013-01-01') @f = build(:finished_planting, planted_at: '2014-01-01', finished_at: '2013-01-01')
@f.should_not be_valid @f.should_not be_valid
end end
it 'allows just the planted date' do it 'allows just the planted date' do
@f = FactoryBot.build(:planting, planted_at: '2013-01-01', finished_at: nil) @f = build(:planting, planted_at: '2013-01-01', finished_at: nil)
@f.should be_valid @f.should be_valid
end end
it 'allows just the finished date' do it 'allows just the finished date' do
@f = FactoryBot.build(:planting, finished_at: '2013-01-01', planted_at: nil) @f = build(:planting, finished_at: '2013-01-01', planted_at: nil)
@f.should be_valid @f.should be_valid
end end
end end
end end
context "failed" do context "failed" do
let(:failed_planting) { FactoryBot.create(:planting, failed: true) } let(:failed_planting) { create(:planting, failed: true) }
it 'has a failed field' do it 'has a failed field' do
expect(failed_planting.failed).to be true expect(failed_planting.failed).to be true
end end
it 'has a failed scope' do it 'has a failed scope' do
@p = FactoryBot.create(:planting) @p = create(:planting)
@f = FactoryBot.create(:planting, failed: true) @f = create(:planting, failed: true)
described_class.failed.should include @f described_class.failed.should include @f
described_class.failed.should_not include @p described_class.failed.should_not include @p
end end
it 'is not included in the active scope' do it 'is not included in the active scope' do
@p = FactoryBot.create(:planting) @p = create(:planting)
@f = FactoryBot.create(:planting, failed: true) @f = create(:planting, failed: true)
described_class.active.should include @p described_class.active.should include @p
described_class.active.should_not include @f described_class.active.should_not include @f
end end
it 'cannot be finished and failed' do it 'cannot be finished and failed' do
@f = FactoryBot.build(:planting, finished: true, failed: true) @f = build(:planting, finished: true, failed: true)
@f.should_not be_valid @f.should_not be_valid
end end
it 'is not finished' do it 'is not finished' do
@f = FactoryBot.build(:planting, finished: true, failed: true) @f = build(:planting, finished: true, failed: true)
expect(@f.finished?).to be false expect(@f.finished?).to be false
end end
end end
@@ -560,8 +560,8 @@ describe Planting do
end end
context 'ancestry' do context 'ancestry' do
let(:parent_seed) { FactoryBot.create(:seed) } let(:parent_seed) { create(:seed) }
let(:planting) { FactoryBot.create(:planting, parent_seed:) } let(:planting) { create(:planting, parent_seed:) }
it "planting has a parent seed" do it "planting has a parent seed" do
expect(planting.parent_seed).to eq(parent_seed) expect(planting.parent_seed).to eq(parent_seed)
@@ -572,7 +572,7 @@ describe Planting do
end end
describe 'grandchildren' do describe 'grandchildren' do
let(:grandchild_seed) { FactoryBot.create(:seed, parent_planting: planting) } let(:grandchild_seed) { create(:seed, parent_planting: planting) }
it { expect(grandchild_seed.parent_planting).to eq planting } it { expect(grandchild_seed.parent_planting).to eq planting }
it { expect(grandchild_seed.parent_planting.parent_seed).to eq parent_seed } it { expect(grandchild_seed.parent_planting.parent_seed).to eq parent_seed }
@@ -580,15 +580,15 @@ describe Planting do
end end
describe 'active scope' do describe 'active scope' do
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
let!(:planting) do let!(:planting) do
FactoryBot.create(:planting, owner: member, garden: member.gardens.first) create(:planting, owner: member, garden: member.gardens.first)
end end
let!(:finished_planting) do let!(:finished_planting) do
FactoryBot.create(:finished_planting, owner: member, garden: member.gardens.first) create(:finished_planting, owner: member, garden: member.gardens.first)
end end
let!(:failed_planting) do let!(:failed_planting) do
FactoryBot.create(:planting, failed: true, owner: member, garden: member.gardens.first) create(:planting, failed: true, owner: member, garden: member.gardens.first)
end end
it { expect(member.plantings.active).to include(planting) } it { expect(member.plantings.active).to include(planting) }
@@ -599,9 +599,9 @@ describe Planting do
describe 'homepage', :search do describe 'homepage', :search do
subject { described_class.homepage_records(100) } subject { described_class.homepage_records(100) }
let!(:interesting_planting) { FactoryBot.create(:planting, :reindex, :with_photo) } let!(:interesting_planting) { create(:planting, :reindex, :with_photo) }
let!(:finished_interesting_planting) { FactoryBot.create(:finished_planting, :reindex, :with_photo) } let!(:finished_interesting_planting) { create(:finished_planting, :reindex, :with_photo) }
let!(:planting) { FactoryBot.create(:planting, :reindex) } let!(:planting) { create(:planting, :reindex) }
before { described_class.reindex } before { described_class.reindex }

View File

@@ -3,12 +3,12 @@
require 'rails_helper' require 'rails_helper'
describe Post do describe Post do
let(:member) { FactoryBot.create(:member, login_name: 'whinacooper') } let(:member) { create(:member, login_name: 'whinacooper') }
it_behaves_like "it is likeable" it_behaves_like "it is likeable"
it "has a slug" do it "has a slug" do
post = FactoryBot.create(:post, author: member, subject: 'A Post') post = create(:post, author: member, subject: 'A Post')
time = post.created_at time = post.created_at
datestr = time.strftime("%Y%m%d") datestr = time.strftime("%Y%m%d")
# 2 digit day and month, full-length years # 2 digit day and month, full-length years
@@ -18,23 +18,23 @@ describe Post do
end end
it "has many comments" do it "has many comments" do
post = FactoryBot.create(:post, author: member) post = create(:post, author: member)
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
post.comments.size.should == 2 post.comments.size.should == 2
end end
it "supports counting comments" do it "supports counting comments" do
post = FactoryBot.create(:post, author: member) post = create(:post, author: member)
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
post.comment_count.should == 2 post.comment_count.should == 2
end end
it "destroys comments when deleted" do it "destroys comments when deleted" do
post = FactoryBot.create(:post, author: member) post = create(:post, author: member)
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
FactoryBot.create(:comment, commentable: post) create(:comment, commentable: post)
post.comments.size.should eq(2) post.comments.size.should eq(2)
all = Comment.count all = Comment.count
post.destroy post.destroy
@@ -42,22 +42,22 @@ describe Post do
end end
it "belongs to a forum" do it "belongs to a forum" do
post = FactoryBot.create(:forum_post) post = create(:forum_post)
post.forum.should be_an_instance_of Forum post.forum.should be_an_instance_of Forum
end end
it "doesn't allow a nil subject" do it "doesn't allow a nil subject" do
post = FactoryBot.build(:post, subject: nil) post = build(:post, subject: nil)
post.should_not be_valid post.should_not be_valid
end end
it "doesn't allow a blank subject" do it "doesn't allow a blank subject" do
post = FactoryBot.build(:post, subject: "") post = build(:post, subject: "")
post.should_not be_valid post.should_not be_valid
end end
it "doesn't allow a subject with only spaces" do it "doesn't allow a subject with only spaces" do
post = FactoryBot.build(:post, subject: " ") post = build(:post, subject: " ")
post.should_not be_valid post.should_not be_valid
end end
@@ -66,51 +66,51 @@ describe Post do
Time.stub(now: Time.zone.now) Time.stub(now: Time.zone.now)
end end
let!(:post) { FactoryBot.create(:post, created_at: 1.day.ago) } let!(:post) { create(:post, created_at: 1.day.ago) }
it "sets recent activity to post time" do it "sets recent activity to post time" do
post.recent_activity.to_i.should eq post.created_at.to_i post.recent_activity.to_i.should eq post.created_at.to_i
end end
it "sets recent activity to comment time" do it "sets recent activity to comment time" do
comment = FactoryBot.create(:comment, commentable: post, comment = create(:comment, commentable: post,
created_at: 1.hour.ago) created_at: 1.hour.ago)
post.recent_activity.to_i.should eq comment.created_at.to_i post.recent_activity.to_i.should eq comment.created_at.to_i
end end
it "shiny new post is recently active" do it "shiny new post is recently active" do
# create a shiny new post # create a shiny new post
post2 = FactoryBot.create(:post, created_at: 1.minute.ago) post2 = create(:post, created_at: 1.minute.ago)
described_class.recently_active.first.should eq post2 described_class.recently_active.first.should eq post2
described_class.recently_active.second.should eq post described_class.recently_active.second.should eq post
end end
it "new comment on old post is recently active" do it "new comment on old post is recently active" do
# now comment on an older post # now comment on an older post
post2 = FactoryBot.create(:post, created_at: 1.minute.ago) post2 = create(:post, created_at: 1.minute.ago)
FactoryBot.create(:comment, commentable: post, created_at: 1.second.ago) create(:comment, commentable: post, created_at: 1.second.ago)
described_class.recently_active.first.should eq post described_class.recently_active.first.should eq post
described_class.recently_active.second.should eq post2 described_class.recently_active.second.should eq post2
end end
end end
context "notifications" do context "notifications" do
let(:member2) { FactoryBot.create(:member) } let(:member2) { create(:member) }
it "sends a notification when a member is mentioned using @-syntax" do it "sends a notification when a member is mentioned using @-syntax" do
expect do expect do
FactoryBot.create(:post, author: member, body: "Hey @#{member2}") create(:post, author: member, body: "Hey @#{member2}")
end.to change(Notification, :count).by(1) end.to change(Notification, :count).by(1)
end end
it "sends a notification when a member is mentioned using [](member) syntax" do it "sends a notification when a member is mentioned using [](member) syntax" do
expect do expect do
FactoryBot.create(:post, author: member, body: "Hey [#{member2}](member)") create(:post, author: member, body: "Hey [#{member2}](member)")
end.to change(Notification, :count).by(1) end.to change(Notification, :count).by(1)
end end
it "sets the notification field" do it "sets the notification field" do
p = FactoryBot.create(:post, author: member, body: "Hey @#{member2}") p = create(:post, author: member, body: "Hey @#{member2}")
n = Notification.first n = Notification.first
n.sender.should eq member n.sender.should eq member
n.recipient.should eq member2 n.recipient.should eq member2
@@ -119,24 +119,24 @@ describe Post do
end end
it "sends notifications to all members mentioned" do it "sends notifications to all members mentioned" do
member3 = FactoryBot.create(:member) member3 = create(:member)
expect do expect do
FactoryBot.create(:post, author: member, body: "Hey @#{member2} & @#{member3}") create(:post, author: member, body: "Hey @#{member2} & @#{member3}")
end.to change(Notification, :count).by(2) end.to change(Notification, :count).by(2)
end end
it "doesn't send notifications if you mention yourself" do it "doesn't send notifications if you mention yourself" do
expect do expect do
FactoryBot.create(:post, author: member, body: "@#{member}") create(:post, author: member, body: "@#{member}")
end.not_to change(Notification, :count) end.not_to change(Notification, :count)
end end
end end
context "crop-post association" do context "crop-post association" do
let!(:tomato) { FactoryBot.create(:tomato) } let!(:tomato) { create(:tomato) }
let!(:maize) { FactoryBot.create(:maize) } let!(:maize) { create(:maize) }
let!(:chard) { FactoryBot.create(:chard) } let!(:chard) { create(:chard) }
let!(:post) { FactoryBot.create(:post, body: "[maize](crop)[tomato](crop)[tomato](crop)") } let!(:post) { create(:post, body: "[maize](crop)[tomato](crop)[tomato](crop)") }
it "is generated" do it "is generated" do
expect(tomato.posts).to eq [post] expect(tomato.posts).to eq [post]
@@ -174,7 +174,7 @@ describe Post do
end end
it 'excludes deleted members' do it 'excludes deleted members' do
post = FactoryBot.create(:post, author: member) post = create(:post, author: member)
expect(described_class.joins(:author).all).to include(post) expect(described_class.joins(:author).all).to include(post)
member.destroy member.destroy
expect(described_class.joins(:author).all).not_to include(post) expect(described_class.joins(:author).all).not_to include(post)

View File

@@ -4,12 +4,12 @@ require 'rails_helper'
describe Role do describe Role do
subject do subject do
role = FactoryBot.create(:role, name: 'Crop Wrangler') role = create(:role, name: 'Crop Wrangler')
role.members << member role.members << member
role role
end end
let(:member) { FactoryBot.create(:member) } let(:member) { create(:member) }
it 'has members' do it 'has members' do
subject.members.first.should eq member subject.members.first.should eq member
@@ -20,7 +20,7 @@ describe Role do
end end
describe '.crop_wranglers' do describe '.crop_wranglers' do
let!(:crop_wranglers) { FactoryBot.create_list(:crop_wrangling_member, 3) } let!(:crop_wranglers) { create_list(:crop_wrangling_member, 3) }
it 'return the crop wranglers that are members of that role' do it 'return the crop wranglers that are members of that role' do
expect(described_class.crop_wranglers).to match_array(crop_wranglers) expect(described_class.crop_wranglers).to match_array(crop_wranglers)
@@ -28,7 +28,7 @@ describe Role do
end end
describe '.admins' do describe '.admins' do
let!(:admins) { FactoryBot.create_list(:admin_member, 3) } let!(:admins) { create_list(:admin_member, 3) }
it 'return the members that have the role of admin' do it 'return the members that have the role of admin' do
expect(described_class.admins).to match_array(admins) expect(described_class.admins).to match_array(admins)

View File

@@ -4,7 +4,7 @@ require 'rails_helper'
describe ScientificName do describe ScientificName do
context 'all fields present' do context 'all fields present' do
let(:sn) { FactoryBot.create(:zea_mays) } let(:sn) { create(:zea_mays) }
it 'saves a basic scientific name' do it 'saves a basic scientific name' do
sn.save.should be(true) sn.save.should be(true)

View File

@@ -3,8 +3,8 @@
require 'rails_helper' require 'rails_helper'
describe Seed do describe Seed do
let(:owner) { FactoryBot.create(:owner, login_name: 'tamateapokaiwhenua') } let(:owner) { create(:owner, login_name: 'tamateapokaiwhenua') }
let(:seed) { FactoryBot.build(:seed, owner:) } let(:seed) { build(:seed, owner:) }
it 'saves a basic seed' do it 'saves a basic seed' do
seed.save.should be(true) seed.save.should be(true)
@@ -17,24 +17,24 @@ describe Seed do
context 'quantity' do context 'quantity' do
it 'allows integer quantities' do it 'allows integer quantities' do
@seed = FactoryBot.build(:seed, quantity: 99) @seed = build(:seed, quantity: 99)
@seed.should be_valid @seed.should be_valid
end end
it "doesn't allow decimal quantities" do it "doesn't allow decimal quantities" do
@seed = FactoryBot.build(:seed, quantity: 99.9) @seed = build(:seed, quantity: 99.9)
@seed.should_not be_valid @seed.should_not be_valid
end end
it "doesn't allow non-numeric quantities" do it "doesn't allow non-numeric quantities" do
@seed = FactoryBot.build(:seed, quantity: 'foo') @seed = build(:seed, quantity: 'foo')
@seed.should_not be_valid @seed.should_not be_valid
end end
it "allows blank quantities" do it "allows blank quantities" do
@seed = FactoryBot.build(:seed, quantity: nil) @seed = build(:seed, quantity: nil)
@seed.should be_valid @seed.should be_valid
@seed = FactoryBot.build(:seed, quantity: '') @seed = build(:seed, quantity: '')
@seed.should be_valid @seed.should be_valid
end end
end end
@@ -42,13 +42,13 @@ describe Seed do
context 'tradable' do context 'tradable' do
it 'all valid tradable_to values should work' do it 'all valid tradable_to values should work' do
%w(nowhere locally nationally internationally).each do |t| %w(nowhere locally nationally internationally).each do |t|
@seed = FactoryBot.build(:seed, tradable_to: t) @seed = build(:seed, tradable_to: t)
@seed.should be_valid @seed.should be_valid
end end
end end
it 'refuses invalid tradable_to values' do it 'refuses invalid tradable_to values' do
@seed = FactoryBot.build(:seed, tradable_to: 'not valid') @seed = build(:seed, tradable_to: 'not valid')
@seed.should_not be_valid @seed.should_not be_valid
@seed.errors[:tradable_to].should include( @seed.errors[:tradable_to].should include(
"You may only trade seed nowhere, locally, " \ "You may only trade seed nowhere, locally, " \
@@ -57,34 +57,34 @@ describe Seed do
end end
it 'does not allow nil or blank values' do it 'does not allow nil or blank values' do
@seed = FactoryBot.build(:seed, tradable_to: nil) @seed = build(:seed, tradable_to: nil)
@seed.should_not be_valid @seed.should_not be_valid
@seed = FactoryBot.build(:seed, tradable_to: '') @seed = build(:seed, tradable_to: '')
@seed.should_not be_valid @seed.should_not be_valid
end end
it 'tradable gives the right answers' do it 'tradable gives the right answers' do
@seed = FactoryBot.create(:seed, tradable_to: 'nowhere') @seed = create(:seed, tradable_to: 'nowhere')
@seed.tradable.should be false @seed.tradable.should be false
@seed = FactoryBot.create(:seed, tradable_to: 'locally') @seed = create(:seed, tradable_to: 'locally')
@seed.tradable.should be true @seed.tradable.should be true
@seed = FactoryBot.create(:seed, tradable_to: 'nationally') @seed = create(:seed, tradable_to: 'nationally')
@seed.tradable.should be true @seed.tradable.should be true
@seed = FactoryBot.create(:seed, tradable_to: 'internationally') @seed = create(:seed, tradable_to: 'internationally')
@seed.tradable.should be true @seed.tradable.should be true
end end
it 'recognises a tradable seed' do it 'recognises a tradable seed' do
FactoryBot.create(:tradable_seed).tradable.should == true create(:tradable_seed).tradable.should == true
end end
it 'recognises an untradable seed' do it 'recognises an untradable seed' do
FactoryBot.create(:untradable_seed).tradable.should == false create(:untradable_seed).tradable.should == false
end end
it 'scopes correctly' do it 'scopes correctly' do
@tradable = FactoryBot.create(:tradable_seed) @tradable = create(:tradable_seed)
@untradable = FactoryBot.create(:untradable_seed) @untradable = create(:untradable_seed)
described_class.tradable.should include @tradable described_class.tradable.should include @tradable
described_class.tradable.should_not include @untradable described_class.tradable.should_not include @untradable
end end
@@ -94,7 +94,7 @@ describe Seed do
it 'all valid organic values should work' do it 'all valid organic values should work' do
['certified organic', 'non-certified organic', ['certified organic', 'non-certified organic',
'conventional/non-organic', 'unknown'].each do |t| 'conventional/non-organic', 'unknown'].each do |t|
@seed = FactoryBot.build(:seed, organic: t) @seed = build(:seed, organic: t)
@seed.should be_valid @seed.should be_valid
end end
end end
@@ -102,21 +102,21 @@ describe Seed do
it 'all valid GMO values should work' do it 'all valid GMO values should work' do
['certified GMO-free', 'non-certified GMO-free', ['certified GMO-free', 'non-certified GMO-free',
'GMO', 'unknown'].each do |t| 'GMO', 'unknown'].each do |t|
@seed = FactoryBot.build(:seed, gmo: t) @seed = build(:seed, gmo: t)
@seed.should be_valid @seed.should be_valid
end end
end end
it 'all valid heirloom values should work' do it 'all valid heirloom values should work' do
%w(heirloom hybrid unknown).each do |t| %w(heirloom hybrid unknown).each do |t|
@seed = FactoryBot.build(:seed, heirloom: t) @seed = build(:seed, heirloom: t)
@seed.should be_valid @seed.should be_valid
end end
end end
it 'refuses invalid organic/GMO/heirloom values' do it 'refuses invalid organic/GMO/heirloom values' do
%i(organic gmo heirloom).each do |field| %i(organic gmo heirloom).each do |field|
@seed = FactoryBot.build(:seed, field => 'not valid') @seed = build(:seed, field => 'not valid')
@seed.should_not be_valid @seed.should_not be_valid
@seed.errors[field].should_not be_empty @seed.errors[field].should_not be_empty
end end
@@ -124,9 +124,9 @@ describe Seed do
it 'does not allow nil or blank values' do it 'does not allow nil or blank values' do
%i(organic gmo heirloom).each do |field| %i(organic gmo heirloom).each do |field|
@seed = FactoryBot.build(:seed, field => nil) @seed = build(:seed, field => nil)
@seed.should_not be_valid @seed.should_not be_valid
@seed = FactoryBot.build(:seed, field => '') @seed = build(:seed, field => '')
@seed.should_not be_valid @seed.should_not be_valid
end end
end end
@@ -134,14 +134,14 @@ describe Seed do
context 'expired' do context 'expired' do
it 'returns seeds with a plant_before date in the past' do it 'returns seeds with a plant_before date in the past' do
expired_seed = FactoryBot.create(:seed, plant_before: 1.day.ago) expired_seed = create(:seed, plant_before: 1.day.ago)
not_expired_seed = FactoryBot.create(:seed, plant_before: 1.day.from_now) not_expired_seed = create(:seed, plant_before: 1.day.from_now)
described_class.expired.should include expired_seed described_class.expired.should include expired_seed
described_class.expired.should_not include not_expired_seed described_class.expired.should_not include not_expired_seed
end end
it 'does not return finished seeds' do it 'does not return finished seeds' do
expired_seed = FactoryBot.create(:seed, plant_before: 1.day.ago, finished: true) expired_seed = create(:seed, plant_before: 1.day.ago, finished: true)
described_class.expired.should_not include expired_seed described_class.expired.should_not include expired_seed
end end
end end
@@ -152,11 +152,11 @@ describe Seed do
# 1) be tradable # 1) be tradable
# 2) the owner must have a location set # 2) the owner must have a location set
@located_member = FactoryBot.create(:london_member) @located_member = create(:london_member)
@seed1 = FactoryBot.create(:tradable_seed, owner: @located_member) @seed1 = create(:tradable_seed, owner: @located_member)
@seed2 = FactoryBot.create(:seed, owner: @located_member) @seed2 = create(:seed, owner: @located_member)
@seed3 = FactoryBot.create(:tradable_seed) @seed3 = create(:tradable_seed)
@seed4 = FactoryBot.create(:seed) @seed4 = create(:seed)
described_class.interesting.should include @seed1 described_class.interesting.should include @seed1
described_class.interesting.should_not include @seed2 described_class.interesting.should_not include @seed2
@@ -167,9 +167,9 @@ describe Seed do
end end
context 'photos' do context 'photos' do
let(:seed) { FactoryBot.create(:seed) } let(:seed) { create(:seed) }
before { seed.photos << FactoryBot.create(:photo, owner: seed.owner) } before { seed.photos << create(:photo, owner: seed.owner) }
it 'is found in has_photos scope' do it 'is found in has_photos scope' do
described_class.has_photos.should include(seed) described_class.has_photos.should include(seed)
@@ -177,8 +177,8 @@ describe Seed do
end end
context 'ancestry' do context 'ancestry' do
let(:parent_planting) { FactoryBot.create(:planting) } let(:parent_planting) { create(:planting) }
let(:seed) { FactoryBot.create(:seed, parent_planting:, owner: parent_planting.owner) } let(:seed) { create(:seed, parent_planting:, owner: parent_planting.owner) }
it "seed has a parent planting" do it "seed has a parent planting" do
expect(seed.parent_planting).to eq(parent_planting) expect(seed.parent_planting).to eq(parent_planting)
@@ -191,15 +191,15 @@ describe Seed do
context "finished" do context "finished" do
describe 'has finished fields' do describe 'has finished fields' do
let(:seed) { FactoryBot.create(:finished_seed) } let(:seed) { create(:finished_seed) }
it { expect(seed.finished).to be true } it { expect(seed.finished).to be true }
it { expect(seed.finished_at).to be_an_instance_of Date } it { expect(seed.finished_at).to be_an_instance_of Date }
end end
describe 'scopes' do describe 'scopes' do
let!(:seed) { FactoryBot.create(:seed) } let!(:seed) { create(:seed) }
let!(:finished_seed) { FactoryBot.create(:finished_seed) } let!(:finished_seed) { create(:finished_seed) }
describe 'has finished scope' do describe 'has finished scope' do
it { expect(described_class.finished).to include finished_seed } it { expect(described_class.finished).to include finished_seed }
@@ -216,9 +216,9 @@ describe Seed do
describe 'homepage', :search do describe 'homepage', :search do
subject { described_class.homepage_records(100) } subject { described_class.homepage_records(100) }
let!(:tradable_seed) { FactoryBot.create(:tradable_seed, :reindex, finished: false) } let!(:tradable_seed) { create(:tradable_seed, :reindex, finished: false) }
let!(:finished_seed) { FactoryBot.create(:tradable_seed, :reindex, finished: true) } let!(:finished_seed) { create(:tradable_seed, :reindex, finished: true) }
let!(:untradable_seed) { FactoryBot.create(:untradable_seed, :reindex) } let!(:untradable_seed) { create(:untradable_seed, :reindex) }
before { described_class.reindex } before { described_class.reindex }

View File

@@ -12,8 +12,8 @@ RSpec.describe 'Activities', type: :request do
end end
let(:headers) { { 'Accept' => 'application/vnd.api+json', 'Content-Type' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json', 'Content-Type' => 'application/vnd.api+json' } }
let(:auth_headers) { headers.merge('Authorization' => "Bearer #{token}") } let(:auth_headers) { headers.merge('Authorization' => "Bearer #{token}") }
let!(:activity) { FactoryBot.create(:activity, owner: member, garden: create(:garden, owner: member), planting: create(:planting, owner: member)) } let!(:activity) { create(:activity, owner: member, garden: create(:garden, owner: member), planting: create(:planting, owner: member)) }
let!(:activity2) { FactoryBot.create(:activity) } let!(:activity2) { create(:activity) }
it '#index' do it '#index' do
get('/api/v1/activities', params: {}, headers:) get('/api/v1/activities', params: {}, headers:)

View File

@@ -6,7 +6,7 @@ RSpec.describe 'Crops', type: :request do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let(:headers) { { 'Accept' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json' } }
let!(:crop) { FactoryBot.create(:crop) } let!(:crop) { create(:crop) }
let(:crop_encoded_as_json_api) do let(:crop_encoded_as_json_api) do
{ "id" => crop.id.to_s, { "id" => crop.id.to_s,
"type" => "crops", "type" => "crops",

View File

@@ -6,7 +6,7 @@ RSpec.describe 'Gardens', type: :request do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let(:headers) { { 'Accept' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json' } }
let!(:garden) { FactoryBot.create(:garden) } let!(:garden) { create(:garden) }
let(:garden_encoded_as_json_api) do let(:garden_encoded_as_json_api) do
{ "id" => garden.id.to_s, { "id" => garden.id.to_s,
"type" => "gardens", "type" => "gardens",
@@ -51,7 +51,7 @@ RSpec.describe 'Gardens', type: :request do
end end
context 'filtering' do context 'filtering' do
let!(:garden2) { FactoryBot.create(:garden, active: false, garden_type: FactoryBot.create(:garden_type)) } let!(:garden2) { create(:garden, active: false, garden_type: create(:garden_type)) }
pending 'filters by active' do pending 'filters by active' do
get('/api/v1/gardens?filter[active]=true', params: {}, headers:) get('/api/v1/gardens?filter[active]=true', params: {}, headers:)

View File

@@ -6,7 +6,7 @@ RSpec.describe 'Harvests', type: :request do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let(:headers) { { 'Accept' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json' } }
let!(:harvest) { FactoryBot.create(:harvest) } let!(:harvest) { create(:harvest) }
let(:harvest_encoded_as_json_api) do let(:harvest_encoded_as_json_api) do
{ "id" => harvest.id.to_s, { "id" => harvest.id.to_s,
"type" => "harvests", "type" => "harvests",
@@ -77,7 +77,7 @@ RSpec.describe 'Harvests', type: :request do
end end
context 'filtering' do context 'filtering' do
let!(:harvest2) { FactoryBot.create(:harvest, planting: create(:planting)) } let!(:harvest2) { create(:harvest, planting: create(:planting)) }
it 'filters by crop' do it 'filters by crop' do
get("/api/v1/harvests?filter[crop_id]=#{harvest2.crop.id}", params: {}, headers:) get("/api/v1/harvests?filter[crop_id]=#{harvest2.crop.id}", params: {}, headers:)

View File

@@ -6,7 +6,7 @@ RSpec.describe 'Members', type: :request do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let(:headers) { { 'Accept' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json' } }
let!(:member) { FactoryBot.create(:member) } let!(:member) { create(:member) }
let(:member_encoded_as_json_api) do let(:member_encoded_as_json_api) do
{ "id" => member.id.to_s, { "id" => member.id.to_s,
"type" => "members", "type" => "members",

View File

@@ -6,7 +6,7 @@ RSpec.describe 'Photos', type: :request do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let(:headers) { { 'Accept' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json' } }
let!(:photo) { FactoryBot.create(:photo) } let!(:photo) { create(:photo) }
let(:photo_encoded_as_json_api) do let(:photo_encoded_as_json_api) do
{ "id" => photo.id.to_s, { "id" => photo.id.to_s,
"type" => "photos", "type" => "photos",

View File

@@ -6,7 +6,7 @@ RSpec.describe 'Plantings', type: :request do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let(:headers) { { 'Accept' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json' } }
let!(:planting) { FactoryBot.create(:planting) } let!(:planting) { create(:planting) }
let(:planting_encoded_as_json_api) do let(:planting_encoded_as_json_api) do
{ "id" => planting.id.to_s, { "id" => planting.id.to_s,
"type" => "plantings", "type" => "plantings",
@@ -237,8 +237,8 @@ RSpec.describe 'Plantings', type: :request do
end end
context 'filtering' do context 'filtering' do
let!(:planting2) { FactoryBot.create(:planting, failed: true, sunniness: 'shade') } let!(:planting2) { create(:planting, failed: true, sunniness: 'shade') }
let!(:perennial_planting) { FactoryBot.create(:planting, crop: FactoryBot.create(:crop, perennial: true)) } let!(:perennial_planting) { create(:planting, crop: create(:crop, perennial: true)) }
it 'filters by failed' do it 'filters by failed' do
get('/api/v1/plantings?filter[failed]=true', params: {}, headers:) get('/api/v1/plantings?filter[failed]=true', params: {}, headers:)

View File

@@ -6,7 +6,7 @@ RSpec.describe 'Seeds', type: :request do
subject { JSON.parse response.body } subject { JSON.parse response.body }
let(:headers) { { 'Accept' => 'application/vnd.api+json' } } let(:headers) { { 'Accept' => 'application/vnd.api+json' } }
let!(:seed) { FactoryBot.create(:seed) } let!(:seed) { create(:seed) }
let(:seed_encoded_as_json_api) do let(:seed_encoded_as_json_api) do
{ "id" => seed.id.to_s, { "id" => seed.id.to_s,
"type" => "seeds", "type" => "seeds",
@@ -176,7 +176,7 @@ RSpec.describe 'Seeds', type: :request do
context 'filtering' do context 'filtering' do
let!(:seed2) do let!(:seed2) do
FactoryBot.create(:seed, tradable_to: 'nationally', organic: 'certified organic', gmo: 'certified GMO-free', heirloom: 'heirloom') create(:seed, tradable_to: 'nationally', organic: 'certified organic', gmo: 'certified GMO-free', heirloom: 'heirloom')
end end
it 'filters by crop' do it 'filters by crop' do

View File

@@ -1,8 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
describe "Authentications" do
describe "GET /authentications" do
end
end

Some files were not shown because too many files have changed in this diff Show More