mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-26 09:50:08 -04:00
Compare commits
1 Commits
add-garden
...
node-26
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc968ca381 |
4
.github/workflows/ci-features-admin.yml
vendored
4
.github/workflows/ci-features-admin.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-comments.yml
vendored
4
.github/workflows/ci-features-comments.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-crops.yml
vendored
4
.github/workflows/ci-features-crops.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-gardens.yml
vendored
4
.github/workflows/ci-features-gardens.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-harvests.yml
vendored
4
.github/workflows/ci-features-harvests.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
4
.github/workflows/ci-features-home.yml
vendored
4
.github/workflows/ci-features-home.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
4
.github/workflows/ci-features-members.yml
vendored
4
.github/workflows/ci-features-members.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
4
.github/workflows/ci-features-places.yml
vendored
4
.github/workflows/ci-features-places.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-plantings.yml
vendored
4
.github/workflows/ci-features-plantings.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-posts.yml
vendored
4
.github/workflows/ci-features-posts.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-seeds.yml
vendored
4
.github/workflows/ci-features-seeds.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
|
||||
4
.github/workflows/ci-features-timeline.yml
vendored
4
.github/workflows/ci-features-timeline.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
4
.github/workflows/ci-features.yml
vendored
4
.github/workflows/ci-features.yml
vendored
@@ -76,7 +76,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -112,7 +112,7 @@ jobs:
|
||||
|
||||
- name: Upload screenshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: screenshots
|
||||
path: tmp/screenshots
|
||||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -91,7 +91,7 @@ jobs:
|
||||
- name: Install NodeJS
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
node-version: '26'
|
||||
|
||||
- name: Install Ruby (version given by .ruby-version) and Bundler
|
||||
uses: ruby/setup-ruby@v1
|
||||
|
||||
@@ -6,6 +6,21 @@
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
# 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: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: have_no, not_to
|
||||
Capybara/NegationMatcher:
|
||||
Exclude:
|
||||
- 'spec/features/admin/reverting_crops_spec.rb'
|
||||
|
||||
# Offense count: 19
|
||||
Capybara/NegationMatcherAfterVisit:
|
||||
Exclude:
|
||||
@@ -18,6 +33,22 @@ Capybara/NegationMatcherAfterVisit:
|
||||
- 'spec/features/members/profile_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
|
||||
Capybara/SpecificMatcher:
|
||||
Exclude:
|
||||
@@ -63,6 +94,19 @@ FactoryBot/ExcessiveCreateList:
|
||||
- 'spec/features/crops/show_spec.rb'
|
||||
- 'spec/features/percy/percy_spec.rb'
|
||||
|
||||
# Offense count: 1158
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
FactoryBot/SyntaxMethods:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines, beginning_only, ending_only
|
||||
Layout/EmptyLinesAroundClassBody:
|
||||
Exclude:
|
||||
- 'db/migrate/20251130035700_create_versions.rb'
|
||||
|
||||
# Offense count: 312
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
|
||||
@@ -81,6 +125,25 @@ Layout/HashAlignment:
|
||||
- 'spec/requests/api/v1/activities_request_spec.rb'
|
||||
- 'spec/requests/api/v1/members_request_spec.rb'
|
||||
|
||||
# Offense count: 7
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Layout/HeredocIndentation:
|
||||
Exclude:
|
||||
- 'db/migrate/20190712003735_add_like_counter_caches.rb'
|
||||
- 'db/migrate/20191226024813_crop_harvest_counter_cache.rb'
|
||||
- 'db/migrate/20191226024957_crop_photo_counter_cache.rb'
|
||||
- 'db/migrate/20191226025124_plant_part_harvest_counter_cache.rb'
|
||||
- 'db/migrate/20191226025225_post_comment_counter_cache.rb'
|
||||
- 'db/migrate/20250824085224_add_photos_comment_count.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Width, EnforcedStyleAlignWith, AllowedPatterns.
|
||||
# SupportedStylesAlignWith: start_of_line, relative_to_receiver
|
||||
Layout/IndentationWidth:
|
||||
Exclude:
|
||||
- 'spec/requests/api/v1/activities_request_spec.rb'
|
||||
|
||||
# Offense count: 6
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: Max, AllowHeredoc, AllowURI, AllowQualifiedName, URISchemes, AllowRBSInlineAnnotation, AllowCopDirectives, AllowedPatterns, SplitStrings.
|
||||
@@ -94,6 +157,14 @@ Layout/LineLength:
|
||||
- 'db/seeds.rb'
|
||||
- 'spec/requests/api/v1/activities_request_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
# Configuration parameters: AllowInHeredoc.
|
||||
Layout/TrailingWhitespace:
|
||||
Exclude:
|
||||
- 'Gemfile'
|
||||
- 'app/helpers/crops_helper.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Lint/AmbiguousOperatorPrecedence:
|
||||
@@ -136,6 +207,18 @@ Lint/DuplicateMethods:
|
||||
Exclude:
|
||||
- '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
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Lint/RedundantCopDisableDirective:
|
||||
@@ -242,6 +325,12 @@ RSpec/BeforeAfterAll:
|
||||
Exclude:
|
||||
- 'spec/tasks/import_spec.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
RSpec/ContextMethod:
|
||||
Exclude:
|
||||
- 'spec/requests/api/v1/activities_request_spec.rb'
|
||||
|
||||
# Offense count: 299
|
||||
# Configuration parameters: Prefixes, AllowedPatterns.
|
||||
# Prefixes: when, with, without
|
||||
@@ -293,6 +382,14 @@ RSpec/EmptyLineAfterExample:
|
||||
RSpec/ExampleLength:
|
||||
Max: 27
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: EnforcedStyle.
|
||||
# SupportedStyles: method_call, block
|
||||
RSpec/ExpectChange:
|
||||
Exclude:
|
||||
- 'spec/models/crop_spec.rb'
|
||||
|
||||
# Offense count: 32
|
||||
RSpec/ExpectInHook:
|
||||
Exclude:
|
||||
@@ -472,6 +569,23 @@ RSpec/VerifiedDoubles:
|
||||
- 'spec/controllers/gardens_controller_spec.rb'
|
||||
- 'spec/views/devise/shared/_links_spec.rb'
|
||||
|
||||
# Offense count: 7
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: ResponseMethods.
|
||||
# ResponseMethods: response, last_response
|
||||
RSpecRails/HaveHttpStatus:
|
||||
Exclude:
|
||||
- 'spec/controllers/api/v1/plantings_controller_spec.rb'
|
||||
- 'spec/controllers/harvests_controller_spec.rb'
|
||||
- 'spec/controllers/likes_controller_spec.rb'
|
||||
- 'spec/requests/harvests_spec.rb'
|
||||
|
||||
# Offense count: 17
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: Inferences.
|
||||
RSpecRails/InferredSpecType:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 30
|
||||
# Configuration parameters: Database.
|
||||
# SupportedDatabases: mysql, postgresql
|
||||
@@ -578,6 +692,12 @@ Rails/RakeEnvironment:
|
||||
- 'lib/tasks/i18n.rake'
|
||||
- 'lib/tasks/testing.rake'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/RedirectBackOrTo:
|
||||
Exclude:
|
||||
- 'app/controllers/follows_controller.rb'
|
||||
|
||||
# Offense count: 9
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: AllowedReceivers.
|
||||
@@ -591,6 +711,7 @@ Rails/RedundantActiveRecordAllMethod:
|
||||
- 'app/controllers/scientific_names_controller.rb'
|
||||
- 'spec/features/members/deletion_spec.rb'
|
||||
- 'spec/features/percy/percy_spec.rb'
|
||||
- 'spec/models/harvest_spec.rb'
|
||||
|
||||
# Offense count: 5
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
@@ -672,6 +793,12 @@ Rails/WhereEquals:
|
||||
- 'app/models/harvest.rb'
|
||||
- 'app/models/planting.rb'
|
||||
|
||||
# Offense count: 1
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
Rails/WhereMissing:
|
||||
Exclude:
|
||||
- 'app/controllers/crops_controller.rb'
|
||||
|
||||
# Offense count: 3
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Rails/WhereRange:
|
||||
|
||||
4
Gemfile
4
Gemfile
@@ -139,7 +139,7 @@ gem "msgpack"
|
||||
# Pinned due to RAILS_ENV=production bundle exec rake assets:precompile failing with ArgumentError: wrong number of arguments (given 1, expected 0) (ArgumentError)
|
||||
# /tmp/build_8301a541/vendor/bundle/ruby/3.3.0/gems/connection_pool-3.0.2/lib/connection_pool.rb:48:in `initialize'
|
||||
# /tmp/build_8301a541/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.3/lib/active_support/cache/mem_cache_store.rb:63:in `new'
|
||||
gem "connection_pool", "< 3"
|
||||
gem "connection_pool", "< 3"
|
||||
|
||||
group :production do
|
||||
gem 'bonsai-elasticsearch-rails' # Integration with Bonsa-Elasticsearch on heroku
|
||||
@@ -204,5 +204,5 @@ gem "i18n_data", "~> 1.1"
|
||||
|
||||
gem "paper_trail", "~> 17.0"
|
||||
|
||||
gem 'aws-sdk-s3', '~> 1', '>= 1.114.0'
|
||||
gem 'sitemap_generator'
|
||||
gem 'aws-sdk-s3', '~> 1', '>= 1.114.0'
|
||||
|
||||
@@ -498,7 +498,7 @@ GEM
|
||||
date
|
||||
stringio
|
||||
public_suffix (7.0.5)
|
||||
puma (8.0.0)
|
||||
puma (7.2.0)
|
||||
nio4r (~> 2.0)
|
||||
query_diet (0.7.3)
|
||||
racc (1.8.1)
|
||||
|
||||
@@ -160,7 +160,7 @@ class CropsController < ApplicationController
|
||||
when 'youtube'
|
||||
Crop.approved.where(en_youtube_url: [nil, '']).order(plantings_count: :desc)
|
||||
when 'alternate_names'
|
||||
Crop.approved.where.missing(:alternate_names).order(plantings_count: :desc)
|
||||
Crop.approved.left_joins(:alternate_names).where(alternate_names: { id: nil }).order(plantings_count: :desc)
|
||||
when 'wikidata'
|
||||
crops_with_wikidata = Crop.joins(:scientific_names).where.not(scientific_names: { wikidata_id: nil }).distinct
|
||||
Crop.approved.where.not(id: crops_with_wikidata).order(plantings_count: :desc)
|
||||
|
||||
@@ -17,7 +17,7 @@ class FollowsController < ApplicationController
|
||||
else
|
||||
flash[:error] = "Already following or error while following."
|
||||
end
|
||||
redirect_back_or_to(root_path)
|
||||
redirect_back fallback_location: root_path
|
||||
end
|
||||
|
||||
def destroy
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class WeatherObservationsController < DataController
|
||||
def index
|
||||
@owner = Member.find_by(slug: params[:member_slug])
|
||||
@show_all = params[:all] == '1'
|
||||
@show_jump_to = params[:member_slug].present? ? true : false
|
||||
|
||||
# @weather_observations = @weather_observations.includes(:owner)
|
||||
# @weather_observations = @weather_observations.active unless @show_all
|
||||
# @weather_observations = @weather_observations.where(owner: @owner) if @owner.present?
|
||||
# @weather_observations = @weather_observations.where.not(members: { confirmed_at: nil })
|
||||
# .order(:name).paginate(page: params[:page])
|
||||
respond_with(@weather_observations)
|
||||
end
|
||||
|
||||
def show
|
||||
respond_with(@weather_observation)
|
||||
end
|
||||
|
||||
def new
|
||||
@weather_observation = WeatherObservation.new
|
||||
respond_with(@weather_observation)
|
||||
end
|
||||
|
||||
def edit
|
||||
respond_with(@weather_observation)
|
||||
end
|
||||
|
||||
def create
|
||||
@weather_observation.owner_id = current_member.id
|
||||
flash[:notice] = I18n.t('weather_observations.created') if @weather_observation.save
|
||||
respond_with(@weather_observation)
|
||||
end
|
||||
|
||||
def update
|
||||
flash[:notice] = I18n.t('weather_observations.updated') if @weather_observation.update(weather_observation_params)
|
||||
respond_with(@weather_observation)
|
||||
end
|
||||
|
||||
def destroy
|
||||
@weather_observation.destroy
|
||||
flash[:notice] = I18n.t('weather_observations.deleted')
|
||||
redirect_to(member_weather_observations_path(@weather_observation.owner))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def weather_observation_params
|
||||
params.require(:weather_observation).permit!
|
||||
end
|
||||
end
|
||||
|
||||
@@ -62,7 +62,7 @@ module CropsHelper
|
||||
'@type': 'Person',
|
||||
name: post.author.login_name
|
||||
},
|
||||
'datePublished': post.created_at
|
||||
'datePublished': post.created_at
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ class Garden < ApplicationRecord
|
||||
|
||||
has_many :plantings, dependent: :destroy
|
||||
has_many :crops, through: :plantings
|
||||
has_many :weather_observations, dependent: :destroy
|
||||
has_many :activities, dependent: :destroy
|
||||
has_many :garden_collaborators, dependent: :destroy
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# A weather observation is intended to be a snapshot aligned to
|
||||
# https://github.com/schemaorg/schemaorg/issues/362
|
||||
class WeatherObservation < ApplicationRecord
|
||||
belongs_to :owner
|
||||
|
||||
validates :source, presence: true
|
||||
validates :observed_at, presence: true
|
||||
|
||||
attr_accessible :source, :observation_at, :solvar_uv_index, :dew_point_temperature_centigrade,
|
||||
:air_temperature_centigrade, :relative_humidity, :wind_speed_kmh, :wind_gust_speed_kmh, :owner_id, :wind_direction, :precipitation_probability, :pressure,
|
||||
:visibility_distance_metres, :weather_type
|
||||
|
||||
# Lowest temp on earth: -89.2°C (-128.6°F)
|
||||
# Highest: 56.7°C
|
||||
validates :dew_point_temperature_centigrade, numericality: { min: -90, max: 60 }, allow_nil: true
|
||||
validates :air_temperature_centigrade, numericality: { min: -90, max: 60 }, allow_nil: true
|
||||
validates :relative_humidity, numericality: { min: 0, max: 100 }, allow_nil: true
|
||||
validates :wind_speed_kmh, numericality: { min: 0, max: 450 }, allow_nil: true # Highest 408 km/h
|
||||
validates :wind_gust_speed_kmh, min: 0, max: 450, allow_nil: true # Highest 408 km/h
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
- if can?(:edit, garden)
|
||||
.dropdown.garden-actions
|
||||
%a#garden-actions-button.btn.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button", href: '#'} Actions
|
||||
.dropdown-menu.dropdown-menu-xs{"aria-labelledby" => "garden-actions-button"}
|
||||
- if can?(:edit, garden)
|
||||
= garden_plant_something_button(garden, classes: 'dropdown-item') if garden.active
|
||||
- if garden.active
|
||||
= garden_mark_inactive_button(garden, classes: 'dropdown-item')
|
||||
- else
|
||||
= garden_mark_active_button(garden, classes: 'dropdown-item')
|
||||
|
||||
= garden_edit_button(garden, classes: 'dropdown-item')
|
||||
= add_photo_button(garden, classes: 'dropdown-item')
|
||||
|
||||
- if can?(:destroy, garden)
|
||||
.dropdown-divider
|
||||
= delete_button(garden, classes: 'dropdown-item text-danger',
|
||||
message: 'All plantings associated with this garden will also be deleted. Are you sure?')
|
||||
@@ -1,40 +0,0 @@
|
||||
.card.col-md-8.col-lg-7.mx-auto.float-none.white.z-depth-1.py-2.px-2
|
||||
= bootstrap_form_for(@garden) do |f|
|
||||
- if content_for? :title
|
||||
.card-header
|
||||
%h1.h2-responsive.text-center
|
||||
%strong=yield :title
|
||||
.card-body
|
||||
= required_field_help_text
|
||||
- if @garden.errors.any?
|
||||
#error_explanation.alert.alert-warning{:role => "alert"}
|
||||
%h4.alert-heading
|
||||
= pluralize(@garden.errors.size, "error")
|
||||
prohibited this garden from being saved
|
||||
%ul
|
||||
- @garden.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
= f.text_field :name, maxlength: 255, required: true
|
||||
= f.text_area :description, rows: 6
|
||||
= f.text_field :location,
|
||||
value: @garden.location || current_member.location,
|
||||
class: 'form-control', maxlength: 255
|
||||
%span.help-block
|
||||
= t('.location_helper')
|
||||
- if current_member.location.blank?
|
||||
= link_to "Set your location now.", edit_member_registration_path
|
||||
- else
|
||||
= link_to "Change your location.", edit_member_registration_path
|
||||
.row
|
||||
.col-md-5.col-12= f.number_field :area, class: 'input-small', step: "any"
|
||||
.col-md-7.col-12= f.select(:area_unit, Garden::AREA_UNITS_VALUES, { include_blank: false })
|
||||
.col-12= f.select(:garden_type_id, GardenType.all.order(:name).pluck(:name, :id),
|
||||
selected: @garden.garden_type_id, include_blank: true)
|
||||
.col-12
|
||||
= f.check_box :active, label: 'Active?'
|
||||
%p
|
||||
You can mark a garden as inactive if you no longer use it.
|
||||
Note: this will mark all plantings in the garden as "finished".
|
||||
.card-footer
|
||||
.text-right= f.submit 'Save Garden'
|
||||
@@ -1,20 +0,0 @@
|
||||
.panel.panel-success
|
||||
.panel-heading
|
||||
%h3.panel-title
|
||||
= link_to garden.name, garden_path(garden)
|
||||
.panel-body
|
||||
.row
|
||||
.col-md-2.col-xs-12.garden-info
|
||||
%p= render 'gardens/photo', garden: garden
|
||||
%p= display_garden_description(garden)
|
||||
- if can?(:edit, garden)
|
||||
= render 'gardens/actions', garden: garden
|
||||
|
||||
.col-md-10
|
||||
- if garden.plantings.current.size.positive?
|
||||
.row
|
||||
- garden.plantings.current.order(created_at: :desc).includes(:crop, :photos).each do |planting|
|
||||
.col-lg-2.col-sm-4.col-xs-6
|
||||
= render "plantings/thumbnail", planting: planting
|
||||
- else
|
||||
no plantings
|
||||
@@ -1,3 +0,0 @@
|
||||
= link_to image_tag(garden_image_path(garden),
|
||||
alt: garden.name, class: 'img-responsive'),
|
||||
garden_path(garden)
|
||||
@@ -1,18 +0,0 @@
|
||||
%h2 Previously planted in this garden
|
||||
|
||||
- if @finished_plantings.any?
|
||||
- year = nil
|
||||
- @finished_plantings.where.not(planted_at: nil).order(planted_at: :desc).each do |planting|
|
||||
- if year != planting.planted_at.year
|
||||
- year = planting.planted_at.year
|
||||
%h4= year
|
||||
= render "plantings/tiny", planting: planting
|
||||
|
||||
- if @finished_plantings.where(planted_at: nil).any?
|
||||
%h4 Unknown year
|
||||
- @finished_plantings.where(planted_at: nil).each do |planting|
|
||||
= render "plantings/tiny", planting: planting
|
||||
- else
|
||||
.col-md-12
|
||||
%p Nothing has been planted here.
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
= content_for :title, "Edit garden"
|
||||
|
||||
= render "form"
|
||||
@@ -1,65 +0,0 @@
|
||||
- content_for :title, @owner ? "#{@owner}'s weather_observations" : "Everyone's weather_observations"
|
||||
|
||||
%h1= @owner ? "#{@owner}'s weather_observations" : "Everyone's weather_observations"
|
||||
|
||||
- content_for :breadcrumbs do
|
||||
- if @owner
|
||||
%li.breadcrumb-item= link_to 'weather_observations', weather_observations_path
|
||||
%li.breadcrumb-item.active= link_to "#{@owner}'s weather_observations", member_weather_observations_path(@owner)
|
||||
- else
|
||||
%li.breadcrumb-item.active= link_to 'weather_observations', weather_observations_path
|
||||
|
||||
.row
|
||||
.col-md-2
|
||||
= render 'layouts/nav', model: weather_observation
|
||||
= link_to show_inactive_tickbox_path('weather_observations', owner: @owner, show_all: @show_all) do
|
||||
= check_box_tag 'active', 'all', @show_all
|
||||
include in-active
|
||||
- if @owner.present?
|
||||
%hr/
|
||||
= render @owner
|
||||
|
||||
.col-md-10
|
||||
- if @weather_observations.empty?
|
||||
%p There are no weather_observations to display.
|
||||
- if can?(:create, weather_observation) && @owner == current_member
|
||||
= link_to 'Add a weather_observation', new_weather_observation_path, class: 'btn btn-primary'
|
||||
|
||||
- else
|
||||
%section
|
||||
%h2= page_entries_info @weather_observations
|
||||
= will_paginate @weather_observations
|
||||
|
||||
- if @show_jump_to == true
|
||||
%section
|
||||
.jump
|
||||
jump to:
|
||||
- @weather_observations.each do |weather_observation|
|
||||
.badge.badge-primary
|
||||
- if @owner.present?
|
||||
= link_to weather_observation.weather_type, member_weather_observations_path(@owner, anchor: "weather_observation-#{weather_observation.id}")
|
||||
- else
|
||||
= link_to weather_observation.weather_type, weather_observations_path(anchor: "weather_observation-#{weather_observation.id}")
|
||||
- @weather_observations.each do |weather_observation|
|
||||
.card
|
||||
.card-header
|
||||
.row
|
||||
.col-12.col-md-3
|
||||
%h2= link_to weather_observation.weather_type, weather_observation, name: "weather_observation-#{weather_observation.id}"
|
||||
.row
|
||||
.col-md-3
|
||||
- if @owner.blank?
|
||||
owner:
|
||||
= render 'members/tiny', member: weather_observation.owner
|
||||
|
||||
.col-md-9
|
||||
%section
|
||||
= render 'weather_observations/actions', weather_observation: weather_observation
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.row
|
||||
.col-12= page_entries_info @weather_observations
|
||||
.col-12= will_paginate @weather_observations
|
||||
@@ -1,3 +0,0 @@
|
||||
- content_for :title, "New weather observation"
|
||||
|
||||
= render 'form'
|
||||
@@ -1,117 +0,0 @@
|
||||
= content_for :title, "#{@weather_observation.owner}'s #{@weather_observation}"
|
||||
|
||||
- content_for :opengraph do
|
||||
- if @weather_observation.weather_type
|
||||
= tag("meta", property: "og:description", content: og_description(@weather_observation. - if @weather_observation.weather_type))
|
||||
= tag("meta", property: "og:title", content: "#{@weather_observation.owner}'s #{@weather_observation}")
|
||||
= tag("meta", property: "og:type", content: "website")
|
||||
= tag("meta", property: "og:url", content: request.original_url)
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
|
||||
- content_for :breadcrumbs do
|
||||
%li.breadcrumb-item= link_to 'weather_observations', weather_observations_path
|
||||
%li.breadcrumb-item.active= link_to @weather_observation.weather_type, weather_observations_path(@weather_observation)
|
||||
|
||||
.row
|
||||
.col-md-9.col-12
|
||||
%h2.h1
|
||||
%strong= @weather_observation
|
||||
.col-md-3.col-12
|
||||
= render 'weather_observations/actions', weather_observation: @weather_observation
|
||||
.row
|
||||
%div
|
||||
%p
|
||||
:growstuff_markdown
|
||||
#{strip_tags @weather_observation.weather_type}
|
||||
- unless @weather_observation.description
|
||||
.row-fluid
|
||||
%p No description available yet.
|
||||
|
||||
- if can? :edit, @weather_observation
|
||||
%p
|
||||
Why not
|
||||
= link_to 'tell us more.', edit_weather_observation_path(@weather_observation)
|
||||
|
||||
- if @weather_observation.plantings.where.not(planted_at: nil).any?
|
||||
%section.card
|
||||
%h2 weather_observation progress
|
||||
.card-body
|
||||
= render 'plantings/progress_list', plantings: @weather_observation.plantings.active
|
||||
|
||||
%section
|
||||
%h2 Current plantings in weather_observation
|
||||
.index-cards
|
||||
- if @current_plantings.size.positive?
|
||||
- @current_plantings.each do |planting|
|
||||
= render "plantings/card", planting: planting
|
||||
- else
|
||||
.col-md-12
|
||||
%p Nothing is currently planted here.
|
||||
|
||||
%section.companions
|
||||
%h2 Suggestioned companions
|
||||
- @suggested_companions.each do |companion|
|
||||
= render 'crops/tiny', crop: companion
|
||||
|
||||
%section= render 'previously'
|
||||
|
||||
.col-md-3
|
||||
.card
|
||||
.card-image
|
||||
= image_tag weather_observation_image_path(@weather_observation), class: 'img-card', alt: 'photo of this weather_observation'
|
||||
.card-body
|
||||
%h4 About this weather_observation
|
||||
%p
|
||||
%strong Owner:
|
||||
= link_to @weather_observation.owner, @weather_observation.owner
|
||||
- if @weather_observation.location.present?
|
||||
%p
|
||||
%strong Location:
|
||||
= @weather_observation.location
|
||||
- if @weather_observation.area.present?
|
||||
%p
|
||||
%strong Area:
|
||||
= pluralize(@weather_observation.area, @weather_observation.area_unit)
|
||||
- if @weather_observation.weather_observation_type.present?
|
||||
%p
|
||||
%strong weather_observation type:
|
||||
= @weather_observation.weather_observation_type.name
|
||||
|
||||
.card
|
||||
.card-header
|
||||
%h4 #{@weather_observation.owner}'s weather_observations
|
||||
.card-body
|
||||
%ul.list-group.list-group-flush
|
||||
- @weather_observation.owner.weather_observations.active.order_by_name.each do |weather_observation|
|
||||
%li.list-group-item.list-group-flush
|
||||
= weather_observation_icon
|
||||
- if @weather_observation == weather_observation
|
||||
= @weather_observation
|
||||
- else
|
||||
= link_to weather_observation, weather_observation_path(weather_observation)
|
||||
|
||||
- unless @weather_observation.owner.weather_observations.inactive.empty?
|
||||
%h4 Inactive weather_observations
|
||||
%ul
|
||||
- @weather_observation.owner.weather_observations.inactive.order_by_name.each do |otherweather_observation|
|
||||
%li
|
||||
- if @weather_observation == otherweather_observation
|
||||
= @weather_observation.name
|
||||
- else
|
||||
= link_to otherweather_observation, weather_observation_path(otherweather_observation)
|
||||
|
||||
- if @weather_observation.owner == current_member
|
||||
%p
|
||||
= link_to new_weather_observation_path, class: 'btn btn-default btn-xs' do
|
||||
Add New weather_observation
|
||||
|
||||
- if can?(:edit, @weather_observation) && can?(:create, Photo)
|
||||
%%p
|
||||
= add_photo_button(@weather_observation)
|
||||
|
||||
- if @weather_observation.photos.size.positive?
|
||||
%section.photos
|
||||
%h2= localize_plural(@weather_observation.photos, Photo)
|
||||
.index-cards
|
||||
- @weather_observation.photos.includes(:owner).each do |photo|
|
||||
= render 'photos/thumbnail', photo: photo
|
||||
@@ -117,7 +117,6 @@ Rails.application.routes.draw do
|
||||
resources :plantings
|
||||
resources :harvests
|
||||
resources :posts
|
||||
resources :weather_observations
|
||||
resources :activities
|
||||
|
||||
resources :follows
|
||||
|
||||
@@ -18,6 +18,7 @@ class AllThePredictions < ActiveRecord::Migration[4.2]
|
||||
|
||||
remove_column :plantings, :days_before_maturity, :integer
|
||||
|
||||
create_table :median_functions
|
||||
create_table :median_functions do |t|
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -14,23 +14,23 @@ class AddLikeCounterCaches < ActiveRecord::Migration[5.2]
|
||||
end
|
||||
|
||||
def data
|
||||
execute <<~SQL.squish
|
||||
UPDATE photos
|
||||
SET likes_count = (
|
||||
SELECT count(1)
|
||||
FROM likes
|
||||
WHERE likes.likeable_id = photos.id
|
||||
AND likeable_type = 'Photo'
|
||||
)
|
||||
execute <<-SQL.squish
|
||||
UPDATE photos
|
||||
SET likes_count = (
|
||||
SELECT count(1)
|
||||
FROM likes
|
||||
WHERE likes.likeable_id = photos.id
|
||||
AND likeable_type = 'Photo'
|
||||
)
|
||||
SQL
|
||||
execute <<~SQL.squish
|
||||
UPDATE posts
|
||||
SET likes_count = (
|
||||
SELECT count(1)
|
||||
FROM likes
|
||||
WHERE likes.likeable_id = posts.id
|
||||
AND likeable_type = 'Post'
|
||||
)
|
||||
execute <<-SQL.squish
|
||||
UPDATE posts
|
||||
SET likes_count = (
|
||||
SELECT count(1)
|
||||
FROM likes
|
||||
WHERE likes.likeable_id = posts.id
|
||||
AND likeable_type = 'Post'
|
||||
)
|
||||
SQL
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,13 +11,13 @@ class CropHarvestCounterCache < ActiveRecord::Migration[5.2]
|
||||
end
|
||||
|
||||
def set_counter_value
|
||||
execute <<~SQL.squish
|
||||
UPDATE crops
|
||||
SET harvests_count = (
|
||||
SELECT count(1)
|
||||
FROM harvests
|
||||
WHERE harvests.crop_id = crops.id
|
||||
)
|
||||
execute <<-SQL.squish
|
||||
UPDATE crops
|
||||
SET harvests_count = (
|
||||
SELECT count(1)
|
||||
FROM harvests
|
||||
WHERE harvests.crop_id = crops.id
|
||||
)
|
||||
SQL
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,13 +11,13 @@ class CropPhotoCounterCache < ActiveRecord::Migration[5.2]
|
||||
end
|
||||
|
||||
def set_counter_value
|
||||
execute <<~SQL.squish
|
||||
UPDATE crops
|
||||
SET photo_associations_count = (
|
||||
SELECT count(1)
|
||||
FROM photo_associations
|
||||
WHERE photo_associations.crop_id = crops.id
|
||||
)
|
||||
execute <<-SQL.squish
|
||||
UPDATE crops
|
||||
SET photo_associations_count = (
|
||||
SELECT count(1)
|
||||
FROM photo_associations
|
||||
WHERE photo_associations.crop_id = crops.id
|
||||
)
|
||||
SQL
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,13 +11,13 @@ class PlantPartHarvestCounterCache < ActiveRecord::Migration[5.2]
|
||||
end
|
||||
|
||||
def set_counter_value
|
||||
execute <<~SQL.squish
|
||||
UPDATE plant_parts
|
||||
SET harvests_count = (
|
||||
SELECT count(1)
|
||||
FROM harvests
|
||||
WHERE harvests.plant_part_id = plant_parts.id
|
||||
)
|
||||
execute <<-SQL.squish
|
||||
UPDATE plant_parts
|
||||
SET harvests_count = (
|
||||
SELECT count(1)
|
||||
FROM harvests
|
||||
WHERE harvests.plant_part_id = plant_parts.id
|
||||
)
|
||||
SQL
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,7 +11,7 @@ class PostCommentCounterCache < ActiveRecord::Migration[5.2]
|
||||
end
|
||||
|
||||
def set_counter_value
|
||||
execute <<~SQL.squish
|
||||
execute <<-SQL.squish
|
||||
UPDATE posts
|
||||
SET comments_count = (
|
||||
SELECT count(1)
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AddWeatherObservations < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
# See https://github.com/schemaorg/schemaorg/issues/362
|
||||
create_table :weather_observations do |t|
|
||||
t.string :source
|
||||
t.datetime :observation_at
|
||||
t.integer :solar_uv_index
|
||||
t.decimal :wind_speed_kmh
|
||||
t.decimal :wind_gust_speed_kmh
|
||||
t.string :wind_direction
|
||||
t.decimal :air_temperature_centigrade
|
||||
t.decimal :relative_humidity
|
||||
t.decimal :precipitation_probability
|
||||
t.decimal :dew_point_temperature_centigrade
|
||||
t.decimal :pressure
|
||||
t.integer :visibility_distance_metres
|
||||
t.string :weather_type
|
||||
t.references :owner
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -11,7 +11,7 @@ class AddPhotosCommentCount < ActiveRecord::Migration[7.2]
|
||||
end
|
||||
|
||||
def set_counter_value
|
||||
execute <<~SQL.squish
|
||||
execute <<-SQL.squish
|
||||
UPDATE photos
|
||||
SET comments_count = (
|
||||
SELECT count(1)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# This migration creates the `versions` table for the Version class.
|
||||
# All other migrations PT provides are optional.
|
||||
class CreateVersions < ActiveRecord::Migration[7.2]
|
||||
|
||||
# The largest text column available in all supported RDBMS is
|
||||
# 1024^3 - 1 bytes, roughly one gibibyte. We specify a size
|
||||
# so that MySQL will use `longtext` instead of `text`. Otherwise,
|
||||
|
||||
20
db/schema.rb
20
db/schema.rb
@@ -970,26 +970,6 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_01_045000) do
|
||||
t.index ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id"
|
||||
end
|
||||
|
||||
create_table "weather_observations", force: :cascade do |t|
|
||||
t.string "source"
|
||||
t.datetime "observation_at"
|
||||
t.integer "solar_uv_index"
|
||||
t.decimal "wind_speed_kmh"
|
||||
t.decimal "wind_gust_speed_kmh"
|
||||
t.string "wind_direction"
|
||||
t.decimal "air_temperature_centigrade"
|
||||
t.decimal "relative_humidity"
|
||||
t.decimal "precipitation_probability"
|
||||
t.decimal "dew_point_temperature_centigrade"
|
||||
t.decimal "pressure"
|
||||
t.integer "visibility_distance_metres"
|
||||
t.string "weather_type"
|
||||
t.bigint "owner_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["owner_id"], name: "index_weather_observations_on_owner_id"
|
||||
end
|
||||
|
||||
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
|
||||
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
|
||||
add_foreign_key "harvests", "plantings"
|
||||
|
||||
@@ -14,8 +14,9 @@
|
||||
"@coffeelint/cli": "^3.0.0",
|
||||
"@percy/cli": "^1.0.0-beta.76",
|
||||
"csslint": "^1.0.5",
|
||||
"eslint": "^10.0.0",
|
||||
"eslint-config-google": "^0.9.1"
|
||||
"eslint": "^5.0.0",
|
||||
"eslint-config-google": "^0.9.1",
|
||||
"jshint": "^2.9.4"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -14,7 +14,7 @@ describe AdminController do
|
||||
end
|
||||
|
||||
describe 'assigns @members' do
|
||||
let!(:m) { create(:newsletter_recipient_member) }
|
||||
let!(:m) { FactoryBot.create(:newsletter_recipient_member) }
|
||||
|
||||
it { expect(assigns(:members)).to eq [m] }
|
||||
end
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Api::V1::PlantingsController do
|
||||
RSpec.describe Api::V1::PlantingsController, type: :controller do
|
||||
subject { JSON.parse response.body }
|
||||
|
||||
let!(:member) { create(:member) }
|
||||
let!(:member) { FactoryBot.create(:member) }
|
||||
|
||||
describe '#index' do
|
||||
let(:matching_planting) { subject['data'].select { |planting| planting['id'] == my_planting.id.to_s }.first }
|
||||
|
||||
describe 'GET #index' do
|
||||
context 'basic planting' do
|
||||
let!(:my_planting) { create(:planting, owner: member, planted_at: '2000-01-01') }
|
||||
let!(:my_planting) { FactoryBot.create(:planting, owner: member, planted_at: '2000-01-01') }
|
||||
let(:expected_attributes) do
|
||||
{
|
||||
'crop-name' => my_planting.crop.name,
|
||||
@@ -42,11 +42,11 @@ RSpec.describe Api::V1::PlantingsController do
|
||||
|
||||
it { expect(matching_planting).to include('id' => my_planting.id.to_s) }
|
||||
it { expect(matching_planting['attributes']).to eq expected_attributes }
|
||||
it { expect(response).to have_http_status :ok }
|
||||
it { expect(response.status).to eq 200 }
|
||||
end
|
||||
|
||||
context 'with photo' do
|
||||
let!(:my_planting) { create(:planting, owner: member, planted_at: '2000-01-01') }
|
||||
let!(:my_planting) { FactoryBot.create(:planting, owner: member, planted_at: '2000-01-01') }
|
||||
|
||||
let(:expected_attributes) do
|
||||
{
|
||||
@@ -72,7 +72,7 @@ RSpec.describe Api::V1::PlantingsController do
|
||||
'thumbnail' => photo.thumbnail_url
|
||||
}
|
||||
end
|
||||
let(:photo) { create(:photo, owner: my_planting.owner) }
|
||||
let(:photo) { FactoryBot.create(:photo, owner: my_planting.owner) }
|
||||
|
||||
before do
|
||||
my_planting.photos << photo
|
||||
@@ -81,7 +81,7 @@ RSpec.describe Api::V1::PlantingsController do
|
||||
|
||||
it { expect(matching_planting).to include('id' => my_planting.id.to_s) }
|
||||
it { expect(matching_planting['attributes']).to eq expected_attributes }
|
||||
it { expect(response).to have_http_status :ok }
|
||||
it { expect(response.status).to eq 200 }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,10 +4,10 @@ require 'rails_helper'
|
||||
|
||||
describe AuthenticationsController do
|
||||
before do
|
||||
@member = create(:member)
|
||||
@member = FactoryBot.create(:member)
|
||||
sign_in @member
|
||||
controller.stub(:current_member) { @member }
|
||||
@auth = create(:authentication, member: @member)
|
||||
@auth = FactoryBot.create(:authentication, member: @member)
|
||||
request.env['omniauth.auth'] = {
|
||||
'provider' => 'foo',
|
||||
'uid' => 'bar',
|
||||
|
||||
@@ -4,7 +4,7 @@ require 'rails_helper'
|
||||
|
||||
describe Charts::CropsController do
|
||||
describe 'GET charts' do
|
||||
let(:crop) { create(:crop) }
|
||||
let(:crop) { FactoryBot.create(:crop) }
|
||||
|
||||
describe 'sunniness' do
|
||||
before { get :sunniness, params: { crop_slug: crop.to_param } }
|
||||
|
||||
@@ -5,7 +5,7 @@ require 'rails_helper'
|
||||
describe Charts::GardensController do
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
let(:garden) { create(:garden) }
|
||||
let(:garden) { FactoryBot.create(:garden) }
|
||||
|
||||
context "when not signed in" do
|
||||
describe 'GET timeline' do
|
||||
@@ -18,7 +18,7 @@ describe Charts::GardensController do
|
||||
context "when signed in" do
|
||||
before { sign_in member }
|
||||
|
||||
let!(:member) { create(:member) }
|
||||
let!(:member) { FactoryBot.create(:member) }
|
||||
|
||||
describe 'GET timeline' do
|
||||
before { get :timeline, params: { garden_slug: garden.to_param } }
|
||||
|
||||
@@ -5,7 +5,7 @@ require 'rails_helper'
|
||||
describe CommentsController do
|
||||
subject { response }
|
||||
|
||||
let(:member) { create(:member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
|
||||
before do
|
||||
sign_in member
|
||||
@@ -13,13 +13,13 @@ describe CommentsController do
|
||||
end
|
||||
|
||||
def valid_attributes
|
||||
@post = create(:post)
|
||||
@post = FactoryBot.create(:post)
|
||||
{ post_id: @post.id, body: "some text" }
|
||||
end
|
||||
|
||||
describe "GET RSS feed" do
|
||||
let!(:first_comment) { create(:comment, created_at: 10.days.ago) }
|
||||
let!(:last_comment) { create(:comment, created_at: 4.minutes.ago) }
|
||||
let!(:first_comment) { FactoryBot.create(:comment, created_at: 10.days.ago) }
|
||||
let!(:last_comment) { FactoryBot.create(:comment, created_at: 4.minutes.ago) }
|
||||
|
||||
describe "returns an RSS feed" do
|
||||
before { get :index, format: "rss" }
|
||||
@@ -32,7 +32,7 @@ describe CommentsController do
|
||||
end
|
||||
|
||||
describe "GET new" do
|
||||
let(:post) { create(:post) }
|
||||
let(:post) { FactoryBot.create(:post) }
|
||||
|
||||
describe "with valid params" do
|
||||
before do
|
||||
@@ -41,7 +41,7 @@ describe CommentsController do
|
||||
}
|
||||
end
|
||||
|
||||
let(:old_comment) { create(:comment, commentable: post) }
|
||||
let(:old_comment) { FactoryBot.create(:comment, commentable: post) }
|
||||
|
||||
it "picks up post from params" do
|
||||
expect(assigns(:commentable)).to eq(post)
|
||||
@@ -59,13 +59,13 @@ describe CommentsController do
|
||||
end
|
||||
|
||||
describe "GET edit" do
|
||||
let(:post) { create(:post) }
|
||||
let(:post) { FactoryBot.create(:post) }
|
||||
|
||||
before { get :edit, params: { id: comment.to_param } }
|
||||
|
||||
describe "my comment" do
|
||||
let!(:comment) { create(:comment, author: member, commentable: post) }
|
||||
let!(:old_comment) { create(:comment, commentable: post, created_at: Time.zone.yesterday) }
|
||||
let!(:comment) { FactoryBot.create(:comment, author: member, commentable: post) }
|
||||
let!(:old_comment) { FactoryBot.create(:comment, commentable: post, created_at: Time.zone.yesterday) }
|
||||
|
||||
it "assigns previous comments as @comments" do
|
||||
expect(assigns(:comments)).to eq([comment, old_comment])
|
||||
@@ -73,7 +73,7 @@ describe CommentsController do
|
||||
end
|
||||
|
||||
describe "not my comment" do
|
||||
let(:comment) { create(:comment, commentable: post) }
|
||||
let(:comment) { FactoryBot.create(:comment, commentable: post) }
|
||||
|
||||
it { expect(response).not_to be_successful }
|
||||
end
|
||||
@@ -83,7 +83,7 @@ describe CommentsController do
|
||||
before { put :update, params: { id: comment.to_param, comment: valid_attributes } }
|
||||
|
||||
describe "my comment" do
|
||||
let(:comment) { create(:comment, author: member) }
|
||||
let(:comment) { FactoryBot.create(:comment, author: member) }
|
||||
|
||||
it "redirects to the comment's post" do
|
||||
expect(response).to redirect_to(comment.commentable)
|
||||
@@ -91,16 +91,16 @@ describe CommentsController do
|
||||
end
|
||||
|
||||
describe "not my comment" do
|
||||
let(:comment) { create(:comment) }
|
||||
let(:comment) { FactoryBot.create(:comment) }
|
||||
|
||||
it { expect(response).not_to be_successful }
|
||||
end
|
||||
|
||||
describe "attempting to change post_id" do
|
||||
let(:post) { create(:post, subject: 'our post') }
|
||||
let(:other_post) { create(:post, subject: 'the other post') }
|
||||
let(:post) { FactoryBot.create(:post, subject: 'our post') }
|
||||
let(:other_post) { FactoryBot.create(:post, subject: 'the other post') }
|
||||
let(:valid_attributes) { { commentable_type: "Post", commentable_id: other_post.id, body: "kōrero" } }
|
||||
let(:comment) { create(:comment, author: member, commentable: post) }
|
||||
let(:comment) { FactoryBot.create(:comment, author: member, commentable: post) }
|
||||
|
||||
it "does not change post_id" do
|
||||
comment.reload
|
||||
@@ -113,7 +113,7 @@ describe CommentsController do
|
||||
before { delete :destroy, params: { id: comment.to_param } }
|
||||
|
||||
describe "my comment" do
|
||||
let(:comment) { create(:comment, author: member) }
|
||||
let(:comment) { FactoryBot.create(:comment, author: member) }
|
||||
|
||||
it "redirects to the post the comment was on" do
|
||||
expect(response).to redirect_to(comment.commentable)
|
||||
@@ -121,7 +121,7 @@ describe CommentsController do
|
||||
end
|
||||
|
||||
describe "not my comment" do
|
||||
let(:comment) { create(:comment) }
|
||||
let(:comment) { FactoryBot.create(:comment) }
|
||||
|
||||
it { expect(response).not_to be_successful }
|
||||
end
|
||||
|
||||
@@ -42,8 +42,8 @@ describe CropsController do
|
||||
|
||||
describe "GET crop search" do
|
||||
describe 'fetches the crop search page' do
|
||||
let!(:tomato) { create(:tomato) }
|
||||
let!(:maize) { create(:maize) }
|
||||
let!(:tomato) { FactoryBot.create(:tomato) }
|
||||
let!(:maize) { FactoryBot.create(:maize) }
|
||||
|
||||
before { Crop.reindex }
|
||||
|
||||
@@ -140,7 +140,7 @@ describe CropsController do
|
||||
describe 'DELETE destroy' do
|
||||
subject { delete :destroy, params: { slug: crop.to_param } }
|
||||
|
||||
let!(:crop) { create(:crop) }
|
||||
let!(:crop) { FactoryBot.create(:crop) }
|
||||
|
||||
context 'not logged in' do
|
||||
it { expect { subject }.not_to change(Crop, :count) }
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe GardenTypesController do
|
||||
RSpec.describe GardenTypesController, type: :controller do
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
let(:valid_params) { { name: 'My second GardenType' } }
|
||||
let(:garden_type) { create(:garden_type) }
|
||||
let(:garden_type) { FactoryBot.create(:garden_type) }
|
||||
|
||||
context "when not signed in" do
|
||||
describe 'GET new' do
|
||||
@@ -54,7 +54,7 @@ RSpec.describe GardenTypesController do
|
||||
context "when signed in as a member" do
|
||||
before { sign_in member }
|
||||
|
||||
let!(:member) { create(:member) }
|
||||
let!(:member) { FactoryBot.create(:member) }
|
||||
|
||||
describe "for any garden_type" do
|
||||
let(:any_garden_type) { double('garden_type') }
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe GardensController do
|
||||
RSpec.describe GardensController, type: :controller do
|
||||
include Devise::Test::ControllerHelpers
|
||||
|
||||
let(:valid_params) { { name: 'My second Garden' } }
|
||||
|
||||
let(:garden) { create(:garden) }
|
||||
let(:garden) { FactoryBot.create(:garden) }
|
||||
|
||||
context "when not signed in" do
|
||||
describe 'GET new' do
|
||||
@@ -55,7 +55,7 @@ RSpec.describe GardensController do
|
||||
context "when signed in" do
|
||||
before { sign_in member }
|
||||
|
||||
let!(:member) { create(:member) }
|
||||
let!(:member) { FactoryBot.create(:member) }
|
||||
|
||||
describe "for another member's garden" do
|
||||
let(:not_my_garden) { double('garden') }
|
||||
|
||||
@@ -8,19 +8,19 @@ describe HarvestsController, :search do
|
||||
def valid_attributes
|
||||
{
|
||||
owner_id: subject.current_member.id,
|
||||
crop_id: create(:crop).id,
|
||||
plant_part_id: create(:plant_part).id,
|
||||
crop_id: FactoryBot.create(:crop).id,
|
||||
plant_part_id: FactoryBot.create(:plant_part).id,
|
||||
harvested_at: '2017-01-01'
|
||||
}
|
||||
end
|
||||
|
||||
describe "GET index" do
|
||||
let!(:member1) { create(:member) }
|
||||
let(:member2) { create(:member) }
|
||||
let(:tomato) { create(:tomato) }
|
||||
let(:maize) { create(:maize) }
|
||||
let!(:harvest1) { create(:harvest, owner_id: member1.id, crop_id: tomato.id) }
|
||||
let!(:harvest2) { create(:harvest, owner_id: member2.id, crop_id: maize.id) }
|
||||
let!(:member1) { FactoryBot.create(:member) }
|
||||
let(:member2) { FactoryBot.create(:member) }
|
||||
let(:tomato) { FactoryBot.create(:tomato) }
|
||||
let(:maize) { FactoryBot.create(:maize) }
|
||||
let!(:harvest1) { FactoryBot.create(:harvest, owner_id: member1.id, crop_id: tomato.id) }
|
||||
let!(:harvest2) { FactoryBot.create(:harvest, owner_id: member2.id, crop_id: maize.id) }
|
||||
|
||||
before { Harvest.reindex }
|
||||
|
||||
@@ -51,7 +51,7 @@ describe HarvestsController, :search do
|
||||
describe "generates a csv" do
|
||||
before { get :index, format: "csv" }
|
||||
|
||||
it { expect(response).to have_http_status :ok }
|
||||
it { expect(response.status).to eq 200 }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -109,7 +109,7 @@ describe HarvestsController, :search do
|
||||
end
|
||||
|
||||
describe "links to planting" do
|
||||
let(:planting) { create(:planting, owner_id: member.id, garden: member.gardens.first) }
|
||||
let(:planting) { FactoryBot.create(:planting, owner_id: member.id, garden: member.gardens.first) }
|
||||
|
||||
before { post :create, params: { harvest: valid_attributes.merge(planting_id: planting.id) } }
|
||||
|
||||
@@ -134,8 +134,8 @@ describe HarvestsController, :search do
|
||||
end
|
||||
|
||||
describe "not my planting" do
|
||||
let(:not_my_planting) { create(:planting) }
|
||||
let(:harvest) { create(:harvest) }
|
||||
let(:not_my_planting) { FactoryBot.create(:planting) }
|
||||
let(:harvest) { FactoryBot.create(:harvest) }
|
||||
|
||||
describe "does not save planting_id" do
|
||||
before do
|
||||
@@ -153,7 +153,7 @@ describe HarvestsController, :search do
|
||||
let(:harvest) { Harvest.create! valid_attributes }
|
||||
|
||||
it "updates the requested harvest" do
|
||||
new_crop = create(:crop)
|
||||
new_crop = FactoryBot.create(:crop)
|
||||
expect do
|
||||
put :update, params: { slug: harvest.to_param, harvest: { crop_id: new_crop.id } }
|
||||
harvest.reload
|
||||
@@ -190,8 +190,8 @@ describe HarvestsController, :search do
|
||||
end
|
||||
|
||||
describe "not my planting" do
|
||||
let(:not_my_planting) { create(:planting) }
|
||||
let(:harvest) { create(:harvest) }
|
||||
let(:not_my_planting) { FactoryBot.create(:planting) }
|
||||
let(:harvest) { FactoryBot.create(:harvest) }
|
||||
|
||||
describe "does not save planting_id" do
|
||||
before do
|
||||
|
||||
8
spec/controllers/home_controller_spec.rb
Normal file
8
spec/controllers/home_controller_spec.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe HomeController do
|
||||
describe "GET index" do
|
||||
end
|
||||
end
|
||||
@@ -3,9 +3,9 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe LikesController do
|
||||
let(:like) { create(:like, member:) }
|
||||
let(:member) { create(:member) }
|
||||
let(:blogpost) { create(:post) }
|
||||
let(:like) { FactoryBot.create(:like, member:) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
let(:blogpost) { FactoryBot.create(:post) }
|
||||
|
||||
before { sign_in member }
|
||||
|
||||
@@ -19,7 +19,10 @@ describe LikesController do
|
||||
it { JSON.parse(response.body)["description"] == "1 like" }
|
||||
|
||||
describe "Liking someone else's post" do
|
||||
it { expect(response).to have_http_status(:created) }
|
||||
it { expect(response.code).to eq('201') }
|
||||
end
|
||||
|
||||
describe "Liking your own post" do
|
||||
end
|
||||
end
|
||||
|
||||
@@ -29,14 +32,14 @@ describe LikesController do
|
||||
it { expect(response.content_type).to eq "application/json; charset=utf-8" }
|
||||
|
||||
describe "un-liking something i liked before" do
|
||||
it { expect(response).to have_http_status(:ok) }
|
||||
it { expect(response.code).to eq('200') }
|
||||
it { JSON.parse(response.body)["description"] == "0 likes" }
|
||||
end
|
||||
|
||||
describe "Deleting someone else's like" do
|
||||
let(:like) { create(:like) }
|
||||
let(:like) { FactoryBot.create(:like) }
|
||||
|
||||
it { expect(response).to have_http_status(:forbidden) }
|
||||
it { expect(response.code).to eq('403') }
|
||||
it { JSON.parse(response.body)["error"] == "Unable to like" }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,8 +4,8 @@ require 'rails_helper'
|
||||
|
||||
describe MembersController do
|
||||
before do
|
||||
@member = create(:member)
|
||||
@flickr_auth = create(:flickr_authentication, member: @member)
|
||||
@member = FactoryBot.create(:member)
|
||||
@flickr_auth = FactoryBot.create(:flickr_authentication, member: @member)
|
||||
end
|
||||
|
||||
describe "GET index" do
|
||||
@@ -39,7 +39,7 @@ describe MembersController do
|
||||
end
|
||||
|
||||
it "doesn't show unconfirmed members" do
|
||||
@member2 = create(:unconfirmed_member)
|
||||
@member2 = FactoryBot.create(:unconfirmed_member)
|
||||
get :show, params: { slug: @member2.id }
|
||||
expect(response).to have_http_status(:not_found)
|
||||
end
|
||||
|
||||
@@ -17,8 +17,8 @@ describe PhotoAssociationsController do
|
||||
before { photo.harvests << harvest }
|
||||
|
||||
describe "my harvest my photo" do
|
||||
let(:harvest) { create(:harvest, owner: member) }
|
||||
let(:photo) { create(:photo, owner: member) }
|
||||
let(:harvest) { FactoryBot.create(:harvest, owner: member) }
|
||||
let(:photo) { FactoryBot.create(:photo, owner: member) }
|
||||
|
||||
it "removes link" do
|
||||
expect { delete :destroy, params: valid_params }.to change { photo.harvests.count }.by(-1)
|
||||
@@ -26,8 +26,8 @@ describe PhotoAssociationsController do
|
||||
end
|
||||
|
||||
describe "another member's harvest from another member's photo" do
|
||||
let(:harvest) { create(:harvest, owner: photo.owner) }
|
||||
let(:photo) { create(:photo) }
|
||||
let(:harvest) { FactoryBot.create(:harvest, owner: photo.owner) }
|
||||
let(:photo) { FactoryBot.create(:photo) }
|
||||
|
||||
it do
|
||||
expect do
|
||||
|
||||
@@ -7,7 +7,7 @@ describe PhotosController, :search do
|
||||
|
||||
describe 'GET index' do
|
||||
describe 'all photos' do
|
||||
let!(:photo) { create(:photo, :reindex) }
|
||||
let!(:photo) { FactoryBot.create(:photo, :reindex) }
|
||||
|
||||
before do
|
||||
Photo.reindex
|
||||
@@ -21,10 +21,10 @@ describe PhotosController, :search do
|
||||
end
|
||||
|
||||
describe '#index crop photos' do
|
||||
let!(:photo) { create(:photo, :reindex, owner: member, title: 'no assocations photo') }
|
||||
let!(:crop_photo) { create(:photo, :reindex, owner: member, title: 'photos of planting') }
|
||||
let!(:planting) { create(:planting, :reindex, crop:, owner: member) }
|
||||
let!(:crop) { create(:crop, :reindex) }
|
||||
let!(:photo) { FactoryBot.create(:photo, :reindex, owner: member, title: 'no assocations photo') }
|
||||
let!(:crop_photo) { FactoryBot.create(:photo, :reindex, owner: member, title: 'photos of planting') }
|
||||
let!(:planting) { FactoryBot.create(:planting, :reindex, crop:, owner: member) }
|
||||
let!(:crop) { FactoryBot.create(:crop, :reindex) }
|
||||
|
||||
before do
|
||||
planting.photos << crop_photo
|
||||
@@ -49,12 +49,12 @@ describe PhotosController, :search do
|
||||
end
|
||||
|
||||
describe "GET new" do
|
||||
let(:tomato) { create(:tomato) }
|
||||
let(:planting) { create(:planting, crop: tomato, owner: member) }
|
||||
let(:garden) { create(:garden, owner: member) }
|
||||
let(:harvest) { create(:harvest, owner: member) }
|
||||
let(:member) { create(:member) }
|
||||
let!(:auth) { create(:flickr_authentication, member:) }
|
||||
let(:tomato) { FactoryBot.create(:tomato) }
|
||||
let(:planting) { FactoryBot.create(:planting, crop: tomato, owner: member) }
|
||||
let(:garden) { FactoryBot.create(:garden, owner: member) }
|
||||
let(:harvest) { FactoryBot.create(:harvest, owner: member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
let!(:auth) { FactoryBot.create(:flickr_authentication, member:) }
|
||||
|
||||
before do
|
||||
sign_in member
|
||||
@@ -97,11 +97,11 @@ describe PhotosController, :search do
|
||||
link_url: "http://example.com")
|
||||
end
|
||||
|
||||
let(:member) { create(:member) }
|
||||
let(:garden) { create(:garden, owner: member) }
|
||||
let(:planting) { create(:planting, garden:, owner: member) }
|
||||
let(:harvest) { create(:harvest, owner: member) }
|
||||
let(:photo) { create(:photo, owner: member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
let(:garden) { FactoryBot.create(:garden, owner: member) }
|
||||
let(:planting) { FactoryBot.create(:planting, garden:, owner: member) }
|
||||
let(:harvest) { FactoryBot.create(:harvest, owner: member) }
|
||||
let(:photo) { FactoryBot.create(:photo, owner: member) }
|
||||
|
||||
describe "with valid params" do
|
||||
before { controller.stub(:current_member) { member } }
|
||||
@@ -153,7 +153,7 @@ describe PhotosController, :search do
|
||||
end
|
||||
|
||||
it "doesn't attach photo to a comment" do
|
||||
comment = create(:comment)
|
||||
comment = FactoryBot.create(:comment)
|
||||
expect do
|
||||
post :create, params: {
|
||||
photo: { source_id: photo.source_id, source: 'flickr' }, type: "comment", id: comment.id
|
||||
@@ -163,7 +163,7 @@ describe PhotosController, :search do
|
||||
end
|
||||
|
||||
describe "for the second time" do
|
||||
let(:planting) { create(:planting, owner: member) }
|
||||
let(:planting) { FactoryBot.create(:planting, owner: member) }
|
||||
let(:valid_params) { { photo: { source_id: 1 }, id: planting.id, type: 'planting' } }
|
||||
|
||||
it "does not add a photo twice" do
|
||||
@@ -176,8 +176,8 @@ describe PhotosController, :search do
|
||||
before { controller.stub(:current_member) { member } }
|
||||
|
||||
describe "creates the planting/photo link" do
|
||||
let(:planting) { create(:planting, garden:, owner: member) }
|
||||
let(:photo) { create(:photo, owner: member) }
|
||||
let(:planting) { FactoryBot.create(:planting, garden:, owner: member) }
|
||||
let(:photo) { FactoryBot.create(:photo, owner: member) }
|
||||
|
||||
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
|
||||
|
||||
describe "with mismatched owners" do
|
||||
let(:photo) { create(:photo) }
|
||||
let(:photo) { FactoryBot.create(:photo) }
|
||||
|
||||
it "does not create the planting/photo link" do
|
||||
# members will be auto-created, and different
|
||||
another_planting = create(:planting)
|
||||
another_planting = FactoryBot.create(:planting)
|
||||
expect do
|
||||
post :create, params: {
|
||||
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
|
||||
# members will be auto-created, and different
|
||||
another_harvest = create(:harvest)
|
||||
another_harvest = FactoryBot.create(:harvest)
|
||||
expect do
|
||||
post :create, params: {
|
||||
photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: another_harvest.id
|
||||
|
||||
@@ -9,8 +9,8 @@ describe PlacesController do
|
||||
|
||||
describe "GET show" do
|
||||
before do
|
||||
@member_london = create(:london_member)
|
||||
@member_south_pole = create(:south_pole_member)
|
||||
@member_london = FactoryBot.create(:london_member)
|
||||
@member_south_pole = FactoryBot.create(:south_pole_member)
|
||||
end
|
||||
|
||||
it "assigns place name" do
|
||||
|
||||
6
spec/controllers/plant_parts_controller_spec.rb
Normal file
6
spec/controllers/plant_parts_controller_spec.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe PlantPartsController do
|
||||
end
|
||||
@@ -7,18 +7,18 @@ describe PlantingsController, :search do
|
||||
|
||||
def valid_attributes
|
||||
{
|
||||
garden_id: create(:garden, owner: subject.current_member).id,
|
||||
crop_id: create(:crop).id
|
||||
garden_id: FactoryBot.create(:garden, owner: subject.current_member).id,
|
||||
crop_id: FactoryBot.create(:crop).id
|
||||
}
|
||||
end
|
||||
|
||||
describe "GET index", :search do
|
||||
let!(:member1) { create(:member) }
|
||||
let!(:member2) { create(:member) }
|
||||
let!(:tomato) { create(:tomato) }
|
||||
let!(:maize) { create(:maize) }
|
||||
let!(:planting1) { create(:planting, crop: tomato, owner: member1, created_at: 1.day.ago) }
|
||||
let!(:planting2) { create(:planting, crop: maize, owner: member2, created_at: 5.days.ago) }
|
||||
let!(:member1) { FactoryBot.create(:member) }
|
||||
let!(:member2) { FactoryBot.create(:member) }
|
||||
let!(:tomato) { FactoryBot.create(:tomato) }
|
||||
let!(:maize) { FactoryBot.create(:maize) }
|
||||
let!(:planting1) { FactoryBot.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) }
|
||||
|
||||
before do
|
||||
Planting.reindex
|
||||
@@ -50,7 +50,7 @@ describe PlantingsController, :search do
|
||||
|
||||
describe "GET new" do
|
||||
describe "picks up crop from params" do
|
||||
let(:crop) { create(:crop) }
|
||||
let(:crop) { FactoryBot.create(:crop) }
|
||||
|
||||
before { get :new, params: { crop_id: crop.id } }
|
||||
|
||||
@@ -64,7 +64,7 @@ describe PlantingsController, :search do
|
||||
end
|
||||
|
||||
describe "picks up member's garden from params" do
|
||||
let(:garden) { create(:garden, owner: member) }
|
||||
let(:garden) { FactoryBot.create(:garden, owner: member) }
|
||||
|
||||
before { get :new, params: { garden_id: garden.id } }
|
||||
|
||||
@@ -72,8 +72,8 @@ describe PlantingsController, :search do
|
||||
end
|
||||
|
||||
describe "Doesn't display another member's garden on planting form" do
|
||||
let(:another_member) { create(:member) } # over-riding member from login_member()
|
||||
let(:garden) { create(:garden, owner: another_member) }
|
||||
let(:another_member) { FactoryBot.create(:member) } # over-riding member from login_member()
|
||||
let(:garden) { FactoryBot.create(:garden, owner: another_member) }
|
||||
|
||||
before { get :new, params: { garden_id: garden.id } }
|
||||
|
||||
@@ -81,8 +81,8 @@ describe PlantingsController, :search do
|
||||
end
|
||||
|
||||
describe "Doesn't display un-approved crops on planting form" do
|
||||
let(:crop) { create(:crop, approval_status: 'pending') }
|
||||
let!(:garden) { create(:garden, owner: member) }
|
||||
let(:crop) { FactoryBot.create(:crop, approval_status: 'pending') }
|
||||
let!(:garden) { FactoryBot.create(:garden, owner: member) }
|
||||
|
||||
before { get :new, params: { crop_id: crop.id } }
|
||||
|
||||
@@ -90,8 +90,8 @@ describe PlantingsController, :search do
|
||||
end
|
||||
|
||||
describe "Doesn't display rejected crops on planting form" do
|
||||
let(:crop) { create(:crop, approval_status: 'rejected', reason_for_rejection: 'nope') }
|
||||
let!(:garden) { create(:garden, owner: member) }
|
||||
let(:crop) { FactoryBot.create(:crop, approval_status: 'rejected', reason_for_rejection: 'nope') }
|
||||
let!(:garden) { FactoryBot.create(:garden, owner: member) }
|
||||
|
||||
before { get :new, params: { crop_id: crop.id } }
|
||||
|
||||
@@ -111,7 +111,7 @@ describe PlantingsController, :search do
|
||||
end
|
||||
|
||||
context 'with parent seed' do
|
||||
let(:seed) { create(:seed, owner: member) }
|
||||
let(:seed) { FactoryBot.create(:seed, owner: member) }
|
||||
|
||||
before { get :new, params: { seed_id: seed.to_param } }
|
||||
|
||||
@@ -128,8 +128,8 @@ describe PlantingsController, :search do
|
||||
end
|
||||
|
||||
describe 'GET :edit' do
|
||||
let(:my_planting) { create(:planting, owner: member) }
|
||||
let(:not_my_planting) { create(:planting) }
|
||||
let(:my_planting) { FactoryBot.create(:planting, owner: member) }
|
||||
let(:not_my_planting) { FactoryBot.create(:planting) }
|
||||
|
||||
context 'my planting' do
|
||||
before { get :edit, params: { slug: my_planting } }
|
||||
|
||||
@@ -6,14 +6,14 @@ describe PostsController do
|
||||
login_member
|
||||
|
||||
def valid_attributes
|
||||
member = create(:member)
|
||||
member = FactoryBot.create(:member)
|
||||
{ author_id: member.id, subject: "blah", body: "blah blah" }
|
||||
end
|
||||
|
||||
describe '#index' do
|
||||
before do
|
||||
create_list(:post, 100)
|
||||
create_list(:post, 5, author: member)
|
||||
FactoryBot.create_list(:post, 100)
|
||||
FactoryBot.create_list(:post, 5, author: member)
|
||||
end
|
||||
|
||||
describe "everyone's posts" do
|
||||
|
||||
@@ -4,7 +4,7 @@ require 'rails_helper'
|
||||
|
||||
describe RegistrationsController do
|
||||
before do
|
||||
@member = create(:member)
|
||||
@member = FactoryBot.create(:member)
|
||||
sign_in @member
|
||||
controller.stub(:current_user) { @member }
|
||||
controller.stub(:devise_mapping).and_return(Devise.mappings[:member])
|
||||
@@ -17,7 +17,7 @@ describe RegistrationsController do
|
||||
end
|
||||
|
||||
it "picks up the flickr auth" do
|
||||
@auth = create(:flickr_authentication, member: @member)
|
||||
@auth = FactoryBot.create(:flickr_authentication, member: @member)
|
||||
get :edit
|
||||
assigns(:flickr_auth).should eq @auth
|
||||
end
|
||||
|
||||
@@ -5,7 +5,7 @@ require 'rails_helper'
|
||||
describe ScientificNamesController do
|
||||
login_member(:crop_wrangling_member)
|
||||
|
||||
let!(:crop) { create(:tomato) }
|
||||
let!(:crop) { FactoryBot.create(:tomato) }
|
||||
|
||||
def valid_attributes
|
||||
{ name: 'Solanum lycopersicum', crop_id: crop.id }
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe SeedsController, :search do
|
||||
let(:owner) { create(:member) }
|
||||
let(:owner) { FactoryBot.create(:member) }
|
||||
|
||||
describe "GET index" do
|
||||
describe "picks up owner from params" do
|
||||
@@ -26,7 +26,7 @@ describe SeedsController, :search do
|
||||
end
|
||||
|
||||
context 'with parent planting' do
|
||||
let!(:planting) { create(:planting, owner:) }
|
||||
let!(:planting) { FactoryBot.create(:planting, owner:) }
|
||||
|
||||
before do
|
||||
Seed.reindex
|
||||
|
||||
6
spec/factories/crop_companions.rb
Normal file
6
spec/factories/crop_companions.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
FactoryBot.define do
|
||||
factory :crop_companion do
|
||||
end
|
||||
end
|
||||
@@ -32,7 +32,7 @@ RSpec.feature 'Reverting crops' do
|
||||
|
||||
scenario 'Member cannot revert a crop' do
|
||||
visit admin_crops_path
|
||||
expect(page).to have_no_link('Revert')
|
||||
expect(page).not_to have_link('Revert')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -73,13 +73,13 @@ describe "Conversations", :js do
|
||||
click_link recipient.login_name
|
||||
click_link 'Inbox'
|
||||
|
||||
expect(page).to have_css('.sent')
|
||||
expect(page).to have_selector('.sent')
|
||||
find('.sent').click
|
||||
|
||||
all('input[type=checkbox]').each(&:click)
|
||||
click_button 'Delete'
|
||||
|
||||
expect(page).to have_css('.sent')
|
||||
expect(page).to have_selector('.sent')
|
||||
find('.sent').click
|
||||
expect(page).to have_no_content 'this is a message'
|
||||
expect(page).to have_no_content 'this is another message'
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe "browse crops", :search do
|
||||
let!(:tomato) { create(:tomato, :reindex) }
|
||||
let!(:maize) { create(:maize, :reindex) }
|
||||
let!(:pending_crop) { create(:crop_request, :reindex) }
|
||||
let!(:rejected_crop) { create(:rejected_crop, :reindex) }
|
||||
let!(:tomato) { FactoryBot.create(:tomato, :reindex) }
|
||||
let!(:maize) { FactoryBot.create(:maize, :reindex) }
|
||||
let!(:pending_crop) { FactoryBot.create(:crop_request, :reindex) }
|
||||
let!(:rejected_crop) { FactoryBot.create(:rejected_crop, :reindex) }
|
||||
|
||||
shared_examples 'shows crops' do
|
||||
before do
|
||||
|
||||
@@ -14,7 +14,7 @@ describe "crop detail page", :js do
|
||||
end
|
||||
|
||||
before do
|
||||
create(:plant_part, name: 'leaf')
|
||||
FactoryBot.create(:plant_part, name: 'leaf')
|
||||
end
|
||||
|
||||
let(:crop) { create(:crop) }
|
||||
@@ -112,14 +112,14 @@ describe "crop detail page", :js do
|
||||
describe 'with harvest history data' do
|
||||
before do
|
||||
# 50 days to harvest
|
||||
create(:harvest, harvested_at: 150.days.ago, crop:,
|
||||
planting: create(:planting, planted_at: 200.days.ago, crop:))
|
||||
FactoryBot.create(:harvest, harvested_at: 150.days.ago, crop:,
|
||||
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:))
|
||||
# 20 days to harvest
|
||||
create(:harvest, harvested_at: 180.days.ago, crop:,
|
||||
planting: create(:planting, planted_at: 200.days.ago, crop:))
|
||||
FactoryBot.create(:harvest, harvested_at: 180.days.ago, crop:,
|
||||
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:))
|
||||
# 10 days to harvest
|
||||
create(:harvest, harvested_at: 190.days.ago, crop:,
|
||||
planting: create(:planting, planted_at: 200.days.ago, crop:))
|
||||
FactoryBot.create(:harvest, harvested_at: 190.days.ago, crop:,
|
||||
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:))
|
||||
crop.update_medians
|
||||
end
|
||||
|
||||
@@ -131,13 +131,13 @@ describe "crop detail page", :js do
|
||||
|
||||
context 'predictions' do
|
||||
let!(:planting) do
|
||||
create(:planting, crop:,
|
||||
planted_at: 100.days.ago,
|
||||
finished_at: 1.day.ago)
|
||||
FactoryBot.create(:planting, crop:,
|
||||
planted_at: 100.days.ago,
|
||||
finished_at: 1.day.ago)
|
||||
end
|
||||
|
||||
context 'crop is an Annual' do
|
||||
let(:crop) { create(:annual_crop) }
|
||||
let(:crop) { FactoryBot.create(:annual_crop) }
|
||||
|
||||
describe 'with harvests' do
|
||||
it_behaves_like "predicts harvest"
|
||||
@@ -155,7 +155,10 @@ describe "crop detail page", :js do
|
||||
end
|
||||
|
||||
context 'crop is Perennial' do
|
||||
let(:crop) { create(:perennial_crop) }
|
||||
let(:crop) { FactoryBot.create(:perennial_crop) }
|
||||
|
||||
describe 'with no harvests' do
|
||||
end
|
||||
|
||||
describe 'with harvests' do
|
||||
it_behaves_like "predicts harvest"
|
||||
@@ -168,7 +171,10 @@ describe "crop detail page", :js do
|
||||
end
|
||||
|
||||
context 'crop Perennial value is null' do
|
||||
let(:crop) { create(:crop, perennial: nil) }
|
||||
let(:crop) { FactoryBot.create(:crop, perennial: nil) }
|
||||
|
||||
describe 'with no harvests' do
|
||||
end
|
||||
|
||||
describe 'with harvests' do
|
||||
it_behaves_like "predicts harvest"
|
||||
@@ -180,7 +186,7 @@ describe "crop detail page", :js do
|
||||
before { visit crop_path(crop) }
|
||||
|
||||
context 'crop is an Annual' do
|
||||
let(:crop) { create(:annual_crop) }
|
||||
let(:crop) { FactoryBot.create(:annual_crop) }
|
||||
|
||||
it { expect(page).to have_text 'Annual' }
|
||||
it { expect(page).to have_text 'living and reproducing in a single year or less' }
|
||||
@@ -188,7 +194,7 @@ describe "crop detail page", :js do
|
||||
end
|
||||
|
||||
context 'crop is Perennial' do
|
||||
let(:crop) { create(:perennial_crop) }
|
||||
let(:crop) { FactoryBot.create(:perennial_crop) }
|
||||
|
||||
it { expect(find('.index-cards.facts')).to have_text 'Perennial' }
|
||||
it { expect(page).to have_text 'living more than two years' }
|
||||
@@ -196,7 +202,7 @@ describe "crop detail page", :js do
|
||||
end
|
||||
|
||||
context 'crop Perennial value is null' do
|
||||
let(:crop) { create(:crop, perennial: nil) }
|
||||
let(:crop) { FactoryBot.create(:crop, perennial: nil) }
|
||||
|
||||
it { expect(find('.index-cards.facts')).to have_no_text 'Perennial' }
|
||||
it { expect(page).to have_no_text 'Annual' }
|
||||
|
||||
@@ -5,22 +5,22 @@ require 'rails_helper'
|
||||
describe "crop detail page", :js, :search do
|
||||
subject { page }
|
||||
|
||||
let!(:owner_member) { create(:member) }
|
||||
let!(:owner_member) { FactoryBot.create(:member) }
|
||||
|
||||
let!(:crop) { create(:crop, :reindex) }
|
||||
let!(:crop) { FactoryBot.create(:crop, :reindex) }
|
||||
|
||||
let(:plant_part) { create(:plant_part, name: 'fruit') }
|
||||
let(:plant_part) { FactoryBot.create(:plant_part, name: 'fruit') }
|
||||
|
||||
let!(:harvest) { create(:harvest, crop:, owner: owner_member, plant_part:) }
|
||||
let!(:planting) { create(:planting, crop:, owner: owner_member) }
|
||||
let!(:seed) { create(:seed, crop:, owner: owner_member) }
|
||||
let!(:harvest) { FactoryBot.create(:harvest, crop:, owner: owner_member, plant_part:) }
|
||||
let!(:planting) { FactoryBot.create(:planting, crop:, owner: owner_member) }
|
||||
let!(:seed) { FactoryBot.create(:seed, crop:, owner: owner_member) }
|
||||
|
||||
let!(:photo1) { create(:photo, owner: owner_member) }
|
||||
let!(:photo2) { create(:photo, owner: owner_member) }
|
||||
let!(:photo3) { create(:photo, owner: owner_member) }
|
||||
let!(:photo4) { create(:photo, owner: owner_member) }
|
||||
let!(:photo5) { create(:photo, owner: owner_member) }
|
||||
let!(:photo6) { create(:photo, owner: owner_member) }
|
||||
let!(:photo1) { FactoryBot.create(:photo, owner: owner_member) }
|
||||
let!(:photo2) { FactoryBot.create(:photo, owner: owner_member) }
|
||||
let!(:photo3) { FactoryBot.create(:photo, owner: owner_member) }
|
||||
let!(:photo4) { FactoryBot.create(:photo, owner: owner_member) }
|
||||
let!(:photo5) { FactoryBot.create(:photo, owner: owner_member) }
|
||||
let!(:photo6) { FactoryBot.create(:photo, owner: owner_member) }
|
||||
|
||||
before do
|
||||
planting.photos << photo1
|
||||
|
||||
@@ -4,8 +4,8 @@ require 'rails_helper'
|
||||
|
||||
describe "Delete crop spec" do
|
||||
shared_examples 'delete crop' do
|
||||
let!(:pending_crop) { create(:crop_request) }
|
||||
let!(:approved_crop) { create(:crop) }
|
||||
let!(:pending_crop) { FactoryBot.create(:crop_request) }
|
||||
let!(:approved_crop) { FactoryBot.create(:crop) }
|
||||
it "deletes approved crop" do
|
||||
visit crop_path(approved_crop)
|
||||
click_link 'Actions'
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe "browse crops" do
|
||||
let(:tomato) { create(:tomato) }
|
||||
let(:tomato) { FactoryBot.create(:tomato) }
|
||||
|
||||
it "Show crop info" do
|
||||
visit crop_path(tomato)
|
||||
@@ -11,9 +11,9 @@ describe "browse crops" do
|
||||
end
|
||||
|
||||
describe "shows varieties" do
|
||||
let!(:cherry) { create(:crop, name: 'cherry tomato', parent: tomato) }
|
||||
let!(:heirloom) { create(:crop, name: 'heirloom tomato', parent: tomato) }
|
||||
let!(:striped) { create(:crop, name: 'striped tomato', parent: heirloom) }
|
||||
let!(:cherry) { FactoryBot.create(:crop, name: 'cherry tomato', parent: tomato) }
|
||||
let!(:heirloom) { FactoryBot.create(:crop, name: 'heirloom tomato', parent: tomato) }
|
||||
let!(:striped) { FactoryBot.create(:crop, name: 'striped tomato', parent: heirloom) }
|
||||
|
||||
before { visit crop_path(tomato) }
|
||||
|
||||
@@ -23,10 +23,10 @@ describe "browse crops" do
|
||||
end
|
||||
|
||||
context "when the most recently created harvest is not the most recently harvested" do
|
||||
before { create_list(:harvest, 20, crop: tomato, harvested_at: 1.year.ago, created_at: 1.minute.ago) }
|
||||
before { FactoryBot.create_list(:harvest, 20, crop: tomato, harvested_at: 1.year.ago, created_at: 1.minute.ago) }
|
||||
|
||||
let!(:most_recent_harvest) do
|
||||
create(:harvest, crop: tomato, harvested_at: 60.minutes.ago, created_at: 10.minutes.ago)
|
||||
FactoryBot.create(:harvest, crop: tomato, harvested_at: 60.minutes.ago, created_at: 10.minutes.ago)
|
||||
end
|
||||
|
||||
it "Shows most recently harvested harvest" do
|
||||
@@ -36,10 +36,10 @@ describe "browse crops" do
|
||||
end
|
||||
|
||||
context "when the most recently created planting is not the most recently planted" do
|
||||
before { create_list(:planting, 20, crop: tomato, planted_at: 1.year.ago, created_at: 1.minute.ago) }
|
||||
before { FactoryBot.create_list(:planting, 20, crop: tomato, planted_at: 1.year.ago, created_at: 1.minute.ago) }
|
||||
|
||||
let!(:most_recent_planting) do
|
||||
create(:planting, crop: tomato, planted_at: 60.minutes.ago, created_at: 10.minutes.ago)
|
||||
FactoryBot.create(:planting, crop: tomato, planted_at: 60.minutes.ago, created_at: 10.minutes.ago)
|
||||
end
|
||||
|
||||
it "Shows most recently planted planting" do
|
||||
|
||||
@@ -10,7 +10,7 @@ describe "footer" do
|
||||
end
|
||||
|
||||
it 'has the Open Service link and graphic' do
|
||||
expect(page).to have_css 'a[href="https://opendefinition.org/ossd/"]'
|
||||
expect(page).to have_selector 'a[href="https://opendefinition.org/ossd/"]'
|
||||
end
|
||||
|
||||
# NB: not testing specific content in the footer since I'm going to put them
|
||||
|
||||
@@ -9,7 +9,7 @@ describe "Gardens" do
|
||||
|
||||
include_context 'signed in member'
|
||||
let(:garden) { member.gardens.first }
|
||||
let(:other_member_garden) { create(:garden) }
|
||||
let(:other_member_garden) { FactoryBot.create(:garden) }
|
||||
|
||||
describe '#index' do
|
||||
shared_examples "has buttons bar at top" do
|
||||
@@ -47,7 +47,7 @@ describe "Gardens" do
|
||||
end
|
||||
|
||||
context "other member's garden" do
|
||||
before { visit gardens_path(member_slug: create(:member).slug) }
|
||||
before { visit gardens_path(member_slug: FactoryBot.create(:member).slug) }
|
||||
|
||||
include_examples "has buttons bar at top"
|
||||
describe 'does not show actions on other member garden' do
|
||||
|
||||
@@ -11,10 +11,10 @@ describe "Gardens", :js do
|
||||
include_examples 'is accessible'
|
||||
|
||||
it "displays required and optional fields properly" do
|
||||
expect(page).to have_css ".required", text: "Name"
|
||||
expect(page).to have_css 'textarea#garden_description'
|
||||
expect(page).to have_css 'input#garden_location'
|
||||
expect(page).to have_css 'input#garden_area'
|
||||
expect(page).to have_selector ".required", text: "Name"
|
||||
expect(page).to have_selector 'textarea#garden_description'
|
||||
expect(page).to have_selector 'input#garden_location'
|
||||
expect(page).to have_selector 'input#garden_area'
|
||||
end
|
||||
|
||||
it "Create new garden" do
|
||||
|
||||
@@ -6,11 +6,11 @@ require 'custom_matchers'
|
||||
describe "Gardens#index", :js do
|
||||
context "Logged in as member" do
|
||||
include_context 'signed in member'
|
||||
let(:member) { create(:member, login_name: 'shadow') }
|
||||
let(:member) { FactoryBot.create(:member, login_name: 'shadow') }
|
||||
|
||||
context "with 10 gardens" do
|
||||
before do
|
||||
create_list(:garden, 10, owner: member)
|
||||
FactoryBot.create_list(:garden, 10, owner: member)
|
||||
visit member_gardens_path(member_slug: member.slug)
|
||||
end
|
||||
|
||||
@@ -30,8 +30,8 @@ describe "Gardens#index", :js do
|
||||
end
|
||||
|
||||
context "with inactive gardens" do
|
||||
let!(:active_garden) { create(:garden, name: "My active garden", owner: member) }
|
||||
let!(:inactive_garden) { create(:inactive_garden, name: "retired garden", owner: member) }
|
||||
let!(:active_garden) { FactoryBot.create(:garden, name: "My active garden", owner: member) }
|
||||
let!(:inactive_garden) { FactoryBot.create(:inactive_garden, name: "retired garden", owner: member) }
|
||||
|
||||
before { visit member_gardens_path(member_slug: member.slug) }
|
||||
|
||||
@@ -53,14 +53,14 @@ describe "Gardens#index", :js do
|
||||
end
|
||||
|
||||
context 'with plantings' do
|
||||
let(:maize) { create(:maize) }
|
||||
let(:tomato) { create(:tomato) }
|
||||
let(:maize) { FactoryBot.create(:maize) }
|
||||
let(:tomato) { FactoryBot.create(:tomato) }
|
||||
|
||||
let!(:planting) do
|
||||
create(:planting, owner: member, crop: maize, garden: member.gardens.first)
|
||||
FactoryBot.create(:planting, owner: member, crop: maize, garden: member.gardens.first)
|
||||
end
|
||||
let!(:finished_planting) do
|
||||
create(:finished_planting, owner: member, crop: tomato, garden: member.gardens.first)
|
||||
FactoryBot.create(:finished_planting, owner: member, crop: tomato, garden: member.gardens.first)
|
||||
end
|
||||
|
||||
before do
|
||||
@@ -79,19 +79,19 @@ describe "Gardens#index", :js do
|
||||
|
||||
describe 'badges' do
|
||||
let(:garden) { member.gardens.first }
|
||||
let(:member) { create(:member, login_name: 'robbieburns') }
|
||||
let(:crop) { create(:crop) }
|
||||
let(:member) { FactoryBot.create(:member, login_name: 'robbieburns') }
|
||||
let(:crop) { FactoryBot.create(:crop) }
|
||||
|
||||
before do
|
||||
# time to harvest = 50 day
|
||||
# time to finished = 90 days
|
||||
create(:harvest,
|
||||
harvested_at: 50.days.ago,
|
||||
crop:,
|
||||
planting: create(:planting,
|
||||
crop:,
|
||||
planted_at: 100.days.ago,
|
||||
finished_at: 10.days.ago))
|
||||
FactoryBot.create(:harvest,
|
||||
harvested_at: 50.days.ago,
|
||||
crop:,
|
||||
planting: FactoryBot.create(:planting,
|
||||
crop:,
|
||||
planted_at: 100.days.ago,
|
||||
finished_at: 10.days.ago))
|
||||
crop.plantings.each(&:update_harvest_days!)
|
||||
crop.update_lifespan_medians
|
||||
crop.update_harvest_medians
|
||||
@@ -103,11 +103,11 @@ describe "Gardens#index", :js do
|
||||
|
||||
describe 'harvest still growing' do
|
||||
let!(:planting) do
|
||||
create(:planting,
|
||||
crop:,
|
||||
owner: member,
|
||||
garden:,
|
||||
planted_at: Time.zone.today)
|
||||
FactoryBot.create(:planting,
|
||||
crop:,
|
||||
owner: member,
|
||||
garden:,
|
||||
planted_at: Time.zone.today)
|
||||
end
|
||||
|
||||
it { expect(page).to have_link href: planting_path(planting) }
|
||||
@@ -118,10 +118,10 @@ describe "Gardens#index", :js do
|
||||
|
||||
describe 'harvesting now' do
|
||||
let!(:planting) do
|
||||
create(:planting,
|
||||
crop:,
|
||||
owner: member, garden:,
|
||||
planted_at: 51.days.ago)
|
||||
FactoryBot.create(:planting,
|
||||
crop:,
|
||||
owner: member, garden:,
|
||||
planted_at: 51.days.ago)
|
||||
end
|
||||
|
||||
it { expect(crop.median_days_to_first_harvest).to eq 50 }
|
||||
@@ -133,9 +133,9 @@ describe "Gardens#index", :js do
|
||||
|
||||
describe 'super late' do
|
||||
let!(:planting) do
|
||||
create(:planting,
|
||||
crop:, owner: member,
|
||||
garden:, planted_at: 260.days.ago)
|
||||
FactoryBot.create(:planting,
|
||||
crop:, owner: member,
|
||||
garden:, planted_at: 260.days.ago)
|
||||
end
|
||||
|
||||
it { expect(page).to have_text 'super late' }
|
||||
|
||||
@@ -14,10 +14,10 @@ describe "Harvesting a crop", :js, :search do
|
||||
it_behaves_like "crop suggest", "harvest", "crop"
|
||||
|
||||
describe "displays required and optional fields properly" do
|
||||
it { expect(page).to have_css ".required", text: "What did you harvest?" }
|
||||
it { expect(page).to have_css 'input#harvest_quantity' }
|
||||
it { expect(page).to have_css 'input#harvest_weight_quantity' }
|
||||
it { expect(page).to have_css 'textarea#harvest_description' }
|
||||
it { expect(page).to have_selector ".required", text: "What did you harvest?" }
|
||||
it { expect(page).to have_selector 'input#harvest_quantity' }
|
||||
it { expect(page).to have_selector 'input#harvest_weight_quantity' }
|
||||
it { expect(page).to have_selector 'textarea#harvest_description' }
|
||||
end
|
||||
|
||||
it "Creating a new harvest", :js do
|
||||
|
||||
@@ -5,18 +5,18 @@ require 'rails_helper'
|
||||
describe "home page", :search do
|
||||
subject { page }
|
||||
|
||||
let(:member) { create(:member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
|
||||
let(:photo) { create(:photo, owner: member) }
|
||||
let(:crop) { create(:crop, created_at: 1.day.ago) }
|
||||
let(:photo) { FactoryBot.create(:photo, owner: member) }
|
||||
let(:crop) { FactoryBot.create(:crop, created_at: 1.day.ago) }
|
||||
|
||||
let(:planting) { create(:planting, owner: member, crop:) }
|
||||
let(:seed) { create(:tradable_seed, owner: member, crop:) }
|
||||
let(:harvest) { create(:harvest, owner: member, crop:) }
|
||||
let(:planting) { FactoryBot.create(:planting, owner: member, crop:) }
|
||||
let(:seed) { FactoryBot.create(:tradable_seed, owner: member, crop:) }
|
||||
let(:harvest) { FactoryBot.create(:harvest, owner: member, crop:) }
|
||||
|
||||
let!(:tradable_seed) { create(:tradable_seed, :reindex, finished: false) }
|
||||
let!(:finished_seed) { create(:tradable_seed, :reindex, finished: true) }
|
||||
let!(:untradable_seed) { create(:untradable_seed, :reindex) }
|
||||
let!(:tradable_seed) { FactoryBot.create(:tradable_seed, :reindex, finished: false) }
|
||||
let!(:finished_seed) { FactoryBot.create(:tradable_seed, :reindex, finished: true) }
|
||||
let!(:untradable_seed) { FactoryBot.create(:untradable_seed, :reindex) }
|
||||
|
||||
before do
|
||||
# Add photos, so they can appear on home page
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'Likeable', :js, :search do
|
||||
let(:another_member) { create(:london_member) }
|
||||
let!(:post) { create(:post, :reindex, author: member) }
|
||||
let!(:activity) { create(:activity, :reindex, owner: member) }
|
||||
let!(:photo) { create(:photo, :reindex, owner: member) }
|
||||
let!(:harvest) { create(:harvest, :reindex, owner: member) }
|
||||
let!(:planting) { create(:planting, :reindex, owner: member) }
|
||||
let(:another_member) { FactoryBot.create(:london_member) }
|
||||
let!(:post) { FactoryBot.create(:post, :reindex, author: member) }
|
||||
let!(:activity) { FactoryBot.create(:activity, :reindex, owner: member) }
|
||||
let!(:photo) { FactoryBot.create(:photo, :reindex, owner: member) }
|
||||
let!(:harvest) { FactoryBot.create(:harvest, :reindex, owner: member) }
|
||||
let!(:planting) { FactoryBot.create(:planting, :reindex, owner: member) }
|
||||
|
||||
before do
|
||||
Photo.reindex
|
||||
@@ -68,8 +68,8 @@ describe 'Likeable', :js, :search do
|
||||
end
|
||||
|
||||
describe 'crops#show' do
|
||||
let(:crop) { create(:crop) }
|
||||
let(:planting) { create(:planting, owner: member, crop:) }
|
||||
let(:crop) { FactoryBot.create(:crop) }
|
||||
let(:planting) { FactoryBot.create(:planting, owner: member, crop:) }
|
||||
let(:path) { crop_path(crop) }
|
||||
|
||||
before { planting.photos << photo }
|
||||
|
||||
@@ -5,7 +5,7 @@ require 'rails_helper'
|
||||
describe "Changing locales", :js do
|
||||
after { I18n.locale = :en }
|
||||
|
||||
let(:member) { create(:member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
|
||||
it "Locale can be set with a query param" do
|
||||
# Login then log out, to ensure we're now logged out
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe "members list" do
|
||||
let!(:spammer) { create(:member) }
|
||||
let!(:admin) { create(:admin_member) }
|
||||
let!(:spammer) { FactoryBot.create(:member) }
|
||||
let!(:admin) { FactoryBot.create(:admin_member) }
|
||||
|
||||
context 'logged in as admin' do
|
||||
include_context 'signed in admin'
|
||||
|
||||
@@ -4,26 +4,26 @@ require 'rails_helper'
|
||||
|
||||
describe "member deletion", :flaky do
|
||||
context "with activity and followers" do
|
||||
let(:member) { create(:member) }
|
||||
let(:other_member) { create(:member) }
|
||||
let(:memberpost) { create(:post, author: member) }
|
||||
let(:othermemberpost) { create(:post, author: other_member) }
|
||||
let!(:planting) { create(:planting, owner: member) }
|
||||
let!(:harvest) { create(:harvest, owner: member) }
|
||||
let!(:seed) { create(:seed, owner: member) }
|
||||
let!(:secondgarden) { create(:garden, owner: member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
let(:other_member) { FactoryBot.create(:member) }
|
||||
let(:memberpost) { FactoryBot.create(:post, author: member) }
|
||||
let(:othermemberpost) { FactoryBot.create(:post, author: other_member) }
|
||||
let!(:planting) { FactoryBot.create(:planting, owner: member) }
|
||||
let!(:harvest) { FactoryBot.create(:harvest, owner: member) }
|
||||
let!(:seed) { FactoryBot.create(:seed, owner: member) }
|
||||
let!(:secondgarden) { FactoryBot.create(:garden, owner: member) }
|
||||
|
||||
before do
|
||||
member.follows.create!(followed: other_member)
|
||||
other_member.follows.create!(followed: member)
|
||||
|
||||
login_as(member)
|
||||
create(:comment, author: member, post: othermemberpost)
|
||||
create(:comment, author: other_member, post: memberpost, body: "Fun comment-y thing")
|
||||
FactoryBot.create(:comment, author: member, post: othermemberpost)
|
||||
FactoryBot.create(:comment, author: other_member, post: memberpost, body: "Fun comment-y thing")
|
||||
# deletion breaks if no wranglers exist
|
||||
create(:cropbot)
|
||||
FactoryBot.create(:cropbot)
|
||||
# deletion breaks if ex_member doesn't exist
|
||||
create(:member, login_name: "ex_member")
|
||||
FactoryBot.create(:member, login_name: "ex_member")
|
||||
end
|
||||
|
||||
it "has option to delete on member profile page" do
|
||||
@@ -136,7 +136,7 @@ describe "member deletion", :flaky do
|
||||
end
|
||||
|
||||
it "replaces comments on others' posts with deletion note, leaving post intact" do
|
||||
create(:comment, post: othermemberpost, author: member, body: 'i am deleting my account')
|
||||
FactoryBot.create(:comment, post: othermemberpost, author: member, body: 'i am deleting my account')
|
||||
|
||||
visit post_path(othermemberpost)
|
||||
expect(page).to have_no_content member.login_name
|
||||
@@ -163,12 +163,12 @@ describe "member deletion", :flaky do
|
||||
end
|
||||
|
||||
context "for a crop wrangler" do
|
||||
let(:member) { create(:crop_wrangling_member) }
|
||||
let!(:ex_wrangler) { create(:crop_wrangling_member, login_name: "ex_wrangler") }
|
||||
let(:otherwrangler) { create(:crop_wrangling_member) }
|
||||
let(:crop) { create(:crop, creator: member) }
|
||||
let(:member) { FactoryBot.create(:crop_wrangling_member) }
|
||||
let!(:ex_wrangler) { FactoryBot.create(:crop_wrangling_member, login_name: "ex_wrangler") }
|
||||
let(:otherwrangler) { FactoryBot.create(:crop_wrangling_member) }
|
||||
let(:crop) { FactoryBot.create(:crop, creator: member) }
|
||||
|
||||
before { create(:cropbot) }
|
||||
before { FactoryBot.create(:cropbot) }
|
||||
|
||||
it "leaves crops behind" do
|
||||
login_as(otherwrangler)
|
||||
|
||||
@@ -13,7 +13,7 @@ describe "members list" do
|
||||
before do
|
||||
visit members_path
|
||||
expect(page).to have_css "#sort"
|
||||
expect(page).to have_css "form"
|
||||
expect(page).to have_selector "form"
|
||||
end
|
||||
|
||||
it "default alphabetical sort" do
|
||||
|
||||
@@ -62,10 +62,10 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context "with some activity" do
|
||||
let!(:planting) { create(:planting, owner: member) }
|
||||
let!(:harvest) { create(:harvest, owner: member) }
|
||||
let!(:seed) { create(:seed, owner: member) }
|
||||
let!(:post) { create(:post, author: member) }
|
||||
let!(:planting) { FactoryBot.create(:planting, owner: member) }
|
||||
let!(:harvest) { FactoryBot.create(:harvest, owner: member) }
|
||||
let!(:seed) { FactoryBot.create(:seed, owner: member) }
|
||||
let!(:post) { FactoryBot.create(:post, author: member) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -104,10 +104,10 @@ describe "member profile", :js do
|
||||
|
||||
shared_examples 'member activity' do
|
||||
context 'member has plantings' do
|
||||
let!(:new_planting) { create(:planting, owner: member, planted_at: Time.zone.now) }
|
||||
let!(:old_planting) { create(:planting, owner: member, planted_at: 3.years.ago) }
|
||||
let!(:finished_planting) { create(:finished_planting, owner: member) }
|
||||
let!(:no_planted_at_planting) { create(:planting, owner: member, planted_at: nil) }
|
||||
let!(:new_planting) { FactoryBot.create(:planting, owner: member, planted_at: Time.zone.now) }
|
||||
let!(:old_planting) { FactoryBot.create(:planting, owner: member, planted_at: 3.years.ago) }
|
||||
let!(:finished_planting) { FactoryBot.create(:finished_planting, owner: member) }
|
||||
let!(:no_planted_at_planting) { FactoryBot.create(:planting, owner: member, planted_at: nil) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -118,9 +118,9 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context 'member has activities' do
|
||||
let!(:activity) { create(:activity, owner: member, due_date: 3.days.ago) }
|
||||
let!(:activity2) { create(:activity, :planting, owner: member) }
|
||||
let!(:activity3) { create(:activity, :garden, owner: member) }
|
||||
let!(:activity) { FactoryBot.create(:activity, owner: member, due_date: 3.days.ago) }
|
||||
let!(:activity2) { FactoryBot.create(:activity, :planting, owner: member) }
|
||||
let!(:activity3) { FactoryBot.create(:activity, :garden, owner: member) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -130,7 +130,7 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context 'member has seeds' do
|
||||
let!(:seed) { create(:seed, owner: member) }
|
||||
let!(:seed) { FactoryBot.create(:seed, owner: member) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -138,7 +138,7 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context 'member has harvests' do
|
||||
let!(:harvest) { create(:harvest, owner: member) }
|
||||
let!(:harvest) { FactoryBot.create(:harvest, owner: member) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -146,7 +146,7 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context 'member has posts' do
|
||||
let!(:post) { create(:post, author: member) }
|
||||
let!(:post) { FactoryBot.create(:post, author: member) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -154,8 +154,8 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context 'member has comments' do
|
||||
let(:post) { create(:post) }
|
||||
let!(:comment) { create(:comment, commentable: post, author: member) }
|
||||
let(:post) { FactoryBot.create(:post) }
|
||||
let!(:comment) { FactoryBot.create(:comment, commentable: post, author: member) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -164,8 +164,8 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context 'photos' do
|
||||
let(:planting) { create(:planting, owner: member) }
|
||||
let!(:photo) { create(:photo, owner: member, plantings: [planting]) }
|
||||
let(:planting) { FactoryBot.create(:planting, owner: member) }
|
||||
let!(:photo) { FactoryBot.create(:photo, owner: member, plantings: [planting]) }
|
||||
|
||||
before { visit member_path(member) }
|
||||
|
||||
@@ -174,35 +174,35 @@ describe "member profile", :js do
|
||||
end
|
||||
|
||||
context 'plantings' do
|
||||
let(:crop) { create(:crop) }
|
||||
let(:crop) { FactoryBot.create(:crop) }
|
||||
let(:growing_planting) do
|
||||
create(:planting,
|
||||
crop:,
|
||||
owner: member,
|
||||
planted_at: Time.zone.today)
|
||||
FactoryBot.create(:planting,
|
||||
crop:,
|
||||
owner: member,
|
||||
planted_at: Time.zone.today)
|
||||
end
|
||||
let(:harvesting_planting) do
|
||||
create(:planting,
|
||||
crop:,
|
||||
owner: member,
|
||||
planted_at: 51.days.ago)
|
||||
FactoryBot.create(:planting,
|
||||
crop:,
|
||||
owner: member,
|
||||
planted_at: 51.days.ago)
|
||||
end
|
||||
let(:super_late_planting) do
|
||||
create(:planting,
|
||||
crop:, owner: member,
|
||||
planted_at: 260.days.ago)
|
||||
FactoryBot.create(:planting,
|
||||
crop:, owner: member,
|
||||
planted_at: 260.days.ago)
|
||||
end
|
||||
|
||||
before do
|
||||
# time to harvest = 50 day
|
||||
# time to finished = 90 days
|
||||
create(:harvest,
|
||||
harvested_at: 50.days.ago,
|
||||
crop:,
|
||||
planting: create(:planting,
|
||||
crop:,
|
||||
planted_at: 100.days.ago,
|
||||
finished_at: 10.days.ago))
|
||||
FactoryBot.create(:harvest,
|
||||
harvested_at: 50.days.ago,
|
||||
crop:,
|
||||
planting: FactoryBot.create(:planting,
|
||||
crop:,
|
||||
planted_at: 100.days.ago,
|
||||
finished_at: 10.days.ago))
|
||||
crop.plantings.each(&:update_harvest_days!)
|
||||
crop.update_lifespan_medians
|
||||
crop.update_harvest_medians
|
||||
|
||||
@@ -2,30 +2,30 @@
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'Test with visual testing', :js do
|
||||
describe 'Test with visual testing', :js, type: :feature do
|
||||
# Use the same random seed every time so our random data is the same
|
||||
# on every run, so doesn't trigger percy to see changes
|
||||
before { Faker::Config.random = Random.new(42) }
|
||||
|
||||
let!(:member) { create(:member, login_name: 'percy', preferred_avatar_uri: gravatar) }
|
||||
let!(:crop_wrangler) { create(:crop_wrangling_member, login_name: 'croppy', preferred_avatar_uri: gravatar2) }
|
||||
let!(:admin_user) { create(:admin_member, login_name: 'janitor', preferred_avatar_uri: gravatar3) }
|
||||
let!(:someone_else) { create(:edinburgh_member, login_name: 'ruby', preferred_avatar_uri: gravatar4) }
|
||||
let!(:member) { FactoryBot.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!(:admin_user) { FactoryBot.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(:gravatar) { 'https://secure.gravatar.com/avatar/d021434aac03a7f7c7c0de60d07dad1c?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(:gravatar4) { 'https://secure.gravatar.com/avatar/7fd767571ff5ceefc7a687a543b2c402?size=150&default=identicon' }
|
||||
|
||||
let!(:tomato) { create(:tomato, creator: someone_else) }
|
||||
let(:plant_part) { create(:plant_part, name: 'fruit') }
|
||||
let!(:tomato) { FactoryBot.create(:tomato, creator: someone_else) }
|
||||
let(:plant_part) { FactoryBot.create(:plant_part, name: 'fruit') }
|
||||
|
||||
let(:tomato_photo) do
|
||||
create(:photo,
|
||||
title: 'look at my tomatoes',
|
||||
owner: member,
|
||||
fullsize_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_z.jpg',
|
||||
thumbnail_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_q.jpg')
|
||||
FactoryBot.create(:photo,
|
||||
title: 'look at my tomatoes',
|
||||
owner: member,
|
||||
fullsize_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_z.jpg',
|
||||
thumbnail_url: 'https://farm1.staticflickr.com/177/432250619_2fe19d067d_q.jpg')
|
||||
end
|
||||
let(:post_body) do
|
||||
"So, um, watering's important. Yep. Very important.
|
||||
@@ -66,7 +66,7 @@ rest of the garden.
|
||||
[apple](crop)
|
||||
"
|
||||
end
|
||||
let(:post) { create(:post, author: member, subject: "Watering", body: post_body) }
|
||||
let(:post) { FactoryBot.create(:post, author: member, subject: "Watering", body: post_body) }
|
||||
|
||||
before do
|
||||
# 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',
|
||||
maize: 'https://farm66.staticflickr.com/65535/46739264475_7cb55b2cbb_q.jpg'
|
||||
}.each do |crop_type, photo_url|
|
||||
crop = create(crop_type, creator: someone_else)
|
||||
crop = FactoryBot.create(crop_type, creator: someone_else)
|
||||
crop.reindex
|
||||
owner = create(:interesting_member, login_name: crop_type.to_s.reverse, email: "#{crop.name}@example.com")
|
||||
planting = create(:planting, crop:, owner:, garden: owner.gardens.first)
|
||||
photo = create(:photo, owner:,
|
||||
owner = FactoryBot.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)
|
||||
photo = FactoryBot.create(:photo, owner:,
|
||||
thumbnail_url: "#{photo_url}_q.jpg", fullsize_url: "#{photo_url}_z.jpg")
|
||||
planting.photos << photo
|
||||
|
||||
harvest = create(:harvest, crop:, owner:, plant_part:)
|
||||
harvest = FactoryBot.create(:harvest, crop:, owner:, plant_part:)
|
||||
harvest.photos << photo
|
||||
create(:planting, crop: tomato,
|
||||
FactoryBot.create(:planting, crop: tomato,
|
||||
planted_at: 1.year.ago, finished_at: 2.months.ago,
|
||||
sunniness: 'sun', planted_from: 'seed')
|
||||
end
|
||||
|
||||
create(:seed, owner: member, tradable_to: 'nationally')
|
||||
create(:seed, owner: someone_else, tradable_to: 'nationally')
|
||||
FactoryBot.create(:seed, owner: member, tradable_to: 'nationally')
|
||||
FactoryBot.create(:seed, owner: someone_else, tradable_to: 'nationally')
|
||||
end
|
||||
|
||||
after { Timecop.return }
|
||||
@@ -111,16 +111,16 @@ rest of the garden.
|
||||
|
||||
describe 'crops' do
|
||||
it 'loads crops#show' do
|
||||
create(:planting, planted_at: 2.months.ago, sunniness: 'shade', planted_from: 'seedling')
|
||||
FactoryBot.create(:planting, planted_at: 2.months.ago, sunniness: 'shade', planted_from: 'seedling')
|
||||
|
||||
planting = create(:planting, planted_at: 1.year.ago, sunniness: 'sun', planted_from: 'seed', crop: tomato)
|
||||
create(:harvest,
|
||||
crop: tomato,
|
||||
plant_part: create(:plant_part, name: 'berry'),
|
||||
planting:,
|
||||
harvested_at: 1.day.ago)
|
||||
planting = FactoryBot.create(:planting, planted_at: 1.year.ago, sunniness: 'sun', planted_from: 'seed', crop: tomato)
|
||||
FactoryBot.create(:harvest,
|
||||
crop: tomato,
|
||||
plant_part: FactoryBot.create(:plant_part, name: 'berry'),
|
||||
planting:,
|
||||
harvested_at: 1.day.ago)
|
||||
|
||||
post = create(:post, subject: 'tomatoes are delicious')
|
||||
post = FactoryBot.create(:post, subject: 'tomatoes are delicious')
|
||||
tomato.posts << post
|
||||
|
||||
visit crop_path(tomato)
|
||||
@@ -141,7 +141,7 @@ rest of the garden.
|
||||
end
|
||||
|
||||
it 'load another member plantings#show' do
|
||||
planting = create(:planting, crop: tomato, owner: someone_else, garden: someone_else.gardens.first)
|
||||
planting = FactoryBot.create(:planting, crop: tomato, owner: someone_else, garden: someone_else.gardens.first)
|
||||
visit planting_path(planting)
|
||||
page.percy_snapshot(page, name: "#{prefix}/plantings#show")
|
||||
end
|
||||
@@ -155,14 +155,14 @@ rest of the garden.
|
||||
|
||||
it 'gardens#show' do
|
||||
# a garden
|
||||
garden = create(:garden, name: 'paradise', owner: member)
|
||||
garden = FactoryBot.create(:garden, name: 'paradise', owner: member)
|
||||
# with some lettuce (finished)
|
||||
create(
|
||||
:planting, crop: create(:crop, name: 'lettuce'),
|
||||
FactoryBot.create(
|
||||
:planting, crop: FactoryBot.create(:crop, name: 'lettuce'),
|
||||
garden:, owner: member, finished_at: 2.weeks.ago
|
||||
)
|
||||
# tomato still growing
|
||||
tomato_planting = create(:planting, garden:, owner: member, crop: tomato)
|
||||
tomato_planting = FactoryBot.create(:planting, garden:, owner: member, crop: tomato)
|
||||
tomato_photo.plantings << tomato_planting
|
||||
visit garden_path(garden)
|
||||
page.percy_snapshot(page, name: "#{prefix}/gardens#show")
|
||||
@@ -176,10 +176,10 @@ rest of the garden.
|
||||
end
|
||||
|
||||
it 'loads another members#show' do
|
||||
create(:planting, owner: someone_else, created_at: 30.days.ago, crop: tomato)
|
||||
create(:planting, owner: someone_else, created_at: 24.days.ago, crop: tomato)
|
||||
create(:post, author: someone_else, created_at: 4.days.ago, subject: 'waiting for my tomatoes')
|
||||
create(:harvest, owner: someone_else, created_at: 1.day.ago, crop: tomato)
|
||||
FactoryBot.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)
|
||||
FactoryBot.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)
|
||||
|
||||
visit member_path(someone_else)
|
||||
page.percy_snapshot(page, name: "#{prefix}/members#show")
|
||||
@@ -188,18 +188,18 @@ rest of the garden.
|
||||
|
||||
describe 'posts' do
|
||||
it 'loads posts#show' do
|
||||
create(:comment, commentable: post)
|
||||
create(:comment, commentable: post)
|
||||
FactoryBot.create(:comment, commentable: post)
|
||||
FactoryBot.create(:comment, commentable: post)
|
||||
visit post_path(post)
|
||||
page.percy_snapshot(page, name: "#{prefix}/posts#show")
|
||||
end
|
||||
|
||||
it 'loads posts#index' do
|
||||
Member.all.limit(5).each do |member|
|
||||
create_list(:post, 12, author: member)
|
||||
FactoryBot.create_list(:post, 12, author: member)
|
||||
end
|
||||
Post.all.order(id: :desc).limit(4) do |post|
|
||||
create_list(:comment, rand(1..5), commentable: post)
|
||||
FactoryBot.create_list(:comment, rand(1..5), commentable: post)
|
||||
end
|
||||
visit posts_path
|
||||
page.percy_snapshot(page, name: "#{prefix}/posts#index")
|
||||
@@ -208,7 +208,7 @@ rest of the garden.
|
||||
|
||||
describe 'photos' do
|
||||
it 'loads photos#show' do
|
||||
tomato_photo.plantings << create(:planting, owner: member, crop: tomato)
|
||||
tomato_photo.plantings << FactoryBot.create(:planting, owner: member, crop: tomato)
|
||||
visit photo_path(tomato_photo)
|
||||
page.percy_snapshot(page, name: "#{prefix}/photos#show")
|
||||
end
|
||||
@@ -250,7 +250,7 @@ rest of the garden.
|
||||
it_behaves_like 'visit pages'
|
||||
|
||||
it 'load my plantings#show' do
|
||||
planting = create(:planting, crop: tomato, owner: member, garden: member.gardens.first)
|
||||
planting = FactoryBot.create(:planting, crop: tomato, owner: member, garden: member.gardens.first)
|
||||
visit planting_path(planting)
|
||||
page.percy_snapshot(page, name: "#{prefix}/self/plantings#show")
|
||||
end
|
||||
@@ -261,7 +261,7 @@ rest of the garden.
|
||||
end
|
||||
|
||||
it 'load my gardens#show' do
|
||||
garden = create(:garden, name: 'paradise', owner: member)
|
||||
garden = FactoryBot.create(:garden, name: 'paradise', owner: member)
|
||||
visit garden_path(garden)
|
||||
page.percy_snapshot(page, name: "#{prefix}/self/gardens#show")
|
||||
end
|
||||
@@ -306,19 +306,19 @@ rest of the garden.
|
||||
|
||||
describe '#edit' do
|
||||
it 'loads gardens#edit' do
|
||||
garden = create(:garden, owner: member)
|
||||
garden = FactoryBot.create(:garden, owner: member)
|
||||
visit edit_garden_path(garden)
|
||||
page.percy_snapshot(page, name: "#{prefix}/gardens#edit")
|
||||
end
|
||||
|
||||
it 'loads harvests#edit' do
|
||||
harvest = create(:harvest, owner: member)
|
||||
harvest = FactoryBot.create(:harvest, owner: member)
|
||||
visit edit_harvest_path(harvest)
|
||||
page.percy_snapshot(page, name: "#{prefix}/harvests#edit")
|
||||
end
|
||||
|
||||
it 'loads planting#edit' do
|
||||
planting = create(:planting, owner: member)
|
||||
planting = FactoryBot.create(:planting, owner: member)
|
||||
visit edit_planting_path(planting)
|
||||
page.percy_snapshot(page, name: "#{prefix}/plantings#edit")
|
||||
end
|
||||
@@ -350,7 +350,7 @@ rest of the garden.
|
||||
|
||||
context 'wrangling crops' do
|
||||
include_context 'signed in crop wrangler'
|
||||
let!(:candy) { create(:crop_request, name: 'candy') }
|
||||
let!(:candy) { FactoryBot.create(:crop_request, name: 'candy') }
|
||||
|
||||
it 'crop wrangling page' do
|
||||
visit wrangle_crops_path
|
||||
|
||||
@@ -6,7 +6,7 @@ describe "new photo page" do
|
||||
context "signed in member" do
|
||||
include_context 'signed in member'
|
||||
context "viewing a planting" do
|
||||
let(:planting) { create(:planting, owner: member) }
|
||||
let(:planting) { FactoryBot.create(:planting, owner: member) }
|
||||
|
||||
it "add photo" do
|
||||
visit planting_path(planting)
|
||||
@@ -20,7 +20,7 @@ describe "new photo page" do
|
||||
end
|
||||
|
||||
context "viewing a harvest" do
|
||||
let(:harvest) { create(:harvest, owner: member) }
|
||||
let(:harvest) { FactoryBot.create(:harvest, owner: member) }
|
||||
|
||||
it "add photo" do
|
||||
visit harvest_path(harvest)
|
||||
@@ -33,7 +33,7 @@ describe "new photo page" do
|
||||
end
|
||||
|
||||
context "viewing a garden" do
|
||||
let(:garden) { create(:garden, owner: member) }
|
||||
let(:garden) { FactoryBot.create(:garden, owner: member) }
|
||||
|
||||
it "add photo" do
|
||||
visit garden_path(garden)
|
||||
@@ -46,7 +46,7 @@ describe "new photo page" do
|
||||
end
|
||||
|
||||
describe "viewing a seed" do
|
||||
let(:seed) { create(:seed, owner: member) }
|
||||
let(:seed) { FactoryBot.create(:seed, owner: member) }
|
||||
|
||||
it "add photo" do
|
||||
visit seed_path(seed)
|
||||
|
||||
@@ -30,8 +30,8 @@ describe "Planting reminder email", :js 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
|
||||
# in the database before the email is generated: otherwise, they won't be present in the email.
|
||||
let!(:p1) { create(:predictable_planting, planted_at: 10.days.ago, garden: member.gardens.first, owner: member) }
|
||||
let!(:p2) { create(:predictable_planting, planted_at: 30.days.ago, garden: member.gardens.first, owner: member) }
|
||||
let!(:p1) { FactoryBot.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) }
|
||||
|
||||
describe "lists plantings" do
|
||||
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
|
||||
# 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.
|
||||
let!(:p1) { create(:predictable_planting, garden: member.gardens.first, owner: member, planted_at: 20.days.ago) }
|
||||
let!(:p2) { create(:predictable_planting, garden: member.gardens.first, owner: member) }
|
||||
let!(:h1) { create(:harvest, owner: member, planting: p1, harvested_at: 1.day.ago) }
|
||||
let!(:h2) { create(:harvest, owner: member, planting: p2, harvested_at: 3.days.ago) }
|
||||
let!(:p1) { FactoryBot.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!(:h1) { FactoryBot.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) }
|
||||
|
||||
describe "lists planting that are ready for harvest" do
|
||||
it { expect(mail).to have_content "Ready to harvest" }
|
||||
|
||||
@@ -4,10 +4,10 @@ require "rails_helper"
|
||||
require 'custom_matchers'
|
||||
|
||||
describe "Planting a crop", :js, :search do
|
||||
let!(:maize) { create(:maize) }
|
||||
let(:garden) { create(:garden, owner: member, name: 'Orchard') }
|
||||
let!(:maize) { FactoryBot.create(:maize) }
|
||||
let(:garden) { FactoryBot.create(:garden, owner: member, name: 'Orchard') }
|
||||
let!(:planting) do
|
||||
create(:planting, garden:, owner: member, planted_at: Date.parse("2013-03-10"))
|
||||
FactoryBot.create(:planting, garden:, owner: member, planted_at: Date.parse("2013-03-10"))
|
||||
end
|
||||
|
||||
before { Planting.reindex }
|
||||
@@ -19,14 +19,14 @@ describe "Planting a crop", :js, :search do
|
||||
it_behaves_like "crop suggest", "planting"
|
||||
|
||||
describe "displays required and optional fields properly" do
|
||||
it { expect(page).to have_css ".required", text: "What did you plant?" }
|
||||
it { expect(page).to have_css ".required", text: "Where did you plant it?" }
|
||||
it { expect(page).to have_css 'input#planting_planted_at' }
|
||||
it { expect(page).to have_css 'input#planting_quantity' }
|
||||
it { expect(page).to have_css 'select#planting_planted_from' }
|
||||
it { expect(page).to have_css 'select#planting_sunniness' }
|
||||
it { expect(page).to have_css 'textarea#planting_description' }
|
||||
it { expect(page).to have_css 'input#planting_finished_at' }
|
||||
it { expect(page).to have_selector ".required", text: "What did you plant?" }
|
||||
it { expect(page).to have_selector ".required", text: "Where did you plant it?" }
|
||||
it { expect(page).to have_selector 'input#planting_planted_at' }
|
||||
it { expect(page).to have_selector 'input#planting_quantity' }
|
||||
it { expect(page).to have_selector 'select#planting_planted_from' }
|
||||
it { expect(page).to have_selector 'select#planting_sunniness' }
|
||||
it { expect(page).to have_selector 'textarea#planting_description' }
|
||||
it { expect(page).to have_selector 'input#planting_finished_at' }
|
||||
end
|
||||
|
||||
describe "Creating a new planting" do
|
||||
@@ -237,7 +237,7 @@ describe "Planting a crop", :js, :search do
|
||||
|
||||
describe "Transplanting a planting" do
|
||||
it "allows transplanting to another garden" do
|
||||
other_garden = create(:garden, owner: member, name: 'Backyard')
|
||||
other_garden = FactoryBot.create(:garden, owner: member, name: 'Backyard')
|
||||
visit planting_path(planting)
|
||||
click_link 'Actions'
|
||||
select other_garden.name, from: 'Transplant to:'
|
||||
|
||||
@@ -4,9 +4,9 @@ require "rails_helper"
|
||||
require 'custom_matchers'
|
||||
describe "Display a planting", :js do
|
||||
describe 'planting perennial' do
|
||||
let(:garden) { create(:garden, location: 'Edinburgh') }
|
||||
let(:crop) { create(:crop, name: 'feijoa', perennial: true) }
|
||||
let(:planting) { create(:planting, crop:, garden:, owner: garden.owner) }
|
||||
let(:garden) { FactoryBot.create(:garden, location: 'Edinburgh') }
|
||||
let(:crop) { FactoryBot.create(:crop, name: 'feijoa', perennial: true) }
|
||||
let(:planting) { FactoryBot.create(:planting, crop:, garden:, owner: garden.owner) }
|
||||
|
||||
describe 'no harvest to predict from' do
|
||||
before { visit planting_path(planting) }
|
||||
@@ -17,9 +17,9 @@ describe "Display a planting", :js do
|
||||
|
||||
describe 'harvests used to predict' do
|
||||
before do
|
||||
create(:harvest, planting:, crop:, harvested_at: '1 May 2019')
|
||||
create(:harvest, planting:, crop:, harvested_at: '18 June 2019')
|
||||
create_list(:harvest, 4, planting:, crop:, harvested_at: '18 August 2019')
|
||||
FactoryBot.create(:harvest, planting:, crop:, harvested_at: '1 May 2019')
|
||||
FactoryBot.create(:harvest, planting:, crop:, harvested_at: '18 June 2019')
|
||||
FactoryBot.create_list(:harvest, 4, planting:, crop:, harvested_at: '18 August 2019')
|
||||
end
|
||||
|
||||
before { visit planting_path(planting) }
|
||||
@@ -36,22 +36,22 @@ describe "Display a planting", :js do
|
||||
|
||||
before do
|
||||
# Near by planting with harvests
|
||||
nearby_garden = create(:garden, location: 'Greenwich, UK')
|
||||
nearby_planting = create(:planting, crop:,
|
||||
nearby_garden = FactoryBot.create(:garden, location: 'Greenwich, UK')
|
||||
nearby_planting = FactoryBot.create(:planting, crop:,
|
||||
garden: nearby_garden, owner: nearby_garden.owner, planted_at: '1 January 2000')
|
||||
create(:harvest, planting: nearby_planting, crop:,
|
||||
FactoryBot.create(:harvest, planting: nearby_planting, crop:,
|
||||
harvested_at: '1 May 2019')
|
||||
create(:harvest, planting: nearby_planting, crop:,
|
||||
FactoryBot.create(:harvest, planting: nearby_planting, crop:,
|
||||
harvested_at: '18 June 2019')
|
||||
create_list(:harvest, 4, planting: nearby_planting, crop:,
|
||||
FactoryBot.create_list(:harvest, 4, planting: nearby_planting, crop:,
|
||||
harvested_at: '18 August 2008')
|
||||
|
||||
# far away planting harvests
|
||||
faraway_garden = create(:garden, location: 'Amundsen-Scott Base, Antarctica')
|
||||
faraway_planting = create(:planting, garden: faraway_garden, crop:,
|
||||
faraway_garden = FactoryBot.create(:garden, location: 'Amundsen-Scott Base, Antarctica')
|
||||
faraway_planting = FactoryBot.create(:planting, garden: faraway_garden, crop:,
|
||||
owner: faraway_garden.owner, planted_at: '16 May 2001')
|
||||
|
||||
create_list(:harvest, 4, planting: faraway_planting, crop:,
|
||||
FactoryBot.create_list(:harvest, 4, planting: faraway_planting, crop:,
|
||||
harvested_at: '18 December 2006')
|
||||
end
|
||||
|
||||
|
||||
@@ -8,25 +8,25 @@ describe "Display a planting", :js do
|
||||
before { visit planting_path(planting) }
|
||||
|
||||
context 'Perennial planted long ago' do
|
||||
let(:planting) { create(:perennial_planting) }
|
||||
let(:planting) { FactoryBot.create(:perennial_planting) }
|
||||
|
||||
it { expect(page).to have_text 'Perennial' }
|
||||
end
|
||||
|
||||
context 'Perennial finished' do
|
||||
let(:planting) { create(:perennial_planting, planted_at: 6.years.ago, finished: true, finished_at: 1.year.ago) }
|
||||
let(:planting) { FactoryBot.create(:perennial_planting, planted_at: 6.years.ago, finished: true, finished_at: 1.year.ago) }
|
||||
|
||||
it { expect(page).to have_text 'Perennial' }
|
||||
end
|
||||
|
||||
context 'Annual no predictions' do
|
||||
let(:planting) { create(:annual_planting) }
|
||||
let(:planting) { FactoryBot.create(:annual_planting) }
|
||||
|
||||
it { expect(page).to have_no_text 'Finish expected' }
|
||||
end
|
||||
|
||||
context 'Annual with predicted finish' do
|
||||
let(:planting) { create(:predictable_planting, planted_at: 2.weeks.ago) }
|
||||
let(:planting) { FactoryBot.create(:predictable_planting, planted_at: 2.weeks.ago) }
|
||||
|
||||
it { expect(page).to have_text '28%' }
|
||||
it { expect(page).to have_text '14/50 days' }
|
||||
@@ -35,39 +35,39 @@ describe "Display a planting", :js do
|
||||
end
|
||||
|
||||
context 'Annual finished' do
|
||||
let(:planting) { create(:annual_planting, planted_at: 100.days.ago, finished: true, finished_at: 1.day.ago) }
|
||||
let(:planting) { FactoryBot.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)}" }
|
||||
end
|
||||
|
||||
context 'Planting with harvests' do
|
||||
let(:planting) { create(:harvest_with_planting).planting }
|
||||
let(:planting) { FactoryBot.create(:harvest_with_planting).planting }
|
||||
|
||||
it { expect(page).to have_text 'Harvest started' }
|
||||
end
|
||||
|
||||
context 'Planting with harvest predictable' do
|
||||
let(:planting) do
|
||||
crop = create(:annual_crop)
|
||||
crop = FactoryBot.create(:annual_crop)
|
||||
# 50 days to harvest
|
||||
create(:harvest, harvested_at: 150.days.ago, crop:,
|
||||
planting: create(:planting, planted_at: 200.days.ago, crop:))
|
||||
FactoryBot.create(:harvest, harvested_at: 150.days.ago, crop:,
|
||||
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:))
|
||||
# 20 days to harvest
|
||||
create(:harvest, harvested_at: 180.days.ago, crop:,
|
||||
planting: create(:planting, planted_at: 200.days.ago, crop:))
|
||||
FactoryBot.create(:harvest, harvested_at: 180.days.ago, crop:,
|
||||
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:))
|
||||
# 10 days to harvest
|
||||
create(:harvest, harvested_at: 190.days.ago, crop:,
|
||||
planting: create(:planting, planted_at: 200.days.ago, crop:))
|
||||
FactoryBot.create(:harvest, harvested_at: 190.days.ago, crop:,
|
||||
planting: FactoryBot.create(:planting, planted_at: 200.days.ago, crop:))
|
||||
crop.update_medians
|
||||
|
||||
create(:annual_planting, planted_at: 200.days.ago, crop:)
|
||||
FactoryBot.create(:annual_planting, planted_at: 200.days.ago, crop:)
|
||||
end
|
||||
|
||||
it { expect(page).to have_text 'First harvest expected' }
|
||||
end
|
||||
|
||||
context 'with quantity' do
|
||||
let(:planting) { create(:planting, quantity: 100) }
|
||||
let(:planting) { FactoryBot.create(:planting, quantity: 100) }
|
||||
|
||||
it { expect(find('.plantingfact--quantity')).to have_text '100' }
|
||||
end
|
||||
@@ -78,8 +78,8 @@ describe "Display a planting", :js do
|
||||
before { visit planting_path(planting) }
|
||||
|
||||
context 'with matching seeds' do
|
||||
let(:seed) { create(:seed, saved_at: 1.month.ago, owner: member) }
|
||||
let(:planting) { create(:planting, planted_at: 1.day.ago, crop: seed.crop, owner: member) }
|
||||
let(:seed) { FactoryBot.create(:seed, saved_at: 1.month.ago, owner: member) }
|
||||
let(:planting) { FactoryBot.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? ' }
|
||||
|
||||
|
||||
@@ -15,16 +15,16 @@ describe "Seeds", :js, :search 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.
|
||||
# Modern browsers enforce the required behaviour better than us doing it ourselves.
|
||||
it { expect(page).to have_css "label", text: "Crop" }
|
||||
it { expect(page).to have_css 'input#seed_quantity' }
|
||||
it { expect(page).to have_css 'input#seed_plant_before' }
|
||||
it { expect(page).to have_css 'input#seed_days_until_maturity_min' }
|
||||
it { expect(page).to have_css 'input#seed_days_until_maturity_max' }
|
||||
it { expect(page).to have_css 'label', text: 'Organic?' }
|
||||
it { expect(page).to have_css 'label', text: 'GMO?' }
|
||||
it { expect(page).to have_css 'label', text: 'Heirloom?' }
|
||||
it { expect(page).to have_css 'textarea#seed_description' }
|
||||
it { expect(page).to have_css 'label', text: 'Will trade' }
|
||||
it { expect(page).to have_selector "label", text: "Crop" }
|
||||
it { expect(page).to have_selector 'input#seed_quantity' }
|
||||
it { expect(page).to have_selector 'input#seed_plant_before' }
|
||||
it { expect(page).to have_selector 'input#seed_days_until_maturity_min' }
|
||||
it { expect(page).to have_selector 'input#seed_days_until_maturity_max' }
|
||||
it { expect(page).to have_selector 'label', text: 'Organic?' }
|
||||
it { expect(page).to have_selector 'label', text: 'GMO?' }
|
||||
it { expect(page).to have_selector 'label', text: 'Heirloom?' }
|
||||
it { expect(page).to have_selector 'textarea#seed_description' }
|
||||
it { expect(page).to have_selector 'label', text: 'Will trade' }
|
||||
end
|
||||
|
||||
describe "Adding a new seed", :js do
|
||||
|
||||
@@ -55,7 +55,7 @@ describe "seeds", :js do
|
||||
end
|
||||
|
||||
describe "delete seeds" do
|
||||
let(:seed) { create(:seed, owner: member) }
|
||||
let(:seed) { FactoryBot.create(:seed, owner: member) }
|
||||
|
||||
before do
|
||||
visit seed_path(seed)
|
||||
@@ -72,25 +72,25 @@ describe "seeds", :js do
|
||||
before { visit seed_path(seed) }
|
||||
|
||||
describe "view seeds with max and min days until maturity" do
|
||||
let(:seed) { create(:seed, days_until_maturity_min: 5, days_until_maturity_max: 7) }
|
||||
let(:seed) { FactoryBot.create(:seed, days_until_maturity_min: 5, days_until_maturity_max: 7) }
|
||||
|
||||
it { expect(find('.seedfacts--maturity')).to have_content("5–7") }
|
||||
end
|
||||
|
||||
describe "view seeds with only max days until maturity" do
|
||||
let(:seed) { create(:seed, days_until_maturity_max: 7) }
|
||||
let(:seed) { FactoryBot.create(:seed, days_until_maturity_max: 7) }
|
||||
|
||||
it { expect(find('.seedfacts--maturity')).to have_content("7") }
|
||||
end
|
||||
|
||||
describe "view seeds with only min days until maturity" do
|
||||
let(:seed) { create(:seed, days_until_maturity_min: 5) }
|
||||
let(:seed) { FactoryBot.create(:seed, days_until_maturity_min: 5) }
|
||||
|
||||
it { expect(find('.seedfacts--maturity')).to have_content("5") }
|
||||
end
|
||||
|
||||
describe "view seeds with neither max nor min days until maturity" do
|
||||
let(:seed) { create(:seed) }
|
||||
let(:seed) { FactoryBot.create(:seed) }
|
||||
|
||||
it { expect(find('.seedfacts--maturity')).to have_content "unknown" }
|
||||
end
|
||||
|
||||
@@ -10,8 +10,8 @@ describe "Seeds", :js do
|
||||
include_context 'signed in member'
|
||||
before { visit seed_path(seed) }
|
||||
|
||||
let(:member) { create(:member) }
|
||||
let!(:seed) { create(:seed, owner: member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
let!(:seed) { FactoryBot.create(:seed, owner: member) }
|
||||
|
||||
it {
|
||||
click_on "Actions"
|
||||
@@ -28,7 +28,7 @@ describe "Seeds", :js do
|
||||
visit seed_path(seed)
|
||||
end
|
||||
|
||||
let!(:photo) { create(:photo, title: 'hello photo', owner: seed.owner) }
|
||||
let!(:photo) { FactoryBot.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("//a[contains(@href,'#{photo_path(photo)}')]") }
|
||||
@@ -41,7 +41,7 @@ describe "Seeds", :js do
|
||||
visit seed_path(seed)
|
||||
end
|
||||
|
||||
let!(:photos) { create_list(:photo, 10 * 5, owner: seed.owner) }
|
||||
let!(:photos) { FactoryBot.create_list(:photo, 10 * 5, owner: seed.owner) }
|
||||
let(:newest_photo) { seed.photos.order(created_at: :desc, id: :desc).first }
|
||||
let(:oldest_photo) { seed.photos.order(created_at: :desc, id: :desc).last }
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ shared_examples "crop suggest" do |resource|
|
||||
let!(:roma) { create(:roma) }
|
||||
|
||||
it "placeholder text in crop auto suggest field" do
|
||||
expect(page).to have_css("input[placeholder='e.g. lettuce']")
|
||||
expect(page).to have_selector("input[placeholder='e.g. lettuce']")
|
||||
end
|
||||
|
||||
it "typing in the crop name displays suggestions" do
|
||||
@@ -41,7 +41,7 @@ shared_examples "crop suggest" do |resource|
|
||||
|
||||
select_from_autocomplete("pear")
|
||||
|
||||
expect(page).to have_css("input##{resource}_crop_id[value='#{pear.id}']", visible: false)
|
||||
expect(page).to have_selector("input##{resource}_crop_id[value='#{pear.id}']", visible: false)
|
||||
end
|
||||
|
||||
it "Typing and pausing does not affect input" do
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe "signin" do
|
||||
let(:member) { create(:member) }
|
||||
let(:recipient) { create(:member) }
|
||||
let(:wrangler) { create(:crop_wrangling_member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
let(:recipient) { FactoryBot.create(:member) }
|
||||
let(:wrangler) { FactoryBot.create(:crop_wrangling_member) }
|
||||
|
||||
before do
|
||||
crop = create(:tomato)
|
||||
crop = FactoryBot.create(:tomato)
|
||||
crop.reindex
|
||||
end
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ describe "signout" do
|
||||
end
|
||||
|
||||
it 'photos' do
|
||||
garden = create(:garden, owner: member)
|
||||
garden = FactoryBot.create(:garden, owner: member)
|
||||
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_http_status(200)
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe "timeline", :js do
|
||||
let(:member) { create(:member) }
|
||||
let(:friend1) { create(:member) }
|
||||
let(:friend2) { create(:member) }
|
||||
let(:member) { FactoryBot.create(:member) }
|
||||
let(:friend1) { FactoryBot.create(:member) }
|
||||
let(:friend2) { FactoryBot.create(:member) }
|
||||
|
||||
before do
|
||||
member.followed << friend1
|
||||
@@ -13,14 +13,14 @@ describe "timeline", :js do
|
||||
end
|
||||
|
||||
describe 'visit timeline' do
|
||||
let!(:friend_planting) { create(:planting, owner: friend1, planted_at: 1.day.ago) }
|
||||
let!(:friend_harvest) { create(:planting, owner: friend2, planted_at: 3.years.ago) }
|
||||
let!(:finished_planting) { create(:finished_planting, owner: friend1) }
|
||||
let!(:no_planted_at_planting) { create(:planting, owner: friend2, planted_at: nil) }
|
||||
let!(:friend_photo) { create(:photo, owner: friend1) }
|
||||
let!(:friend_post) { create(:post, author: friend2) }
|
||||
let!(:liked_post) { create(:like, likeable: friend_photo, member: friend2) }
|
||||
let!(:liked_photo) { create(:like, likeable: friend_post, member: friend1) }
|
||||
let!(:friend_planting) { FactoryBot.create(:planting, owner: friend1, planted_at: 1.day.ago) }
|
||||
let!(:friend_harvest) { FactoryBot.create(:planting, owner: friend2, planted_at: 3.years.ago) }
|
||||
let!(:finished_planting) { FactoryBot.create(:finished_planting, owner: friend1) }
|
||||
let!(:no_planted_at_planting) { FactoryBot.create(:planting, owner: friend2, planted_at: nil) }
|
||||
let!(:friend_photo) { FactoryBot.create(:photo, owner: friend1) }
|
||||
let!(:friend_post) { FactoryBot.create(:post, author: friend2) }
|
||||
let!(:liked_post) { FactoryBot.create(:like, likeable: friend_photo, member: friend2) }
|
||||
let!(:liked_photo) { FactoryBot.create(:like, likeable: friend_post, member: friend1) }
|
||||
|
||||
before do
|
||||
login_as(member)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user