office_clerk 0.5 → 0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +15 -0
  3. data/Gemfile +0 -13
  4. data/Gemfile.lock +50 -83
  5. data/Guardfile +28 -0
  6. data/app/controllers/admin_controller.rb +6 -2
  7. data/app/controllers/baskets_controller.rb +2 -1
  8. data/app/controllers/categories_controller.rb +2 -1
  9. data/app/controllers/office_controller.rb +5 -0
  10. data/app/controllers/products_controller.rb +1 -1
  11. data/app/controllers/sessions_controller.rb +5 -0
  12. data/app/helpers/shop_helper.rb +0 -11
  13. data/app/models/basket.rb +2 -2
  14. data/app/models/clerk.rb +1 -3
  15. data/app/models/order.rb +3 -3
  16. data/app/views/baskets/_small.html.haml +1 -0
  17. data/app/views/baskets/index.html.haml +3 -3
  18. data/app/views/baskets/show.html.haml +1 -2
  19. data/app/views/categories/edit.html.haml +2 -1
  20. data/app/views/categories/index.html.haml +19 -8
  21. data/app/views/categories/show.html.haml +31 -26
  22. data/app/views/clerks/index.html.haml +4 -4
  23. data/app/views/layouts/_header_extra.haml +1 -2
  24. data/app/views/layouts/office_clerk.csv.erb +1 -0
  25. data/app/views/order_mailer/cancel.text.erb +24 -0
  26. data/app/views/order_mailer/confirm.text.erb +36 -0
  27. data/app/views/order_mailer/paid.text.erb +28 -0
  28. data/app/views/order_mailer/shipped.text.erb +24 -0
  29. data/app/views/orders/index.csv.erb +5 -0
  30. data/app/views/orders/index.html.haml +39 -45
  31. data/app/views/orders/show.html.haml +23 -11
  32. data/app/views/products/_triple.html.haml +2 -2
  33. data/app/views/products/index.html.haml +37 -19
  34. data/app/views/purchases/index.html.haml +4 -3
  35. data/app/views/shop/_product_box.haml +12 -12
  36. data/app/views/suppliers/index.html.haml +5 -5
  37. data/bin/rake +0 -4
  38. data/bin/rspec +0 -4
  39. data/config/locales/en.yml +5 -0
  40. data/config/locales/fi.yml +5 -0
  41. data/config/spring.rb +1 -0
  42. data/lib/office_clerk.rb +3 -1
  43. data/lib/office_clerk/engine.rb +5 -1
  44. data/lib/office_clerk/shipping_method.rb +1 -1
  45. data/lib/office_clerk/version.rb +1 -1
  46. data/office_clerk.gemspec +3 -1
  47. data/spec/features/categories_search_spec.rb +47 -0
  48. data/spec/features/products/index_spec.rb +58 -9
  49. data/spec/models/clerk/email_spec.rb +4 -4
  50. data/spec/spec_helper.rb +6 -47
  51. data/spec/support/basket_helper.rb +9 -0
  52. data/spec/support/product_helper.rb +25 -0
  53. data/spec/support/request_helper.rb +4 -4
  54. data/spec/support/setup/admin.rb +4 -0
  55. data/spec/support/setup/capybara.rb +14 -0
  56. data/spec/support/setup/cleaner.rb +22 -0
  57. data/spec/support/setup/email.rb +6 -0
  58. data/spec/support/setup/factory_girl.rb +3 -0
  59. metadata +95 -51
  60. data/app/views/order_mailer/cancel.html.haml +0 -6
  61. data/app/views/order_mailer/confirm.html.haml +0 -7
  62. data/app/views/order_mailer/paid.html.haml +0 -6
  63. data/app/views/order_mailer/shipped.html.haml +0 -6
  64. data/config/i18n-tasks.yml +0 -11
  65. data/spec/support/factory_girl.rb +0 -6
  66. data/test_app/spec/rails_helper.rb +0 -50
  67. data/test_app/spec/spec_helper.rb +0 -85
@@ -8,16 +8,10 @@
8
8
  = t(:ordered_on) + " : " + date(@order.ordered_on)
9
9
  %p
10
10
  %b
11
- = t(:total_price) + " : " + euros(@order.basket.total_price)
12
- %p
13
- %b
14
- = t(:total_tax) + " : " + euros(@order.basket.total_tax)
15
- %p
16
- %b
17
- = t(:shipment_price) + " : " + euros(@order.shipment_price)
11
+ = t(:email) + " : " + @order.email.to_s
18
12
  %p
19
13
  %b
20
- = t(:email) + " : " + @order.email.to_s
14
+ = t(:shipment_type) + " : " + @order.shipment_type.to_s
21
15
  .col-md-4
22
16
  %p
23
17
  %b
@@ -35,12 +29,30 @@
35
29
  %p
36
30
  %b
37
31
  = t(:canceled_on) + " : " + date(@order.canceled_on)
38
- %p
39
- %b
40
- = t(:shipment_type) + " : " + @order.shipment_type.to_s
32
+ -content_for :basket do
33
+ %tr
34
+ %td{:colspan => 2}
35
+ %td
36
+ %b= t(:total_tax) + " : "
37
+ %td
38
+ %b= euros(@order.total_tax)
39
+ %tr
40
+ %td{:colspan => 2}
41
+ %td
42
+ %b= t(:shipment_price) + " : "
43
+ %td
44
+ %b= euros(@order.shipment_price)
45
+ %tr
46
+ %td{:colspan => 2}
47
+ %td
48
+ %b= t(:total_price) + " : "
49
+ %td
50
+ %b= euros(@order.total_price)
51
+
41
52
  .row
42
53
  = render "baskets/small" , :basket => @order.basket
43
54
  .row
55
+ %br
44
56
  .col-md-2
45
57
  = link_to t(:back), orders_path, :class => "btn btn-warning"
46
58
  .col-md-10
@@ -1,5 +1,5 @@
1
- %h3= products.length.to_s + " " + t(:products)
2
1
  .row
2
+ %h3= products.length.to_s + " " + t(:products)
3
3
  %table.table.table-striped.table-bordered.table-condensed
4
4
  %tbody
5
5
  - products.in_groups_of(3).each do |array|
@@ -8,5 +8,5 @@
8
8
  -next unless product
9
9
  %td= image_tag product.main_picture.url(:thumb)
10
10
  %td
11
- = link_to product_path(product), :title => t(:show) do
11
+ = link_to product_path(product), :title => t(:show) , :class => product.online && "online" do
12
12
  = product.full_name
@@ -38,7 +38,7 @@
38
38
  %td.image= image_tag product.main_picture.url(:thumb)
39
39
  %td.ean= product.line? ? "#{product.products.length} #{t(:items)}" : product.ean
40
40
  %td.name
41
- = link_to product_path(product), :title => t(:show) do
41
+ = link_to product_path(product), :title => t(:show) , :class => product.online && "online" do
42
42
  =product.full_name
43
43
  %td.price=euros(product.price)
44
44
  %td.supplier
@@ -52,38 +52,56 @@
52
52
  %td= link_to t(:edit) ,edit_product_path(product), :title => t(:edit)
53
53
  = paginate @products
54
54
  .col-md-3
55
- = search_form_for @q, :url => search_products_path, :html => { :class => "well well-small" }, :method => :get do |f|
55
+ = search_form_for @q, :url => search_products_path, :html => { :class => "form-horizontal" }, :method => :get do |f|
56
56
  .form-group
57
- - if params[:basket]
58
- = hidden_field_tag :basket , params[:basket]
59
- = f.text_field :name_or_product_name_cont, :class => "form-control" , :placeholder => t(:name)
60
- -else
61
- = f.text_field :name_cont, :class => "form-control" , :placeholder => t(:name)
57
+ .input-group
58
+ - if params[:basket]
59
+ = hidden_field_tag :basket , params[:basket]
60
+ = f.text_field :name_or_product_name_cont, :class => "form-control" , :placeholder => t(:name)
61
+ -else
62
+ = f.text_field :name_cont, :class => "form-control" , :placeholder => t(:name)
63
+ %span.input-group-addon
64
+ =t(:online)
65
+ = f.radio_button :online_eq , true
62
66
  .form-group
63
- = f.text_field :description_cont , :class => "form-control" , :placeholder => t(:description)
67
+ .input-group
68
+ = f.text_field :summary_cont , :class => "form-control" , :placeholder => t(:summary)
69
+ %span.input-group-addon
70
+ =t(:blanks)
71
+ = f.radio_button :summary_blank , true
64
72
  .form-group
65
- = f.text_field :ean_cont , :class => "form-control" , :placeholder => t(:ean)
73
+ .input-group
74
+ = f.text_field :description_cont , :class => "form-control" , :placeholder => t(:description)
75
+ %span.input-group-addon
76
+ =t(:blanks)
77
+ = f.radio_button :description_blank , true
66
78
  .form-group
67
- = f.text_field :scode_cont , :class => "form-control" , :placeholder => t(:scode)
68
- .form-group.row
69
- .col-md-3
79
+ .col-md-6
80
+ = f.text_field :ean_cont , :class => "form-control" , :placeholder => t(:ean)
81
+ .col-md-6
82
+ = f.text_field :scode_cont , :class => "form-control" , :placeholder => t(:scode)
83
+ .form-group
84
+ .col-md-4
70
85
  = f.label(:price)
71
86
  .col-md-4
72
87
  = f.text_field :price_gteq , :class => "form-control"
73
88
  .col-md-4
74
89
  = f.text_field :price_lteq , :class => "form-control"
75
- .form-group.row
76
- .col-md-3
90
+ .col-md-4
77
91
  = f.label(:inventory)
78
92
  .col-md-4
79
93
  = f.text_field :inventory_gteq , :class => "form-control"
80
94
  .col-md-4
81
95
  = f.text_field :inventory_lteq , :class => "form-control"
82
96
  .form-group
83
- = f.label t(:supplier)
84
- = f.collection_select :supplier_id_eq, Supplier.all, :id, :supplier_name, :include_blank => true
97
+ .col-md-4
98
+ = f.label t(:supplier)
99
+ .col-md-8
100
+ = f.collection_select :supplier_id_eq, Supplier.all, :id, :supplier_name, {:include_blank => true}, :class=>"form-control"
85
101
  .form-group
86
- = f.label t(:category)
87
- = f.collection_select :category_id_eq, Category.all, :id, :name, :include_blank => true
88
- = f.submit t(:filter), :class => "btn btn-success"
102
+ .col-md-4
103
+ = f.label t(:category)
104
+ .col-md-8
105
+ = f.collection_select :category_id_eq, Category.all, :id, :name, {:include_blank => true}, :class=>"form-control"
106
+ = f.submit t(:filter), :class => "btn btn-success" , :id => :filter
89
107
  = link_to t(:cancel), products_path, :class => "btn btn-warning"
@@ -29,9 +29,9 @@
29
29
  .btn-group
30
30
  = paginate @purchases
31
31
  .col-md-3
32
- = search_form_for @q, :url => search_purchases_path, :html => { :class => "well well-small" }, :method => :post do |f|
32
+ = search_form_for @q, :url => search_purchases_path, :html => { :class => "form-horizontal" }, :method => :post do |f|
33
33
  .form-group
34
- = f.text_field :name_cont , :placeholder => t(:name)
34
+ = f.text_field :name_cont , :class => "form-control" , :placeholder => t(:name)
35
35
  .row
36
36
  .col-md-10
37
37
  = f.label(:ordered_on)
@@ -48,5 +48,6 @@
48
48
  = f.text_field :received_on_gt , :class => "form-control datepicker"
49
49
  .col-md-5
50
50
  = f.text_field :received_on_lt , :class => "form-control datepicker"
51
- = f.submit t(:filter), :class => "btn btn-success"
51
+ %br
52
+ = f.submit t(:filter), :id => :filter , :class => "btn btn-success"
52
53
  = link_to t(:cancel), purchases_path, :class => "btn btn-warning"
@@ -1,13 +1,13 @@
1
- =link_to shop_product_path(:link => product.link ) do
2
- %h4.product-name
1
+ %h4.product-name
2
+ =link_to shop_product_path(:link => product.link ) do
3
3
  = product.name
4
- .row
5
- .col-md-4
6
- .square-image
7
- =image_tag product.main_picture.url
8
- .col-md-8.bottom
9
- .product-fact
10
- = link_to shop_product_path( :link => product.link ) , :class => :info do
11
- %p= markdown product.summary
12
- .price.selling
13
- = euros product.price
4
+ .row
5
+ .col-md-4
6
+ .square-image
7
+ =image_tag product.main_picture.url
8
+ .col-md-8.bottom
9
+ .product-fact
10
+ %p= markdown product.summary
11
+ = link_to shop_product_path( :link => product.link ) , :class => :info do
12
+ .price.selling
13
+ = euros product.price
@@ -23,18 +23,18 @@
23
23
  %tbody
24
24
  - @suppliers.each do |supplier|
25
25
  %tr{:class => "line-#{cycle("1","2")}"}
26
- %td=supplier.supplier_name
26
+ %td.name=supplier.supplier_name
27
27
  %td=supplier.products.count
28
28
  %td=supplier.whole_address
29
29
  %td= link_to t(:show) , supplier_path(supplier), :title => t(:show)
30
30
  %td= link_to t(:edit) , edit_supplier_path(supplier), :title => t(:edit)
31
31
  = paginate @suppliers
32
32
  .col-md-3
33
- = search_form_for @q, :url => search_suppliers_path, :html => { :class => "well well-small" }, :method => :post do |f|
33
+ = search_form_for @q, :url => search_suppliers_path, :html => { :class => "form-horizontal" }, :method => :post do |f|
34
34
  .form-group
35
- = f.text_field :supplier_name_cont , :placeholder => t(:name)
35
+ = f.text_field :supplier_name_cont , :class => "form-control", :placeholder => t(:name)
36
36
  .form-group
37
- = f.text_field :address_cont , :placeholder => t(:address)
38
- = f.submit t(:filter), :class => "btn btn-success"
37
+ = f.text_field :address_cont , :class => "form-control", :placeholder => t(:address)
38
+ = f.submit t(:filter), :id => :filter , :class => "btn btn-success"
39
39
  = link_to t(:cancel), suppliers_path, :class => "btn btn-warning"
40
40
 
data/bin/rake CHANGED
@@ -1,8 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- begin
3
- load File.expand_path("../spring", __FILE__)
4
- rescue LoadError
5
- end
6
2
  require_relative '../config/boot'
7
3
  require 'rake'
8
4
  Rake.application.run
data/bin/rspec CHANGED
@@ -1,7 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- begin
3
- load File.expand_path("../spring", __FILE__)
4
- rescue LoadError
5
- end
6
2
  require 'bundler/setup'
7
3
  load Gem.bin_path('rspec-core', 'rspec')
@@ -17,6 +17,7 @@ en:
17
17
  basket_locked: Basket is locked, unlock to change
18
18
  baskets: Baskets
19
19
  between: ' between'
20
+ blanks: Blanks
20
21
  cancel: Cancel
21
22
  canceled_on: Canceled on
22
23
  cancel_order_button: Cancel email
@@ -48,6 +49,7 @@ en:
48
49
  extra_picture: Extra picture
49
50
  filter: Filter
50
51
  first_name: First Name
52
+ fix_errors: There are errors below
51
53
  history: Order history
52
54
  home: Home
53
55
  info: Info
@@ -121,6 +123,7 @@ en:
121
123
  shipped_on: Shipped on
122
124
  shipped_order_button: Ship Order Email
123
125
  shop: Shop
126
+ shop_link: In Shop
124
127
  show: Show
125
128
  sign_in: Log in
126
129
  sign_in_invalid: Invalid email or password
@@ -175,6 +178,7 @@ en:
175
178
  link: Link
176
179
  position: Position
177
180
  description: Description
181
+ summary: Summary
178
182
  order:
179
183
  email: Email
180
184
  ordered_on: Ordered on
@@ -184,6 +188,7 @@ en:
184
188
  received_on: Received on
185
189
  product:
186
190
  description: Description
191
+ summary: Summary
187
192
  ean: Ean
188
193
  inventory: Inventory
189
194
  name: Name
@@ -15,6 +15,7 @@ fi:
15
15
  basket_locked: Ostoskoria ei voi muuttaa
16
16
  baskets: Ostoskorit
17
17
  between: haarukka
18
+ blanks: Tyhjät
18
19
  cancel: Peruuta
19
20
  cancel_order_button: Peruta s-post
20
21
  canceled_on: Peruutettu
@@ -47,6 +48,7 @@ fi:
47
48
  extra_picture: Toinen kuva
48
49
  filter: Hae
49
50
  first_name: Etunimi
51
+ fix_errors: Yhteystiedoistasi puuttuu tietoja
50
52
  history: Tilaushistoria
51
53
  home: Kotiin
52
54
  info: Info
@@ -121,6 +123,7 @@ fi:
121
123
  shipped_on: Lähetetty
122
124
  shipped_order_button: Lähetetty S-Posti
123
125
  shop: Kauppa
126
+ shop_link: Kauppassa
124
127
  show: Näytä
125
128
  sign_in: Kirjaudu sisään
126
129
  sign_in_invalid: Sposti tai salasana virheellinen
@@ -170,6 +173,7 @@ fi:
170
173
  street: Osoite
171
174
  category:
172
175
  name: Nimi
176
+ summary: Yhteenveto
173
177
  online: Netissä
174
178
  category: Pääryhmä
175
179
  link: Linkki
@@ -180,6 +184,7 @@ fi:
180
184
  ordered_on: Tilattu
181
185
  product:
182
186
  description: Kuvaus
187
+ summary: Yhteenveto
183
188
  ean: Ean
184
189
  inventory: Inventaario
185
190
  name: Nimi
data/config/spring.rb ADDED
@@ -0,0 +1 @@
1
+ Spring.application_root = "./test_app"
data/lib/office_clerk.rb CHANGED
@@ -4,7 +4,7 @@ require "haml"
4
4
  require "jquery-ui-rails"
5
5
  require "kramdown"
6
6
  require "will_paginate"
7
-
7
+ require 'coffee_script'
8
8
  require 'will_paginate-bootstrap'
9
9
  require 'bootstrap-sass'
10
10
  require 'bootstrap_form'
@@ -13,6 +13,8 @@ require 'rails-i18n'
13
13
  require "jquery-rails"
14
14
  require "gon"
15
15
  require "bcrypt"
16
+ require "valid_email"
17
+ require "ransack"
16
18
 
17
19
  require "office_clerk/shipping_method"
18
20
 
@@ -13,7 +13,11 @@ module OfficeClerk
13
13
  I18n.default_locale = :fi
14
14
  config.after_initialize do
15
15
  end
16
-
16
+ # for testing this makes engine factories available
17
+ initializer "model_core.factories", :after => "factory_girl.set_factory_paths" do
18
+ FactoryGirl.definition_file_paths << File.expand_path('../../../spec/factories', __FILE__) if defined?(FactoryGirl)
19
+ end
20
+
17
21
  config.paperclip_defaults = { :styles => {:thumb => '48x48>', :list => '150x150>', :product => '600x600>' },
18
22
  :default_style => :list,
19
23
  :url => "/images/:id/:style/:basename.:extension",
@@ -6,7 +6,7 @@ module OfficeClerk
6
6
  @type = @data[:type]
7
7
  @description = @data[:description]
8
8
  end
9
- attr_reader :data , :name , :type
9
+ attr_reader :data , :name , :type , :description
10
10
 
11
11
  def price_for(basket)
12
12
  raise "Not implemented in #{self}"
@@ -1,3 +1,3 @@
1
1
  module OfficeClerk
2
- VERSION = "0.5"
2
+ VERSION = "0.6"
3
3
  end
data/office_clerk.gemspec CHANGED
@@ -23,7 +23,9 @@ Gem::Specification.new do |s|
23
23
 
24
24
  s.has_rdoc = false
25
25
 
26
- s.add_runtime_dependency 'rails', '~> 4.0', '>= 4.0.1'
26
+ s.add_runtime_dependency 'rails', '~> 4.1', '<= 4.2'
27
+ s.add_runtime_dependency "ransack" , '>= 1.5.1'
28
+ s.add_runtime_dependency "valid_email"
27
29
  s.add_runtime_dependency 'sass-rails' , '~> 4.0'
28
30
  s.add_runtime_dependency "haml" , '~> 4.0'
29
31
  s.add_runtime_dependency "jquery-rails" , '~> 3.1'
@@ -0,0 +1,47 @@
1
+ #this file is included by category_spec, so the guard matchers work
2
+
3
+ require 'spec_helper'
4
+
5
+ describe "Category search" do
6
+ before :each do
7
+ sign_in
8
+ end
9
+ it "lists no categories" do
10
+ visit_path categories_path
11
+ expect(category_count).to be 0
12
+ end
13
+ it "lists correct number of unfiltered categories" do
14
+ category_ab :name => ["one","two", "more"]
15
+ expect(category_count).to be 3
16
+ end
17
+ it "filters by online" do
18
+ category_ab :online => [true, false]
19
+ choose("q[online_eq]")
20
+ expect(category_count).to be 1
21
+ end
22
+ it "filters by name" do
23
+ category_ab :name =>[ "i have a name", "nono"]
24
+ fill_in("q[name_cont]" , :with => "name")
25
+ expect(category_count).to be 1
26
+ end
27
+ it "filters by empty summary" do
28
+ category_ab :summary =>[ "i have a summary", ""]
29
+ choose("q[summary_blank]")
30
+ expect(category_count).to be 1
31
+ end
32
+ it "filters by summary" do
33
+ category_ab :summary =>[ "i have a summary", ""]
34
+ fill_in("q[summary_cont]" , :with => "have")
35
+ expect(category_count).to be 1
36
+ end
37
+ it "filters by description" do
38
+ category_ab :description =>[ "i have a name", "nono"]
39
+ fill_in("q[description_cont]" , :with => "name")
40
+ expect(category_count).to be 1
41
+ end
42
+ it "filters by empty description" do
43
+ category_ab :description =>[ "i have a description", ""]
44
+ choose("q[description_blank]")
45
+ expect(category_count).to be 1
46
+ end
47
+ end
@@ -4,13 +4,62 @@ describe "GET /products" do
4
4
  before :each do
5
5
  sign_in
6
6
  end
7
- it "lists no products" do
8
- visit_path products_path
9
- end
10
- it "filters by price" do
11
- 10.times { create :product }
12
- visit products_path
13
- fill_in "q[price_lteq]", :with => '10'
14
- click_button( I18n.t(:filter))
15
- end
7
+ it "lists no products" do
8
+ visit_path products_path
9
+ expect(product_count).to be 0
10
+ end
11
+ it "lists correct number of unfiltered products" do
12
+ product_ab :price => [8 ,12,14,16]
13
+ expect(product_count).to be 4
14
+ end
15
+ it "filters by name" do
16
+ product_ab :name =>[ "i have a name", "nono"]
17
+ fill_in("q[name_cont]" , :with => "name")
18
+ expect(product_count).to be 1
19
+ end
20
+ it "filters by online" do
21
+ product_ab :online => [true, false]
22
+ choose("q[online_eq]")
23
+ expect(product_count).to be 1
24
+ end
25
+ it "filters by empty summary" do
26
+ product_ab :summary =>[ "i have a summary", ""]
27
+ choose("q[summary_blank]")
28
+ expect(product_count).to be 1
29
+ end
30
+ it "filters by summary" do
31
+ product_ab :summary =>[ "i have a summary", ""]
32
+ fill_in("q[summary_cont]" , :with => "have")
33
+ expect(product_count).to be 1
34
+ end
35
+ it "filters by empty description" do
36
+ product_ab :description =>[ "i have a description", ""]
37
+ choose("q[description_blank]")
38
+ expect(product_count).to be 1
39
+ end
40
+ it "filters by description" do
41
+ product_ab :description =>[ "i have a name", "nono"]
42
+ fill_in("q[description_cont]" , :with => "name")
43
+ expect(product_count).to be 1
44
+ end
45
+ it "filters by price less" do
46
+ product_ab :price => [8 ,12]
47
+ fill_in "q[price_lteq]", :with => '10'
48
+ expect(product_count).to be 1
49
+ end
50
+ it "filters by price greater" do
51
+ product_ab :price => [8 ,12]
52
+ fill_in "q[price_gteq]", :with => '10'
53
+ expect(product_count).to be 1
54
+ end
55
+ it "filters by stock less" do
56
+ product_ab :inventory => [8 ,12]
57
+ fill_in "q[inventory_lteq]", :with => '10'
58
+ expect(product_count).to be 1
59
+ end
60
+ it "filters by inventory greater" do
61
+ product_ab :inventory => [8 ,12]
62
+ fill_in "q[inventory_gteq]", :with => '10'
63
+ expect(product_count).to be 1
64
+ end
16
65
  end