Files
growstuff/spec/controllers/harvests_controller_spec.rb
Daniel O'Connor c32fae3cbe release88 (#4688)
* Bump actions/cache from 5 to 6

Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump axe-core-rspec from 4.11.3 to 4.12.0

Bumps [axe-core-rspec](https://github.com/dequelabs/axe-core-gems) from 4.11.3 to 4.12.0.
- [Release notes](https://github.com/dequelabs/axe-core-gems/releases)
- [Changelog](https://github.com/dequelabs/axe-core-gems/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/dequelabs/axe-core-gems/compare/v4.11.3...v4.12.0)

---
updated-dependencies:
- dependency-name: axe-core-rspec
  dependency-version: 4.12.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Merge pull request #4683 from Growstuff/refactor-harvests-remove-elasticsearch-14630838429921835504

Refactor harvests to remove Elasticsearch

* Refactor Seeds to remove Elasticsearch dependency (#4684)

* Refactor Seeds to remove Elasticsearch dependency

This commit refactors the `SeedsController` and `Seed` model to remove
dependency on Elasticsearch and Searchkick.

Key changes:
- Removed `SearchSeeds` concern from the `Seed` model.
- Reimplemented `Seed.homepage_records` using ActiveRecord.
- Refactored `SeedsController#index` to use ActiveRecord for filtering,
  eager loading, and pagination.
- Deleted `app/models/concerns/search_seeds.rb`.
- Updated relevant specs to remove Searchkick-specific tags and setup.

Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>

* Remove Seed.reindex

* Remove trait

* Fix tests

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* Refactor Plantings to remove Elasticsearch dependency (#4686)

* Refactor Plantings to remove Elasticsearch dependency

This commit refactors the Plantings controller, model, and views to use
ActiveRecord instead of Searchkick/Elasticsearch.

Key changes:
- Refactored `PlantingsController#index` to use an ActiveRecord-based
  `plantings` method.
- Moved `homepage_records` logic from `SearchPlantings` concern to the
  `Planting` model using ActiveRecord scopes.
- Removed `SearchPlantings` concern and deleted the file.
- Updated `home/_plantings.html.haml` and `plantings/index.rss.haml` to
  use dot notation for `Planting` object attributes.
- Updated specs to remove Searchkick-related setup and assertions.

Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>

* Fix Planting.reindex

* Fix test

* Mark test pending

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* Fix plantings ICS feed regression and enable request spec (#4687)

* Fix plantings ICS feed regression and enable request spec

- Update `app/views/plantings/index.ics.erb` to use ActiveRecord method calls instead of hash bracket access.
- Enable `spec/requests/plantings_spec.rb` and update it to account for mirrored harvest events.
- Add `config/initializers/faraday_patch.rb` to fix Searchkick/Faraday 2.x compatibility issues.

Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>

* Delete config/initializers/faraday_patch.rb

* Apply suggestion from @CloCkWeRX

* Apply suggestions from code review

Co-authored-by: Daniel O'Connor <daniel.oconnor@gmail.com>

* Apply suggestion from @CloCkWeRX

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* Block Semrush crawler in Rack Attack initializer

Added a blocklist entry for the Semrush crawler to prevent abusive requests.

* Bump sitemap_generator from 6.3.0 to 7.0.2

Bumps [sitemap_generator](https://github.com/kjvarga/sitemap_generator) from 6.3.0 to 7.0.2.
- [Changelog](https://github.com/kjvarga/sitemap_generator/blob/master/CHANGES.md)
- [Commits](https://github.com/kjvarga/sitemap_generator/compare/v6.3.0...v7.0.2)

---
updated-dependencies:
- dependency-name: sitemap_generator
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump carrierwave from 3.0.7 to 3.1.3

Bumps [carrierwave](https://github.com/carrierwaveuploader/carrierwave) from 3.0.7 to 3.1.3.
- [Release notes](https://github.com/carrierwaveuploader/carrierwave/releases)
- [Changelog](https://github.com/carrierwaveuploader/carrierwave/blob/master/CHANGELOG.md)
- [Commits](https://github.com/carrierwaveuploader/carrierwave/compare/v3.0.7...v3.1.3)

---
updated-dependencies:
- dependency-name: carrierwave
  dependency-version: 3.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump rubocop from 1.88.0 to 1.88.1 (#4691)

Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.88.0 to 1.88.1.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.88.0...v1.88.1)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.88.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump sitemap_generator from 7.0.2 to 7.0.3 (#4692)

Bumps [sitemap_generator](https://github.com/kjvarga/sitemap_generator) from 7.0.2 to 7.0.3.
- [Changelog](https://github.com/kjvarga/sitemap_generator/blob/master/CHANGES.md)
- [Commits](https://github.com/kjvarga/sitemap_generator/compare/v7.0.2...v7.0.3)

---
updated-dependencies:
- dependency-name: sitemap_generator
  dependency-version: 7.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump sitemap_generator from 7.0.3 to 7.1.0

Bumps [sitemap_generator](https://github.com/kjvarga/sitemap_generator) from 7.0.3 to 7.1.0.
- [Changelog](https://github.com/kjvarga/sitemap_generator/blob/master/CHANGES.md)
- [Commits](https://github.com/kjvarga/sitemap_generator/compare/v7.0.3...v7.1.0)

---
updated-dependencies:
- dependency-name: sitemap_generator
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump haml_lint from 0.74.0 to 0.75.0 (#4694)

Bumps [haml_lint](https://github.com/sds/haml-lint) from 0.74.0 to 0.75.0.
- [Release notes](https://github.com/sds/haml-lint/releases)
- [Changelog](https://github.com/sds/haml-lint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sds/haml-lint/compare/v0.74.0...v0.75.0)

---
updated-dependencies:
- dependency-name: haml_lint
  dependency-version: 0.75.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump rubocop from 1.88.1 to 1.88.2

Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.88.1 to 1.88.2.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.88.1...v1.88.2)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.88.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Cesy <cesy.avon@gmail.com>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-07-10 19:25:08 +09:30

249 lines
8.4 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe HarvestsController do
login_member
def valid_attributes
{
owner_id: subject.current_member.id,
crop_id: create(:crop).id,
plant_part_id: create(:plant_part).id,
harvested_at: '2017-01-01'
}
end
describe "GET index" do
let!(:first_member) { create(:member) }
let(:second_member) { create(:member) }
let(:tomato) { create(:tomato) }
let(:maize) { create(:maize) }
let!(:tomato_harvest) { create(:harvest, owner_id: first_member.id, crop_id: tomato.id) }
let!(:maize_harvest) { create(:harvest, owner_id: second_member.id, crop_id: maize.id) }
describe "assigns all harvests as @harvests" do
before { get :index, params: {} }
it { expect(assigns(:harvests).size).to eq 2 }
it { expect(assigns(:harvests)).to include(tomato_harvest) }
it { expect(assigns(:harvests)).to include(maize_harvest) }
end
describe "picks up owner from params and shows owner's harvests only" do
before { get :index, params: { member_slug: first_member.slug } }
it { expect(assigns(:owner)).to eq first_member }
it { expect(assigns(:harvests).size).to eq 1 }
it { expect(assigns(:harvests)[0].slug).to eq tomato_harvest.slug }
end
describe "picks up crop from params and shows the harvests for the crop only" do
before { get :index, params: { crop_slug: maize.name } }
it { expect(assigns(:crop)).to eq maize }
it { expect(assigns(:harvests).size).to eq 1 }
it { expect(assigns(:harvests)[0].slug).to eq maize_harvest.slug }
end
describe "generates a csv" do
before { get :index, format: "csv" }
it { expect(response).to have_http_status :ok }
end
end
describe "GET show" do
let(:harvest) { Harvest.create! valid_attributes }
describe "assigns the requested harvest as @harvest" do
before { get :show, params: { slug: harvest.to_param } }
it { expect(assigns(:harvest)).to eq(harvest) }
end
end
describe "GET new" do
before { get :new, params: {} }
describe "assigns a new harvest as @harvest" do
it { expect(assigns(:harvest)).to be_a_new(Harvest) }
end
describe "sets the date of the harvest to today" do
it { expect(assigns(:harvest).harvested_at).to eq(Time.zone.today) }
end
end
describe "GET edit" do
let(:harvest) { Harvest.create! valid_attributes }
describe "assigns the requested harvest as @harvest" do
before { get :edit, params: { slug: harvest.to_param } }
it { expect(assigns(:harvest)).to eq(harvest) }
end
end
describe "POST create" do
describe "with valid params" do
it "creates a new Harvest" do
expect do
post :create, params: { harvest: valid_attributes }
end.to change(Harvest, :count).by(1)
end
describe "assigns a newly created harvest as @harvest" do
before { post :create, params: { harvest: valid_attributes } }
it { expect(assigns(:harvest)).to be_a(Harvest) }
it { expect(assigns(:harvest)).to be_persisted }
end
describe "redirects to the created harvest" do
before { post :create, params: { harvest: valid_attributes } }
it { expect(response).to redirect_to(Harvest.last) }
end
describe "links to planting" do
let(:planting) { create(:planting, owner_id: member.id, garden: member.gardens.first) }
before { post :create, params: { harvest: valid_attributes.merge(planting_id: planting.id) } }
it { expect(Harvest.last.planting.id).to eq(planting.id) }
end
describe "updates planting rating" do
let(:planting) { create(:planting, owner_id: member.id, garden: member.gardens.first) }
it "updates the planting rating when provided" do
post :create, params: {
harvest: valid_attributes.merge(
planting_id: planting.id,
crop_id: planting.crop_id,
overall_rating: 4
)
}
expect(planting.reload.overall_rating).to eq(4)
end
end
end
describe "with invalid params" do
it "assigns a newly created but unsaved harvest as @harvest" do
# Trigger the behavior that occurs when invalid params are submitted
Harvest.any_instance.stub(:save).and_return(false)
post :create, params: { harvest: { "crop_id" => "invalid value" } }
expect(assigns(:harvest)).to be_a_new(Harvest)
end
describe "re-renders the 'new' template" do
# Trigger the behavior that occurs when invalid params are submitted
before { post :create, params: { harvest: { "crop_id" => "invalid value" } } }
it { expect(response).to render_template("new") }
end
end
describe "not my planting" do
let(:not_my_planting) { create(:planting) }
let(:harvest) { create(:harvest) }
describe "does not save planting_id" do
before do
allow(Harvest).to receive(:new).and_return(harvest)
post :create, params: { harvest: valid_attributes.merge(planting_id: not_my_planting.id) }
end
it { expect(harvest.planting_id).not_to eq(not_my_planting.id) }
end
end
end
describe "PUT update" do
describe "with valid params" do
let(:harvest) { Harvest.create! valid_attributes }
it "updates the requested harvest" do
new_crop = create(:crop)
expect do
put :update, params: { slug: harvest.to_param, harvest: { crop_id: new_crop.id } }
harvest.reload
end.to change(harvest, :crop_id).to(new_crop.id)
end
describe "assigns the requested harvest as @harvest" do
before { put :update, params: { slug: harvest.to_param, harvest: valid_attributes } }
it { expect(assigns(:harvest)).to eq(harvest) }
end
describe "redirects to the harvest" do
before { put :update, params: { slug: harvest.to_param, harvest: valid_attributes } }
it { expect(response).to redirect_to(harvest) }
end
describe "updates planting rating" do
let(:planting) { create(:planting, owner_id: member.id, garden: member.gardens.first) }
let(:harvest) do
create(:harvest, valid_attributes.merge(planting_id: planting.id, crop_id: planting.crop_id))
end
it "updates the planting rating when provided" do
put :update, params: { slug: harvest.to_param, harvest: { overall_rating: 3 } }
expect(planting.reload.overall_rating).to eq(3)
end
end
end
describe "with invalid params" do
it "assigns the harvest as @harvest" do
harvest = Harvest.create! valid_attributes
# Trigger the behavior that occurs when invalid params are submitted
Harvest.any_instance.stub(:save).and_return(false)
put :update, params: { slug: harvest.to_param, harvest: { "crop_id" => "invalid value" } }
expect(assigns(:harvest)).to eq(harvest)
end
it "re-renders the 'edit' template" do
harvest = Harvest.create! valid_attributes
put :update, params: { slug: harvest.to_param, harvest: { "crop_id" => "invalid value" } }
expect(response).to render_template("edit")
end
end
describe "not my planting" do
let(:not_my_planting) { create(:planting) }
let(:harvest) { create(:harvest) }
describe "does not save planting_id" do
before do
put :update, params: {
slug: harvest.to_param,
harvest: valid_attributes.merge(planting_id: not_my_planting.id)
}
end
it { expect(harvest.planting_id).to be_nil }
end
end
end
describe "DELETE destroy" do
it "destroys the requested harvest" do
harvest = Harvest.create! valid_attributes
expect do
delete :destroy, params: { slug: harvest.to_param }
end.to change(Harvest, :count).by(-1)
end
it "redirects to the harvests list" do
harvest = Harvest.create! valid_attributes
delete :destroy, params: { slug: harvest.to_param }
expect(response).to redirect_to(harvests_url)
end
end
end