mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-10-30 18:58:39 -04:00
191 lines
7.9 KiB
Ruby
191 lines
7.9 KiB
Ruby
# 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
|