mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-05-26 09:50:08 -04:00
Compare commits
65 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
494dd1d658 | ||
|
|
a3a88c48de | ||
|
|
705240014a | ||
|
|
78aa049502 | ||
|
|
97c7277a73 | ||
|
|
0e0af44d9f | ||
|
|
45af8d5f4f | ||
|
|
a1ee822690 | ||
|
|
b6e61eba7a | ||
|
|
b356d86931 | ||
|
|
34f91c2189 | ||
|
|
faf3f60e78 | ||
|
|
e3113fd53d | ||
|
|
68768c4d6a | ||
|
|
da7fec5e0b | ||
|
|
191c8e4e9d | ||
|
|
edc763cd8c | ||
|
|
62eaa07862 | ||
|
|
f26420c380 | ||
|
|
6de13b7327 | ||
|
|
310f631f40 | ||
|
|
bec59aba43 | ||
|
|
c86902967d | ||
|
|
361e3df692 | ||
|
|
ce18bef892 | ||
|
|
ac2b0d04ea | ||
|
|
9d0b48b84c | ||
|
|
d8f41b5ca0 | ||
|
|
b5fbfaf515 | ||
|
|
ce9a71cdad | ||
|
|
42a10bcd80 | ||
|
|
33656a4104 | ||
|
|
ca200c1f30 | ||
|
|
ccd352d699 | ||
|
|
bd396dabfe | ||
|
|
1279dd63bc | ||
|
|
8d681dd90a | ||
|
|
dfd0e1dbf5 | ||
|
|
0d555542c2 | ||
|
|
99a69cd492 | ||
|
|
e8e9aa23b2 | ||
|
|
2fafc6f3e4 | ||
|
|
6b1714eb05 | ||
|
|
8e5c52e85e | ||
|
|
c749f4a813 | ||
|
|
5ed5f9ec7e | ||
|
|
f4658df208 | ||
|
|
e21b95a353 | ||
|
|
19205cb6a8 | ||
|
|
17521cde17 | ||
|
|
5f7d48c633 | ||
|
|
94bb3bf6bb | ||
|
|
c9aacd0110 | ||
|
|
ca5f14bb37 | ||
|
|
43da004ccb | ||
|
|
2704fcf515 | ||
|
|
1af19335d7 | ||
|
|
4d33c32866 | ||
|
|
01333bf965 | ||
|
|
a145abff56 | ||
|
|
9732553d3b | ||
|
|
9142613b6b | ||
|
|
7132c95b61 | ||
|
|
8f76ccf836 | ||
|
|
58e6411bbe |
@@ -6,17 +6,6 @@
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
# versions of RuboCop, may require this file to be generated again.
|
||||
|
||||
Lint/AmbiguousRegexpLiteral:
|
||||
Exclude:
|
||||
- 'spec/controllers/admin/orders_controller_spec.rb'
|
||||
- 'spec/controllers/orders_controller_spec.rb'
|
||||
- 'spec/features/cms_spec.rb'
|
||||
- 'spec/lib/haml/filters/escaped_markdown_spec.rb'
|
||||
- 'spec/lib/haml/filters/growstuff_markdown_spec.rb'
|
||||
- 'spec/models/comment_spec.rb'
|
||||
- 'spec/models/planting_spec.rb'
|
||||
- 'spec/views/members/show.rss.haml_spec.rb'
|
||||
- 'spec/views/posts/show.html.haml_spec.rb'
|
||||
|
||||
Lint/HandleExceptions:
|
||||
Exclude:
|
||||
|
||||
56
Gemfile.lock
56
Gemfile.lock
@@ -55,14 +55,14 @@ GEM
|
||||
public_suffix (>= 2.0.2, < 4.0)
|
||||
arel (6.0.4)
|
||||
ast (2.3.0)
|
||||
autoprefixer-rails (7.1.5)
|
||||
autoprefixer-rails (7.1.6)
|
||||
execjs
|
||||
bcrypt (3.1.11)
|
||||
better_errors (2.2.0)
|
||||
coderay (>= 1.0.0)
|
||||
erubis (>= 2.6.6)
|
||||
rack (>= 0.9.0)
|
||||
binding_of_caller (0.7.2)
|
||||
binding_of_caller (0.7.3)
|
||||
debug_inspector (>= 0.0.1)
|
||||
bluecloth (2.2.0)
|
||||
bonsai-elasticsearch-rails (0.2.0)
|
||||
@@ -276,18 +276,18 @@ GEM
|
||||
sprockets-rails
|
||||
json (2.1.0)
|
||||
jwt (1.5.6)
|
||||
kaminari (1.1.0)
|
||||
kaminari (1.1.1)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.1.0)
|
||||
kaminari-activerecord (= 1.1.0)
|
||||
kaminari-core (= 1.1.0)
|
||||
kaminari-actionview (1.1.0)
|
||||
kaminari-actionview (= 1.1.1)
|
||||
kaminari-activerecord (= 1.1.1)
|
||||
kaminari-core (= 1.1.1)
|
||||
kaminari-actionview (1.1.1)
|
||||
actionview
|
||||
kaminari-core (= 1.1.0)
|
||||
kaminari-activerecord (1.1.0)
|
||||
kaminari-core (= 1.1.1)
|
||||
kaminari-activerecord (1.1.1)
|
||||
activerecord
|
||||
kaminari-core (= 1.1.0)
|
||||
kaminari-core (1.1.0)
|
||||
kaminari-core (= 1.1.1)
|
||||
kaminari-core (1.1.1)
|
||||
kgio (2.11.0)
|
||||
kramdown (1.15.0)
|
||||
launchy (2.4.3)
|
||||
@@ -372,7 +372,7 @@ GEM
|
||||
cliver (~> 0.3.1)
|
||||
websocket-driver (>= 0.2.0)
|
||||
powerpack (0.1.1)
|
||||
pry (0.11.1)
|
||||
pry (0.11.2)
|
||||
coderay (~> 1.1.0)
|
||||
method_source (~> 0.9.0)
|
||||
public_suffix (3.0.0)
|
||||
@@ -425,31 +425,31 @@ GEM
|
||||
responders (2.4.0)
|
||||
actionpack (>= 4.2.0, < 5.3)
|
||||
railties (>= 4.2.0, < 5.3)
|
||||
rspec (3.6.0)
|
||||
rspec-core (~> 3.6.0)
|
||||
rspec-expectations (~> 3.6.0)
|
||||
rspec-mocks (~> 3.6.0)
|
||||
rspec (3.7.0)
|
||||
rspec-core (~> 3.7.0)
|
||||
rspec-expectations (~> 3.7.0)
|
||||
rspec-mocks (~> 3.7.0)
|
||||
rspec-activemodel-mocks (1.0.3)
|
||||
activemodel (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
rspec-mocks (>= 2.99, < 4.0)
|
||||
rspec-core (3.6.0)
|
||||
rspec-support (~> 3.6.0)
|
||||
rspec-expectations (3.6.0)
|
||||
rspec-core (3.7.0)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-expectations (3.7.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.6.0)
|
||||
rspec-mocks (3.6.0)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-mocks (3.7.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.6.0)
|
||||
rspec-rails (3.6.1)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-rails (3.7.1)
|
||||
actionpack (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
railties (>= 3.0)
|
||||
rspec-core (~> 3.6.0)
|
||||
rspec-expectations (~> 3.6.0)
|
||||
rspec-mocks (~> 3.6.0)
|
||||
rspec-support (~> 3.6.0)
|
||||
rspec-support (3.6.0)
|
||||
rspec-core (~> 3.7.0)
|
||||
rspec-expectations (~> 3.7.0)
|
||||
rspec-mocks (~> 3.7.0)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-support (3.7.0)
|
||||
rubocop (0.47.1)
|
||||
parser (>= 2.3.3.1, < 3.0)
|
||||
powerpack (~> 0.1)
|
||||
|
||||
@@ -337,3 +337,11 @@ ul.plantings
|
||||
ul.thumbnail-buttons
|
||||
list-style-type: none
|
||||
text-align: right
|
||||
|
||||
|
||||
.hover-wrapper .text
|
||||
position: absolute
|
||||
visibility: hidden
|
||||
|
||||
.hover-wrapper:hover .text
|
||||
visibility: visible
|
||||
|
||||
@@ -64,7 +64,7 @@ class PlantingsController < ApplicationController
|
||||
|
||||
def destroy
|
||||
@planting.destroy
|
||||
respond_with @planting, location: garden
|
||||
respond_with @planting, location: @planting.garden
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -39,7 +39,7 @@ class Crop < ActiveRecord::Base
|
||||
scope :approved, -> { where(approval_status: "approved") }
|
||||
scope :rejected, -> { where(approval_status: "rejected") }
|
||||
|
||||
scope :interesting, -> { approved.has_photos }
|
||||
scope :interesting, -> { approved.has_photos.randomized }
|
||||
scope :has_photos, -> { includes(:photos).where.not(photos: { id: nil }) }
|
||||
|
||||
## Wikipedia urls are only necessary when approving a crop
|
||||
|
||||
23
app/views/gardens/_actions.html.haml
Normal file
23
app/views/gardens/_actions.html.haml
Normal file
@@ -0,0 +1,23 @@
|
||||
- if can?(:edit, garden) || can?(:delete, garden)
|
||||
- if can? :edit, garden
|
||||
- if garden.active
|
||||
= link_to new_planting_path(garden_id: garden.id), class: 'btn btn-primary' do
|
||||
%span.glyphicon.glyphicon-grain{ title: "Plant" }
|
||||
Plant something
|
||||
= link_to "Mark as inactive", garden_path(garden, garden: { active: 0 }),
|
||||
method: :put, class: 'btn btn-default',
|
||||
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
|
||||
- else
|
||||
= link_to "Mark as active", garden_path(garden, garden: { active: 1 }),
|
||||
method: :put,
|
||||
class: 'btn btn-default'
|
||||
= link_to edit_garden_path(garden), class: 'btn btn-default', id: 'edit_garden_link' do
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
|
||||
Edit
|
||||
- if can?(:destroy, garden)
|
||||
= link_to garden,
|
||||
method: :delete,
|
||||
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
|
||||
class: 'btn btn-default', id: 'delete_garden_link' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
Delete
|
||||
25
app/views/gardens/_overview.html.haml
Normal file
25
app/views/gardens/_overview.html.haml
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
.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
|
||||
.row
|
||||
.col-md-12.col-xs-6
|
||||
= render 'gardens/photo', garden: garden
|
||||
.col-md-12.col-xs-6
|
||||
= render 'gardens/actions', garden: garden
|
||||
.col-md-10
|
||||
.row
|
||||
- if garden.plantings.current.size.positive?
|
||||
- garden.plantings.current.includes(:crop).each do |planting|
|
||||
.col-md-2.col-sm-6.col-xs-6
|
||||
.hover-wrapper
|
||||
.text= render 'plantings/actions', planting: planting
|
||||
= render partial: "plantings/thumbnail", locals: { planting: planting }
|
||||
- else
|
||||
no plantings
|
||||
-# .panel-footer
|
||||
3
app/views/gardens/_photo.html.haml
Normal file
3
app/views/gardens/_photo.html.haml
Normal file
@@ -0,0 +1,3 @@
|
||||
= link_to image_tag((garden.default_photo ? garden.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: garden.name, class: 'img-responsive'),
|
||||
garden_path(garden)
|
||||
@@ -6,15 +6,13 @@
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
.row
|
||||
- if @gardens.empty?
|
||||
%p There are no gardens to display.
|
||||
- else
|
||||
- @gardens.each do |garden|
|
||||
.col-md-6
|
||||
= render partial: 'gardens/thumbnail', locals: { garden: garden }
|
||||
|
||||
- if @gardens.empty?
|
||||
%p There are no gardens to display.
|
||||
- else
|
||||
- @gardens.each do |garden|
|
||||
= render 'overview', garden: garden
|
||||
|
||||
.pagination
|
||||
= page_entries_info @gardens
|
||||
= will_paginate @gardens
|
||||
|
||||
|
||||
@@ -11,28 +11,7 @@
|
||||
= tag("meta", property: "og:site_name", content: ENV['GROWSTUFF_SITE_NAME'])
|
||||
.row
|
||||
.col-md-9
|
||||
- if can?(:edit, @garden) || can?(:delete, @garden)
|
||||
%p.btn-group
|
||||
- if can? :edit, @garden
|
||||
- if @garden.active
|
||||
= link_to new_planting_path(garden_id: @garden.id), class: 'btn btn-primary' do
|
||||
%span.glyphicon.glyphicon-grain{ title: "Plant" }
|
||||
Plant something
|
||||
= link_to "Mark as inactive", garden_path(@garden, garden: { active: 0 }),
|
||||
method: :put, class: 'btn btn-default',
|
||||
data: { confirm: 'All plantings associated with this garden will be marked as finished. Are you sure?' }
|
||||
- else
|
||||
= link_to "Mark as active", garden_path(@garden, garden: { active: 1 }),
|
||||
method: :put,
|
||||
class: 'btn btn-default'
|
||||
= link_to edit_garden_path(@garden), class: 'btn btn-default', id: 'edit_garden_link' do
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
|
||||
- if can?(:destroy, @garden)
|
||||
= link_to @garden,
|
||||
method: :delete,
|
||||
data: { confirm: 'All plantings associated with this garden will also be deleted. Are you sure?' },
|
||||
class: 'btn btn-default', id: 'delete_garden_link' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
%p.btn-group= render 'gardens/actions', garden: @garden
|
||||
|
||||
- unless @garden.active
|
||||
.alert.alert-warning
|
||||
@@ -119,4 +98,4 @@
|
||||
.row
|
||||
- @garden.photos.includes(:owner).each do |photo|
|
||||
.col-xs-6
|
||||
= render partial: 'photos/thumbnail', locals: { photo: photo }
|
||||
= render partial: 'photos/thumbnail', locals: { photo: photo }
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
.col-md-4
|
||||
= link_to image_tag((harvest.default_photo ? harvest.default_photo.thumbnail_url : 'placeholder_150.png'),
|
||||
alt: harvest.crop.name, class: 'img'),
|
||||
harvest.crop
|
||||
harvest
|
||||
.col-md-8
|
||||
%dl.dl-horizontal
|
||||
%dt Crop :
|
||||
|
||||
@@ -15,10 +15,13 @@
|
||||
- if can? :read, n
|
||||
%tr
|
||||
%td
|
||||
- if n.read
|
||||
= link_to n.sender, member_path(n.sender)
|
||||
- if n.sender.present?
|
||||
- if n.read
|
||||
= link_to n.sender, member_path(n.sender)
|
||||
- else
|
||||
%strong= link_to n.sender, member_path(n.sender)
|
||||
- else
|
||||
%strong= link_to n.sender, member_path(n.sender)
|
||||
*deleted member*
|
||||
%td
|
||||
- if n.read
|
||||
= link_to n.subject, notification_path(n)
|
||||
|
||||
16
app/views/plantings/_actions.html.haml
Normal file
16
app/views/plantings/_actions.html.haml
Normal file
@@ -0,0 +1,16 @@
|
||||
- if can?(:edit, planting) || can?(:destroy, planting)
|
||||
- if can? :edit, planting
|
||||
= link_to edit_planting_path(planting), class: 'btn btn-default btn-xs' do
|
||||
%span.glyphicon.glyphicon-pencil{ title: "Edit garden" }
|
||||
Edit
|
||||
- if can? :destroy, planting
|
||||
= link_to planting, method: :delete,
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
Delete
|
||||
- unless planting.finished
|
||||
= link_to "Mark as finished", planting_path(planting, planting: { finished: 1 }),
|
||||
method: :put, class: 'btn btn-default btn-xs append-date'
|
||||
- if can? :create, Harvest
|
||||
= link_to 'Harvest', new_planting_harvest_path(planting), class: 'btn btn-default btn-xs'
|
||||
@@ -16,7 +16,7 @@
|
||||
%dt Owner:
|
||||
%dd= link_to planting.owner.login_name, planting.owner
|
||||
%dt Garden:
|
||||
%dd= link_to planting.garden.name, planting.garden
|
||||
%dd= link_to planting.garden&.name, planting.garden
|
||||
%dt Planted on:
|
||||
%dd= planting.planted_at
|
||||
- if planting.quantity
|
||||
@@ -38,7 +38,7 @@
|
||||
= display_days_before_maturity(planting)
|
||||
days
|
||||
|
||||
%p= render partial: 'plantings/planting_progress', locals: { planting: planting }
|
||||
%p= render 'plantings/progress', planting: planting, show_explanation: true
|
||||
|
||||
= link_to 'Details', planting_path(planting),
|
||||
class: 'btn btn-default btn-xs'
|
||||
@@ -58,4 +58,3 @@
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs' do
|
||||
%span.glyphicon.glyphicon-trash{ title: "Delete" }
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
- if !planting.planted?
|
||||
Progress: 0% - not planted yet
|
||||
- elsif planting.finished?
|
||||
Progress: 100%
|
||||
= render partial: "plantings/progress_bar", locals: { status: "success", progress: "100%" }
|
||||
- elsif planting.days_before_maturity.nil?
|
||||
Progress: Not calculated, days before maturity unknown
|
||||
- else
|
||||
Progress: #{planting.percentage_grown}%
|
||||
= render partial: "plantings/progress_bar", locals: { status: "success", progress: "#{planting.percentage_grown}%" }
|
||||
19
app/views/plantings/_progress.html.haml
Normal file
19
app/views/plantings/_progress.html.haml
Normal file
@@ -0,0 +1,19 @@
|
||||
- if !planting.planted?
|
||||
- if show_explanation == true
|
||||
Progress: 0% - not planted yet
|
||||
= render "plantings/progress_bar", status: "not planted", progress: 0
|
||||
|
||||
- elsif planting.finished?
|
||||
- if show_explanation == true
|
||||
Progress: 100%
|
||||
= render "plantings/progress_bar", status: 'finished', progress: 100
|
||||
|
||||
- elsif planting.days_before_maturity.nil?
|
||||
- if show_explanation == true
|
||||
Progress: Not calculated, days before maturity unknown
|
||||
= render "plantings/progress_bar", status: "unknown", progress: nil
|
||||
|
||||
- else
|
||||
- if show_explanation == true
|
||||
Progress: #{planting.percentage_grown}%
|
||||
= render "plantings/progress_bar", status: 'growing', progress: planting.percentage_grown
|
||||
@@ -1,3 +1,11 @@
|
||||
.progress
|
||||
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}" }
|
||||
|
||||
- if progress.nil?
|
||||
= status
|
||||
- else
|
||||
-# haml-lint:disable InlineStyles
|
||||
%div{ class: "progress-bar progress-bar-#{status}", role: "progressbar", style: "width: #{progress}%" }
|
||||
- if progress >= 30
|
||||
#{progress}%
|
||||
- if progress < 30
|
||||
#{progress}%
|
||||
-# haml-lint:enable InlineStyles
|
||||
|
||||
@@ -6,6 +6,5 @@
|
||||
planting
|
||||
.plantinginfo
|
||||
.planting-name
|
||||
= render 'plantings/progress', planting: planting, show_explanation: false
|
||||
= link_to planting.crop.name, planting
|
||||
%small.planting-date
|
||||
= display_finished(planting)
|
||||
|
||||
@@ -48,22 +48,10 @@
|
||||
%dt Finished:
|
||||
%dd= display_finished(@planting)
|
||||
|
||||
%p= render 'plantings/planting_harvest', planting: @planting
|
||||
%p= render 'planting_progress', planting: @planting
|
||||
%p= render 'plantings/harvests', planting: @planting
|
||||
%p= render 'plantings/progress', planting: @planting, show_explanation: true
|
||||
|
||||
- if can?(:edit, @planting) || can?(:destroy, @planting)
|
||||
%p
|
||||
- if can? :edit, @planting
|
||||
= link_to 'Edit', edit_planting_path(@planting), class: 'btn btn-default btn-xs'
|
||||
- unless @planting.finished
|
||||
= link_to "Mark as finished", planting_path(@planting, planting: { finished: 1 }),
|
||||
method: :put, class: 'btn btn-default btn-xs append-date'
|
||||
- if can? :create, Harvest
|
||||
= link_to 'Harvest', new_planting_harvest_path(@planting), class: 'btn btn-default btn-xs'
|
||||
- if can? :destroy, @planting
|
||||
= link_to 'Delete', @planting, method: :delete,
|
||||
data: { confirm: 'Are you sure?' },
|
||||
class: 'btn btn-default btn-xs'
|
||||
= render 'plantings/actions', planting: @planting
|
||||
|
||||
.col-md-6
|
||||
= render partial: "crops/index_card", locals: { crop: @planting.crop }
|
||||
|
||||
@@ -24,7 +24,7 @@ describe Admin::OrdersController do
|
||||
|
||||
it "sets an error message if nothing found" do
|
||||
get :search, search_by: 'order_id', search_text: 'foo'
|
||||
flash[:alert].should match /Couldn't find order with/
|
||||
flash[:alert].should have_text "Couldn't find order with"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -39,7 +39,7 @@ describe OrdersController do
|
||||
order = Order.create!(member_id: member.id)
|
||||
get :checkout, id: order.to_param
|
||||
response.status.should eq 302
|
||||
response.redirect_url.should match /paypal\.com/
|
||||
response.redirect_url.should match(/paypal\.com/)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -21,6 +21,6 @@ feature "cms admin" do
|
||||
scenario "admin members can view CMS admin area" do
|
||||
login_as admin_member
|
||||
visit comfy_admin_cms_path
|
||||
expect(current_path).to match /#{comfy_admin_cms_path}/ # match any CMS admin page
|
||||
expect(current_path).to match(/#{comfy_admin_cms_path}/) # match any CMS admin page
|
||||
end
|
||||
end
|
||||
|
||||
@@ -58,7 +58,7 @@ feature "Planting a crop", js: true do
|
||||
end
|
||||
|
||||
scenario "button on index to edit garden" do
|
||||
first(".panel-title").click_link("edit_garden_glyphicon")
|
||||
first(".garden-info").click_link("Edit")
|
||||
expect(page).to have_content 'Edit garden'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,6 +17,6 @@ describe 'Haml::Filters::Escaped_Markdown' do
|
||||
it 'converts quick crop links' do
|
||||
@crop = FactoryGirl.create(:crop)
|
||||
rendered = Haml::Filters::EscapedMarkdown.render("[#{@crop.name}](crop)")
|
||||
rendered.should match /<a href="/
|
||||
rendered.should match(/<a href="/)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -31,18 +31,18 @@ describe 'Haml::Filters::Growstuff_Markdown' do
|
||||
it 'converts quick crop links' do
|
||||
@crop = FactoryGirl.create(:crop)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link(@crop.name))
|
||||
rendered.should match /#{output_link(@crop)}/
|
||||
expect(rendered).to match(/#{output_link(@crop)}/)
|
||||
end
|
||||
|
||||
it "doesn't convert nonexistent crops" do
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link("not a crop"))
|
||||
rendered.should match /not a crop/
|
||||
expect(rendered).to match(/not a crop/)
|
||||
end
|
||||
|
||||
it "doesn't convert escaped crop links" do
|
||||
@crop = FactoryGirl.create(:crop)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("\\" << input_link(@crop.name))
|
||||
rendered.should match /\[#{@crop.name}\]\(crop\)/
|
||||
expect(rendered).to match(/\[#{@crop.name}\]\(crop\)/)
|
||||
end
|
||||
|
||||
it "handles multiple crop links" do
|
||||
@@ -50,55 +50,55 @@ describe 'Haml::Filters::Growstuff_Markdown' do
|
||||
maize = FactoryGirl.create(:maize)
|
||||
string = "#{input_link(tomato)} #{input_link(maize)}"
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
|
||||
rendered.should match /#{output_link(tomato)} #{output_link(maize)}/
|
||||
expect(rendered).to match(/#{output_link(tomato)} #{output_link(maize)}/)
|
||||
end
|
||||
|
||||
it "converts normal markdown" do
|
||||
string = "**foo**"
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
|
||||
rendered.should match /<strong>foo<\/strong>/
|
||||
expect(rendered).to match(/<strong>foo<\/strong>/)
|
||||
end
|
||||
|
||||
it "finds crops case insensitively" do
|
||||
@crop = FactoryGirl.create(:crop, name: 'tomato')
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_link('ToMaTo'))
|
||||
rendered.should match /#{output_link(@crop, 'ToMaTo')}/
|
||||
expect(rendered).to match(/#{output_link(@crop, 'ToMaTo')}/)
|
||||
end
|
||||
|
||||
it "fixes PT bug #78615258 (Markdown rendering bug with URLs and crops in same text)" do
|
||||
tomato = FactoryGirl.create(:tomato)
|
||||
string = "[test](http://example.com) [tomato](crop)"
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(string)
|
||||
rendered.should match /#{output_link(tomato)}/
|
||||
rendered.should match "<a href=\"http://example.com\">test</a>"
|
||||
expect(rendered).to match(/#{output_link(tomato)}/)
|
||||
expect(rendered).to match "<a href=\"http://example.com\">test</a>"
|
||||
end
|
||||
|
||||
it 'converts quick member links' do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link(@member.login_name))
|
||||
rendered.should match /#{output_member_link(@member)}/
|
||||
expect(rendered).to match(/#{output_member_link(@member)}/)
|
||||
end
|
||||
|
||||
it "doesn't convert nonexistent members" do
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link("not a member"))
|
||||
rendered.should match /not a member/
|
||||
expect(rendered).to include('not a member')
|
||||
end
|
||||
|
||||
it "doesn't convert escaped members" do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("\\" << input_member_link(@member.login_name))
|
||||
rendered.should match /\[#{@member.login_name}\]\(member\)/
|
||||
expect(rendered).to match(/\[#{@member.login_name}\]\(member\)/)
|
||||
end
|
||||
|
||||
it 'converts @ member links' do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member.login_name}! What's up")
|
||||
rendered.should match /#{output_member_link(@member, "@#{@member.login_name}")}/
|
||||
expect(rendered).to match(/#{output_member_link(@member, "@#{@member.login_name}")}/)
|
||||
end
|
||||
|
||||
it "doesn't convert invalid @ members" do
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("@not-a-member")
|
||||
rendered.should match /@not-a-member/
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("@notamember")
|
||||
expect(rendered).to include('@notamember')
|
||||
end
|
||||
|
||||
it "doesn't convert nonexistent @ members" do
|
||||
@@ -106,12 +106,12 @@ describe 'Haml::Filters::Growstuff_Markdown' do
|
||||
@member_name = @member.login_name
|
||||
@member.destroy
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member_name}")
|
||||
rendered.should match /Hey @#{@member_name}/
|
||||
expect(rendered).to include("Hey @#{@member_name}")
|
||||
end
|
||||
|
||||
it "doesn't convert escaped @ members" do
|
||||
@member = FactoryGirl.create(:member)
|
||||
rendered = Haml::Filters::GrowstuffMarkdown.render("Hey \\@#{@member.login_name}! What's up")
|
||||
rendered.should match /Hey @#{@member.login_name}!/
|
||||
expect(rendered).to include("Hey @#{@member.login_name}!")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -27,7 +27,7 @@ describe Comment do
|
||||
@n = Notification.first
|
||||
@n.sender.should eq @c.author
|
||||
@n.recipient.should eq @c.post.author
|
||||
@n.subject.should match /commented on/
|
||||
@n.subject.should include 'commented on'
|
||||
@n.body.should eq @c.body
|
||||
@n.post.should eq @c.post
|
||||
end
|
||||
|
||||
@@ -65,7 +65,7 @@ describe Planting do
|
||||
end
|
||||
|
||||
it "should have a slug" do
|
||||
planting.slug.should match /^member\d+-springfield-community-garden-tomato$/
|
||||
planting.slug.should match(/^member\d+-springfield-community-garden-tomato$/)
|
||||
end
|
||||
|
||||
it 'should sort in reverse creation order' do
|
||||
|
||||
@@ -1,41 +1,28 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe "members/_location" do
|
||||
context "member with location" do
|
||||
before(:each) do
|
||||
@member = FactoryGirl.create(:london_member)
|
||||
render partial: 'members/location', locals: { member: @member }
|
||||
end
|
||||
let(:member) { FactoryGirl.create(:london_member) }
|
||||
|
||||
before(:each) { render partial: 'members/location', locals: { member: member } }
|
||||
|
||||
it 'shows location if available' do
|
||||
rendered.should have_content @member.location
|
||||
expect(rendered).to have_content member.location
|
||||
end
|
||||
|
||||
it "links to the places page" do
|
||||
assert_select "a", href: place_path(@member.location)
|
||||
assert_select "a", href: place_path(member.location)
|
||||
end
|
||||
end
|
||||
|
||||
context "member with no location" do
|
||||
before(:each) do
|
||||
@member = FactoryGirl.create(:member)
|
||||
render partial: 'members/location', locals: { member: @member }
|
||||
member = FactoryGirl.create(:member)
|
||||
render partial: 'members/location', locals: { member: member }
|
||||
end
|
||||
|
||||
it 'shows unknown location' do
|
||||
rendered.should have_content "unknown location"
|
||||
expect(rendered).to have_content "unknown location"
|
||||
end
|
||||
|
||||
it "doesn't link anywhere" do
|
||||
|
||||
@@ -1,26 +1,14 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project.
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe "members/index" do
|
||||
let(:member) { FactoryGirl.create(:london_member) }
|
||||
before(:each) do
|
||||
controller.stub(:current_user) { nil }
|
||||
page = 1
|
||||
per_page = 2
|
||||
total_entries = 2
|
||||
@member = FactoryGirl.create(:london_member)
|
||||
members = WillPaginate::Collection.create(page, per_page, total_entries) do |pager|
|
||||
pager.replace([@member, @member])
|
||||
pager.replace([member, member])
|
||||
end
|
||||
assign(:members, members)
|
||||
render
|
||||
@@ -31,6 +19,6 @@ describe "members/index" do
|
||||
end
|
||||
|
||||
it 'contains member locations' do
|
||||
rendered.should have_content @member.location
|
||||
expect(rendered).to have_content member.location
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project.
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'members/show.rss.haml', type: "view" do
|
||||
@@ -21,21 +9,23 @@ describe 'members/show.rss.haml', type: "view" do
|
||||
render
|
||||
end
|
||||
|
||||
subject { rendered }
|
||||
|
||||
it 'shows RSS feed title' do
|
||||
rendered.should have_content /member\d+'s recent posts/
|
||||
is_expected.to match(/member\d+'s recent posts/)
|
||||
end
|
||||
|
||||
it 'shows content of posts' do
|
||||
rendered.should have_content "This is some text."
|
||||
is_expected.to have_content "This is some text."
|
||||
end
|
||||
|
||||
it 'renders post bodies to HTML and XML-escapes them' do
|
||||
# The variable "rendered" has been entity-replaced and tag-stripped
|
||||
# The literal string output contains "<strong>" etc.
|
||||
rendered.should have_content "<strong>strong</strong>"
|
||||
is_expected.to have_content "<strong>strong</strong>"
|
||||
end
|
||||
|
||||
it 'gives the author in the item title' do
|
||||
rendered.should have_content "#{@post1.subject} by #{@post1.author}"
|
||||
is_expected.to have_content "#{@post1.subject} by #{@post1.author}"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,64 +1,58 @@
|
||||
## DEPRECATION NOTICE: Do not add new tests to this file!
|
||||
##
|
||||
## View and controller tests are deprecated in the Growstuff project.
|
||||
## We no longer write new view and controller tests, but instead write
|
||||
## feature tests (in spec/features) using Capybara (https://github.com/jnicklas/capybara).
|
||||
## These test the full stack, behaving as a browser, and require less complicated setup
|
||||
## to run. Please feel free to delete old view/controller tests as they are reimplemented
|
||||
## in feature tests.
|
||||
##
|
||||
## If you submit a pull request containing new view or controller tests, it will not be
|
||||
## merged.
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe "posts/show" do
|
||||
let(:author) { FactoryGirl.create(:member) }
|
||||
|
||||
before(:each) do
|
||||
controller.stub(:current_user) { nil }
|
||||
@author = FactoryGirl.create(:member)
|
||||
assign(:post, post)
|
||||
end
|
||||
subject { rendered }
|
||||
|
||||
it "renders the post" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:post, author: @author))
|
||||
render
|
||||
# show the name of the member who posted the post
|
||||
rendered.should match(/member\d+/)
|
||||
# Subject goes in title
|
||||
rendered.should match(/This is some text./)
|
||||
# shouldn't show the subject on a single post page
|
||||
# (it appears in the title/h1 via the layout, not via this view)
|
||||
rendered.should_not match(/An Update/)
|
||||
end
|
||||
describe 'render post' do
|
||||
before { render }
|
||||
describe "basic post" do
|
||||
let(:post) { FactoryGirl.create(:post, author: author) }
|
||||
|
||||
it "should parse markdown into html" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:markdown_post, author: @author))
|
||||
render
|
||||
assert_select "strong", "strong"
|
||||
end
|
||||
# show the name of the member who posted the post
|
||||
it { is_expected.to match(/member\d+/) }
|
||||
# Subject goes in title
|
||||
it { is_expected.to have_text('This is some text.') }
|
||||
# shouldn't show the subject on a single post page
|
||||
# (it appears in the title/h1 via the layout, not via this view)
|
||||
it { is_expected.not_to have_text('An Update') }
|
||||
end
|
||||
|
||||
it "shouldn't let html through in body" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:html_post, author: @author))
|
||||
render
|
||||
rendered.should match(/EVIL/)
|
||||
rendered.should_not match(/a href="http:\/\/evil.com"/)
|
||||
end
|
||||
describe "should parse markdown into html" do
|
||||
let(:post) { FactoryGirl.create(:markdown_post, author: author) }
|
||||
it { assert_select "strong", "strong" }
|
||||
end
|
||||
|
||||
it 'has an anchor to the comments' do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:post, author: @author))
|
||||
render
|
||||
assert_select 'a[name=comments]'
|
||||
describe "shouldn't let html through in body" do
|
||||
let(:post) { FactoryGirl.create(:post, author: author, body: '<a href="http://evil.com">EVIL</a>') }
|
||||
it { is_expected.to have_content('EVIL') }
|
||||
it { is_expected.not_to have_link("http://evil.com") }
|
||||
end
|
||||
describe 'script tag in post body' do
|
||||
let(:post) { FactoryGirl.create(:post, author: author, body: "<script>alert('hakker!')</script>") }
|
||||
it { is_expected.not_to have_selector('script') }
|
||||
end
|
||||
describe 'script tag in post title' do
|
||||
let(:post) { FactoryGirl.create(:post, author: author, subject: "<script>alert('hakker!')</script>") }
|
||||
it { is_expected.not_to have_selector('script') }
|
||||
end
|
||||
|
||||
describe 'has an anchor to the comments' do
|
||||
let(:post) { FactoryGirl.create(:post, author: author) }
|
||||
it { is_expected.to have_selector('a[name=comments]') }
|
||||
end
|
||||
end
|
||||
|
||||
context "when there is one comment" do
|
||||
let(:post) { FactoryGirl.create(:html_post, author: author) }
|
||||
let!(:comment) { FactoryGirl.create(:comment, post: post) }
|
||||
before(:each) do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:html_post, author: @author))
|
||||
@comment = FactoryGirl.create(:comment, post: @post)
|
||||
@comments = @post.comments
|
||||
@comments = post.comments
|
||||
render
|
||||
end
|
||||
|
||||
@@ -67,7 +61,7 @@ describe "posts/show" do
|
||||
end
|
||||
|
||||
it "shows comments" do
|
||||
rendered.should have_content @comment.body
|
||||
is_expected.to have_content comment.body
|
||||
end
|
||||
|
||||
it 'has an anchor to the comments' do
|
||||
@@ -76,45 +70,42 @@ describe "posts/show" do
|
||||
end
|
||||
|
||||
context "when there is more than one comment" do
|
||||
let(:post) { FactoryGirl.create(:html_post, author: author) }
|
||||
before(:each) do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:html_post, author: @author))
|
||||
@comment1 = FactoryGirl.create(:comment, post: @post, body: "F1rst!!!",
|
||||
@comment1 = FactoryGirl.create(:comment, post: post, body: "F1rst!!!",
|
||||
created_at: Date.new(2010, 5, 17))
|
||||
@comment3 = FactoryGirl.create(:comment, post: @post, body: "Th1rd!!!",
|
||||
@comment3 = FactoryGirl.create(:comment, post: post, body: "Th1rd!!!",
|
||||
created_at: Date.new(2012, 5, 17))
|
||||
@comment4 = FactoryGirl.create(:comment, post: @post, body: "F0urth!!!")
|
||||
@comment2 = FactoryGirl.create(:comment, post: @post, body: "S3c0nd!!1!",
|
||||
@comment4 = FactoryGirl.create(:comment, post: post, body: "F0urth!!!")
|
||||
@comment2 = FactoryGirl.create(:comment, post: post, body: "S3c0nd!!1!",
|
||||
created_at: Date.new(2011, 5, 17))
|
||||
@comments = @post.comments
|
||||
@comments = post.comments
|
||||
render
|
||||
end
|
||||
|
||||
it "shows the oldest comments first" do
|
||||
rendered.should have_content /#{@comment1.body}.*#{@comment2.body}.*#{@comment3.body}.*#{@comment4.body}/m
|
||||
is_expected.to have_content(/#{@comment1.body}.*#{@comment2.body}.*#{@comment3.body}.*#{@comment4.body}/m)
|
||||
end
|
||||
end
|
||||
|
||||
context "forum post" do
|
||||
let(:post) { FactoryGirl.create(:forum_post, author: author) }
|
||||
before { render }
|
||||
it "shows forum name" do
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:forum_post, author: @author))
|
||||
render
|
||||
rendered.should have_content "in #{@post.forum.name}"
|
||||
is_expected.to have_content "in #{post.forum.name}"
|
||||
end
|
||||
end
|
||||
|
||||
context "signed in" do
|
||||
let(:post) { FactoryGirl.create(:post, author: author) }
|
||||
before(:each) do
|
||||
sign_in @author
|
||||
controller.stub(:current_user) { @author }
|
||||
@post = assign(:post,
|
||||
FactoryGirl.create(:post, author: @author))
|
||||
sign_in author
|
||||
controller.stub(:current_user) { author }
|
||||
render
|
||||
end
|
||||
|
||||
it 'shows a comment button' do
|
||||
assert_select "a", { href: new_comment_path(post_id: @post.id) }, "Comment"
|
||||
is_expected.to have_link "Comment", href: new_comment_path(post_id: post.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user