Files
growstuff/spec/features/neighbours_spec.rb
T

191 lines
7.9 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# frozen_string_literal: true
require 'rails_helper'
describe 'My friends and neighbours' do
let(:member) { create_located_member('Wellington, NZ', -41.29, 174.78) }
before do
Rails.cache.clear
login_as member
end
it 'is not for visitors' do
logout
visit neighbours_path
expect(page).to have_current_path(new_member_session_path)
end
it 'shows what the people they follow and the ones nearby have been doing' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
create(:planting, owner: friend, garden: friend.gardens.first, planted_at: Time.zone.today)
neighbour = create_located_member('Miramar, Wellington', -41.3, 174.8, login_name: 'nextdoor')
create(:harvest, owner: neighbour, harvested_at: Time.zone.today)
visit neighbours_path
expect(page).to have_css('h2', text: 'Latest from your friends and neighbours')
expect(page).to have_css('article', text: /friendly.*following.*Planted/m)
expect(page).to have_css('article', text: /nextdoor.*near you.*Harvested/m)
end
it 'shows a friend transplanting a tomato into the big garden' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
tomato = create(:crop, name: 'tomato')
planting = create(:planting, owner: friend, garden: friend.gardens.first, crop: tomato, planted_at: 1.week.ago)
planting.transplant_to(create(:garden, owner: friend, name: 'Big garden'), on: Time.zone.today)
visit neighbours_path
expect(page).to have_css('article', text: /friendly.*Transplanted tomato into Big garden/m)
end
it 'says planted out when the planting came from the nursery' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
nursery = friend.gardens.first
nursery.update!(nursery: true)
planting = create(:planting, owner: friend, garden: nursery, crop: create(:crop, name: 'tomato'), planted_at: 1.week.ago)
planting.transplant_to(create(:garden, owner: friend, name: 'The Deck'), on: Time.zone.today)
visit neighbours_path
expect(page).to have_css('article', text: /friendly.*Planted out tomato into The Deck/m)
end
it 'lists what a friend harvested in one sentence' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
%w(tomato basil).each do |name|
create(:harvest, owner: friend, crop: create(:crop, name:), harvested_at: Time.zone.today, quantity: nil, weight_quantity: nil)
end
visit neighbours_path
expect(page).to have_css('article p', text: /Harvested (tomato and basil|basil and tomato)/)
end
it 'says a crop once when it was harvested more than once' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
tomato = create(:crop, name: 'tomato')
2.times { create(:harvest, owner: friend, crop: tomato, harvested_at: Time.zone.today, quantity: nil, weight_quantity: nil) }
visit neighbours_path
expect(page).to have_css('article p', text: 'Harvested tomato ×2')
end
it 'lists three things with no comma before the last' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
%w(basil rocket tomato).each do |name|
create(:harvest, owner: friend, crop: create(:crop, name:), harvested_at: Time.zone.today, quantity: nil, weight_quantity: nil)
end
visit neighbours_path
expect(page).to have_css('article p', text: /Harvested \w+, \w+ and \w+\z/)
end
it 'says how much a friend harvested when they said' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
create(:harvest, owner: friend, crop: create(:crop, name: 'tomato'), harvested_at: Time.zone.today,
quantity: 3, unit: 'bunch', weight_quantity: 2, weight_unit: 'kg')
visit neighbours_path
expect(page).to have_css('article p', text: /Harvested tomato \(3 bunches, weighing 2 kg\)/)
end
it 'shows a friend finishing a planting' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
planting = create(:planting, owner: friend, garden: friend.gardens.first, crop: create(:crop, name: 'tomato'), planted_at: 1.month.ago)
planting.update!(finished: true, finished_at: Time.zone.today)
visit neighbours_path
expect(page).to have_css('article', text: /friendly.*Finished growing tomato/m)
end
it 'shows a friend finishing with a packet of seeds' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
create(:seed, owner: friend, crop: create(:crop, name: 'tomato'), finished: true, finished_at: Time.zone.today)
visit neighbours_path
expect(page).to have_css('article', text: /friendly.*Finished with tomato seeds/m)
end
it 'shows a friend planning a job' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
create(:job, owner: friend, name: 'Weed the beans', due_date: Time.zone.today + 1.month)
due = (Time.zone.today + 1.month).strftime('%-d %b')
visit neighbours_path
expect(page).to have_css('article', text: /friendly.*Planned a job, Weed the beans \(for #{due}\)/m)
end
it 'shows a friend finishing a job' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
create(:job, owner: friend, name: 'Net the berries', finished: true)
visit neighbours_path
expect(page).to have_css('article', text: /friendly.*Finished a job, Net the berries/m)
end
it 'shows only their own job under Me' do
friend = create(:member, login_name: 'friendly')
member.follows.create!(followed: friend)
create(:planting, owner: friend, garden: friend.gardens.first, planted_at: Time.zone.today)
create(:harvest, owner: member, harvested_at: Time.zone.today)
visit neighbours_path(scope: 'me')
expect(page).to have_css('article', text: /Harvested/).and have_no_css('article', text: /friendly/)
end
it 'marks where the season changes' do
create(:harvest, owner: member, harvested_at: Date.new(2026, 10, 20))
create(:harvest, owner: member, harvested_at: Date.new(2026, 8, 20))
visit neighbours_path(scope: 'me')
expect(page).to have_css('h3.neighbours-season', text: 'Spring 2026').and have_css('h3.neighbours-season', text: 'Winter 2026')
end
it 'names the season in the other hemisphere too' do
friend = create_located_member('Oslo', 59.9, 10.7, login_name: 'norwegian')
member.follows.create!(followed: friend)
create(:harvest, owner: friend, harvested_at: Date.new(2026, 10, 20))
visit neighbours_path
expect(page).to have_css('h3.neighbours-season', text: 'Spring 2026 · Autumn in the northern hemisphere')
end
it 'stops suggesting someone who is dismissed' do
crop = create(:crop)
create(:planting, owner: member, garden: member.gardens.first, crop:)
other = create(:member, login_name: 'sameplants')
create(:planting, owner: other, garden: other.gardens.first, crop:)
visit neighbours_path
expect(page).to have_css('h2', text: 'Who to follow')
click_button 'Stop suggesting sameplants'
expect(page).to have_no_css('h2', text: 'Who to follow')
end
it 'follows someone who is suggested' do
crop = create(:crop)
create(:planting, owner: member, garden: member.gardens.first, crop:)
other = create(:member, login_name: 'sameplants')
create(:planting, owner: other, garden: other.gardens.first, crop:)
visit neighbours_path
click_button 'Follow'
page.document.synchronize { raise Capybara::ExpectationNotMet, 'not followed yet' unless member.followed.reload.include?(other) }
end
it 'says so when they have not said where they live' do
member.update!(location: '', latitude: nil, longitude: nil)
visit neighbours_path
expect(page).to have_link('Add where you live')
end
end