Compare commits

...

65 Commits

Author SHA1 Message Date
pozorvlak
494dd1d658 Merge pull request #1411 from Growstuff/dev
Release 30
2017-10-25 08:16:42 +01:00
Brenda Wallace
a3a88c48de Randomise the crops on the homepage 2017-10-23 22:09:34 +01:00
Brenda Wallace
705240014a Link harvest thumbnails to harvests
to be consistent with the rest of the site
2017-10-23 11:07:27 +01:00
Brenda Wallace
78aa049502 Fixed comment model spec 2017-10-23 10:44:37 +01:00
Brenda Wallace
97c7277a73 fixed up ambigous regex and use of expect in specs 2017-10-23 10:44:37 +01:00
Brenda Wallace
0e0af44d9f post show specs, use expect syntax, and more tests for js injection 2017-10-23 10:44:37 +01:00
Brenda Wallace
45af8d5f4f Converting to expect syntax 2017-10-23 10:44:37 +01:00
deppbot
a1ee822690 Bundle Update on 2017-10-22 2017-10-23 14:55:15 +13:00
Brenda Wallace
b6e61eba7a Merge branch 'master' into dev-conflict-fix 2017-10-22 11:30:43 +13:00
Brenda Wallace
b356d86931 Allow inline style on the progress bar width 2017-10-21 22:48:37 +01:00
Brenda Wallace
34f91c2189 Wrap garden overview buttons to right of photo on small screens 2017-10-21 22:48:37 +01:00
Brenda Wallace
faf3f60e78 small screen gardens overview 2017-10-21 22:48:37 +01:00
Brenda Wallace
e3113fd53d Re-work gardens#index to show planting progress 2017-10-21 22:48:37 +01:00
Brenda Wallace
68768c4d6a Fixed redirection after planting is deleted 2017-10-21 22:48:37 +01:00
pozorvlak
da7fec5e0b Merge pull request #1405 from Br3nda/fix-1379
Display messages even when member is deleted
2017-10-20 16:10:51 +01:00
Brenda Wallace
191c8e4e9d Display messages even when member is deleted 2017-10-20 23:44:51 +13:00
deppbot
edc763cd8c Bundle Update on 2017-10-19 2017-10-20 23:23:02 +13:00
pozorvlak
62eaa07862 Merge pull request #1401 from Br3nda/fix/codestyle
Another code style fixup
2017-10-18 10:52:38 +01:00
pozorvlak
f26420c380 Merge branch 'dev' into fix/codestyle 2017-10-18 10:41:03 +01:00
pozorvlak
6de13b7327 Merge pull request #1402 from Br3nda/fix/heroku-deploys
Update heroku maintenance script - maintenance is just an attribute now
2017-10-18 10:34:33 +01:00
Brenda Wallace
310f631f40 Ignore one Style/ClassAndModuleChildren 2017-10-18 20:45:27 +13:00
Brenda Wallace
bec59aba43 Merge remote-tracking branch 'origin/fix/codestyle' into fix/codestyle 2017-10-18 19:27:36 +13:00
Brenda Wallace
c86902967d Merge remote-tracking branch 'upstream/dev' into fix/codestyle 2017-10-18 19:27:08 +13:00
Brenda Wallace
361e3df692 Added hound config 2017-10-18 19:26:36 +13:00
Shiny
ce18bef892 Merge branch 'dev' into fix/codestyle 2017-10-18 14:01:57 +13:00
Shiny
ac2b0d04ea Merge branch 'dev' into fix/heroku-deploys 2017-10-18 13:40:52 +13:00
Brenda Wallace
9d0b48b84c Update heroku maintenance script
maintenance is just an attribute now
2017-10-18 13:37:54 +13:00
Brenda Wallace
d8f41b5ca0 Use ! to indicate the method changes class variables 2017-10-18 12:20:28 +13:00
Brenda Wallace
b5fbfaf515 Fixed duplicated code in growstuff member link markdown 2017-10-18 12:13:05 +13:00
Brenda Wallace
ce9a71cdad Moved member look up to a method (less duplicate code) 2017-10-18 12:10:59 +13:00
Brenda Wallace
42a10bcd80 Fixed members link in growstuff markdown 2017-10-18 12:10:04 +13:00
Brenda Wallace
33656a4104 Fixed links to crops in growstuff markdown 2017-10-18 12:05:22 +13:00
pozorvlak
ca200c1f30 Merge pull request #1400 from Br3nda/fix/heroku-deploys
Migrate to new heroku platform api - maintenance mode trigger
2017-10-17 14:52:16 +01:00
Brenda Wallace
ccd352d699 Removed some rubocop todos 2017-10-17 22:33:22 +13:00
Brenda Wallace
bd396dabfe More simplification of growstuff markup 2017-10-17 22:29:02 +13:00
Brenda Wallace
1279dd63bc Reduced complexity of growstuff_markdown 2017-10-17 22:20:17 +13:00
Brenda Wallace
8d681dd90a Another code style fixup 2017-10-17 17:29:48 +13:00
Brenda Wallace
dfd0e1dbf5 Migrate to new heroku platform api - maintenance mode trigger 2017-10-17 16:23:12 +13:00
deppbot
0d555542c2 Bundle Update on 2017-10-16 2017-10-16 18:46:50 +13:00
deppbot
99a69cd492 Bundle Update on 2017-09-28 2017-10-16 14:52:16 +13:00
deppbot
e8e9aa23b2 Bundle Update on 2017-09-25 2017-09-25 09:34:12 +13:00
pozorvlak
2fafc6f3e4 Merge pull request #1391 from Br3nda/feature/bundle-update-and-heroku-api-change
Bundle update and change to platform-api instead of heroku
2017-09-24 14:59:44 +01:00
Brenda Wallace
6b1714eb05 Only install elastic search in travis on the matix that tests elasticsearch 2017-09-24 18:50:23 +13:00
Brenda Wallace
8e5c52e85e Outputs which version of elasticsearch we are running on travis 2017-09-24 18:40:50 +13:00
Brenda Wallace
c749f4a813 Install elastic search 2.4.0 when running on travis 2017-09-24 18:35:39 +13:00
Brenda Wallace
5ed5f9ec7e Sleep before tests
as suggested here https://docs.travis-ci.com/user/database-setup/#ElasticSearch
2017-09-24 15:17:39 +13:00
Brenda Wallace
f4658df208 Further gem updates 2017-09-24 14:28:51 +13:00
Brenda Wallace
e21b95a353 Use floats, so the percentage calc works 2017-09-13 22:21:15 +12:00
Brenda Wallace
19205cb6a8 update from erubi to erubis gem broke stuff - rolling back 2017-09-13 22:08:21 +12:00
Brenda Wallace
17521cde17 Set required executable to jshint linting 2017-09-13 22:01:33 +12:00
Brenda Wallace
5f7d48c633 Don't need to create database if just running linters 2017-09-05 14:30:03 +12:00
Brenda Wallace
94bb3bf6bb Remove git guilt 2017-09-05 14:22:52 +12:00
Brenda Wallace
c9aacd0110 Specify the executable in the npm installed linters 2017-09-05 14:20:28 +12:00
Brenda Wallace
ca5f14bb37 Specify the executable in the npm installed linters 2017-09-05 14:19:24 +12:00
Brenda Wallace
43da004ccb Bundle update and change to platform-api instead of heroku 2017-09-05 13:58:56 +12:00
Cesy
2704fcf515 Merge pull request #1387 from Br3nda/ruby-2-4-1
Bump ruby version to 2.4.1
2017-09-04 11:21:40 +01:00
Shiny
1af19335d7 Merge branch 'dev' into ruby-2-4-1 2017-09-01 13:00:46 +12:00
Shiny
4d33c32866 Merge branch 'master' into dev 2017-09-01 12:20:15 +12:00
Brenda Wallace
01333bf965 Use string.start_with? instead of a regexp 2017-09-01 12:11:57 +12:00
Brenda Wallace
a145abff56 Changed regex to matches? to appease rubocop 2017-08-31 21:27:22 +12:00
Brenda Wallace
9732553d3b Added xmlrpc gem to solve rake errors on travis 2017-08-31 21:04:55 +12:00
Brenda Wallace
9142613b6b Bump ruby version to 2.4.1 2017-08-22 13:49:43 +12:00
Cesy
7132c95b61 Merge pull request #1382 from Growstuff/bundle-update-2017-08-03-163455
Bundle Update on 2017-08-03
2017-08-21 09:40:49 +01:00
Shiny
8f76ccf836 Merge branch 'dev' into bundle-update-2017-08-03-163455 2017-08-20 17:21:38 +12:00
deppbot
58e6411bbe Bundle Update on 2017-08-03 2017-08-03 16:34:56 +08:00
32 changed files with 251 additions and 248 deletions

View File

@@ -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:

View File

@@ -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)

View File

@@ -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

View File

@@ -64,7 +64,7 @@ class PlantingsController < ApplicationController
def destroy
@planting.destroy
respond_with @planting, location: garden
respond_with @planting, location: @planting.garden
end
private

View File

@@ -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

View 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

View 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

View 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)

View File

@@ -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

View File

@@ -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 }

View File

@@ -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 :

View File

@@ -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)

View 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'

View File

@@ -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" }

View File

@@ -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}%" }

View 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

View File

@@ -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

View File

@@ -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)

View File

@@ -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 }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 /&lt;a href=&quot;/
rendered.should match(/&lt;a href=&quot;/)
end
end

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 "&lt;strong&gt;" 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

View File

@@ -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