Commit b2e59b620688129c3a6649c34816221be8f04896

Authored by Braulio Bhavamitra
1 parent ddf8ec9d

shopping_cart: fix tests

plugins/shopping_cart/controllers/shopping_cart_plugin_controller.rb
... ... @@ -8,39 +8,39 @@ class ShoppingCartPluginController < OrdersPluginController
8 8 def get
9 9 config =
10 10 if cart.nil?
11   - { :profile_id => params[:profile_id],
12   - :has_products => false,
13   - :visible => false,
14   - :products => []}
  11 + { profile_id: params[:profile_id],
  12 + has_products: false,
  13 + visible: false,
  14 + products: []}
15 15 else
16 16 {
17   - :profile_id => cart[:profile_id],
18   - :profile_short_name => cart_profile.short_name,
19   - :has_products => (cart[:items].keys.size > 0),
20   - :visible => visible?,
21   - :products => products,
  17 + profile_id: cart[:profile_id],
  18 + profile_short_name: cart_profile.short_name,
  19 + has_products: (cart[:items].keys.size > 0),
  20 + visible: visible?,
  21 + products: products,
22 22 }
23 23 end
24 24 config[:has_previous_orders] = if cart_profile then previous_orders.first.present? else false end
25   - render :text => config.to_json
  25 + render text: config.to_json
26 26 end
27 27  
28 28 def add
29 29 product = find_product(params[:id])
30 30 if product && (profile = validate_same_profile(product))
31   - self.cart = { :profile_id => profile.id, :items => {} } if self.cart.nil?
  31 + self.cart = { profile_id: profile.id, items: {} } if self.cart.nil?
32 32 self.cart[:items][product.id] = 0 if self.cart[:items][product.id].nil?
33 33 self.cart[:items][product.id] += 1
34   - render :text => {
35   - :ok => true,
36   - :error => {:code => 0},
37   - :products => [{
38   - :id => product.id,
39   - :name => product.name,
40   - :price => get_price(product, profile.environment),
41   - :description => product.description,
42   - :picture => product.default_image(:minor),
43   - :quantity => self.cart[:items][product.id]
  34 + render text: {
  35 + ok: true,
  36 + error: {code: 0},
  37 + products: [{
  38 + id: product.id,
  39 + name: product.name,
  40 + price: get_price(product, profile.environment),
  41 + description: product.description,
  42 + picture: product.default_image(:minor),
  43 + quantity: self.cart[:items][product.id]
44 44 }]
45 45 }.to_json
46 46 end
... ... @@ -51,20 +51,20 @@ class ShoppingCartPluginController < OrdersPluginController
51 51 if validate_cart_presence && validate_cart_has_product(id)
52 52 self.cart[:items].delete(id)
53 53 self.cart = nil if self.cart[:items].empty?
54   - render :text => {
55   - :ok => true,
56   - :error => {:code => 0},
57   - :product_id => id
  54 + render text: {
  55 + ok: true,
  56 + error: {code: 0},
  57 + product_id: id
58 58 }.to_json
59 59 end
60 60 end
61 61  
62 62 def list
63 63 if validate_cart_presence
64   - render :text => {
65   - :ok => true,
66   - :error => {:code => 0},
67   - :products => products
  64 + render text: {
  65 + ok: true,
  66 + error: {code: 0},
  67 + products: products
68 68 }.to_json
69 69 end
70 70 end
... ... @@ -75,20 +75,20 @@ class ShoppingCartPluginController < OrdersPluginController
75 75 if validate_cart_presence && validate_cart_has_product(id) && validate_item_quantity(quantity)
76 76 product = Product.find(id)
77 77 self.cart[:items][product.id] = quantity
78   - render :text => {
79   - :ok => true,
80   - :error => {:code => 0},
81   - :product_id => id,
82   - :quantity => quantity
  78 + render text: {
  79 + ok: true,
  80 + error: {code: 0},
  81 + product_id: id,
  82 + quantity: quantity
83 83 }.to_json
84 84 end
85 85 end
86 86  
87 87 def clean
88 88 self.cart = nil
89   - render :text => {
90   - :ok => true,
91   - :error => {:code => 0}
  89 + render text: {
  90 + ok: true,
  91 + error: {code: 0}
92 92 }.to_json
93 93 end
94 94  
... ... @@ -121,7 +121,7 @@ class ShoppingCartPluginController < OrdersPluginController
121 121 @profile = cart_profile
122 122 @order = profile.sales.build consumer: user
123 123  
124   - @order.supplier_delivery = profile.delivery_methods.find session[:cart][:last_delivery_option_id] rescue nil
  124 + @order.supplier_delivery = profile.delivery_methods.where(id: session[:cart][:last_delivery_option_id]).first
125 125 if repeat_order_id = self.cart[:repeat_order_id]
126 126 repeat_order = cart_profile.orders.where(id: repeat_order_id).first
127 127 @order.consumer_delivery_data = repeat_order.consumer_delivery_data if repeat_order
... ... @@ -146,23 +146,23 @@ class ShoppingCartPluginController < OrdersPluginController
146 146 end
147 147  
148 148 def visibility
149   - render :text => visible?.to_json
  149 + render text: visible?.to_json
150 150 end
151 151  
152 152 def show
153 153 begin
154 154 self.cart[:visibility] = true
155   - render :text => {
156   - :ok => true,
157   - :message => _('Basket displayed.'),
158   - :error => {:code => 0}
  155 + render text: {
  156 + ok: true,
  157 + message: _('Basket displayed.'),
  158 + error: {code: 0}
159 159 }.to_json
160 160 rescue Exception => exception
161   - render :text => {
162   - :ok => false,
163   - :error => {
164   - :code => 7,
165   - :message => exception.message
  161 + render text: {
  162 + ok: false,
  163 + error: {
  164 + code: 7,
  165 + message: exception.message
166 166 }
167 167 }.to_json
168 168 end
... ... @@ -171,17 +171,17 @@ class ShoppingCartPluginController < OrdersPluginController
171 171 def hide
172 172 begin
173 173 self.cart[:visibility] = false
174   - render :text => {
175   - :ok => true,
176   - :message => _('Basket hidden.'),
177   - :error => {:code => 0}
  174 + render text: {
  175 + ok: true,
  176 + message: _('Basket hidden.'),
  177 + error: {code: 0}
178 178 }.to_json
179 179 rescue Exception => exception
180   - render :text => {
181   - :ok => false,
182   - :error => {
183   - :code => 8,
184   - :message => exception.message
  180 + render text: {
  181 + ok: false,
  182 + error: {
  183 + code: 8,
  184 + message: exception.message
185 185 }
186 186 }.to_json
187 187 end
... ... @@ -189,7 +189,7 @@ class ShoppingCartPluginController < OrdersPluginController
189 189  
190 190 def update_supplier_delivery
191 191 @profile = cart_profile
192   - supplier_delivery = @profile.delivery_methods.find params[:order][:supplier_delivery_id]
  192 + supplier_delivery = @profile.delivery_methods.where(id: params[:order][:supplier_delivery_id]).first
193 193 order = build_order self.cart[:items], supplier_delivery
194 194 total_price = order.total_price
195 195 render json: {
... ... @@ -210,11 +210,11 @@ class ShoppingCartPluginController < OrdersPluginController
210 210  
211 211 def validate_same_profile(product)
212 212 if self.cart && self.cart[:profile_id] && product.profile_id != self.cart[:profile_id]
213   - render :text => {
214   - :ok => false,
215   - :error => {
216   - :code => 1,
217   - :message => _("Your basket contains items from '%{profile_name}'. Please empty the basket or checkout before adding items from here.") % {profile_name: cart_profile.short_name}
  213 + render text: {
  214 + ok: false,
  215 + error: {
  216 + code: 1,
  217 + message: _("Your basket contains items from '%{profile_name}'. Please empty the basket or checkout before adding items from here.") % {profile_name: cart_profile.short_name}
218 218 }
219 219 }.to_json
220 220 return nil
... ... @@ -224,11 +224,11 @@ class ShoppingCartPluginController < OrdersPluginController
224 224  
225 225 def validate_cart_presence
226 226 if self.cart.nil?
227   - render :text => {
228   - :ok => false,
229   - :error => {
230   - :code => 2,
231   - :message => _("There is no basket.")
  227 + render text: {
  228 + ok: false,
  229 + error: {
  230 + code: 2,
  231 + message: _("There is no basket.")
232 232 }
233 233 }.to_json
234 234 return false
... ... @@ -240,11 +240,11 @@ class ShoppingCartPluginController < OrdersPluginController
240 240 begin
241 241 product = Product.find(id)
242 242 rescue ActiveRecord::RecordNotFound
243   - render :text => {
244   - :ok => false,
245   - :error => {
246   - :code => 3,
247   - :message => _("This enterprise doesn't have this product.")
  243 + render text: {
  244 + ok: false,
  245 + error: {
  246 + code: 3,
  247 + message: _("This enterprise doesn't have this product.")
248 248 }
249 249 }.to_json
250 250 return nil
... ... @@ -254,11 +254,11 @@ class ShoppingCartPluginController < OrdersPluginController
254 254  
255 255 def validate_cart_has_product(id)
256 256 if !self.cart[:items].has_key?(id)
257   - render :text => {
258   - :ok => false,
259   - :error => {
260   - :code => 4,
261   - :message => _("The basket doesn't have this product.")
  257 + render text: {
  258 + ok: false,
  259 + error: {
  260 + code: 4,
  261 + message: _("The basket doesn't have this product.")
262 262 }
263 263 }.to_json
264 264 return false
... ... @@ -268,11 +268,11 @@ class ShoppingCartPluginController < OrdersPluginController
268 268  
269 269 def validate_item_quantity(quantity)
270 270 if quantity.to_i < 1
271   - render :text => {
272   - :ok => false,
273   - :error => {
274   - :code => 5,
275   - :message => _("Invalid quantity.")
  271 + render text: {
  272 + ok: false,
  273 + error: {
  274 + code: 5,
  275 + message: _("Invalid quantity.")
276 276 }
277 277 }.to_json
278 278 return false
... ... @@ -284,12 +284,12 @@ class ShoppingCartPluginController &lt; OrdersPluginController
284 284 products_list = {}; items.each do |id, quantity|
285 285 product = Product.find(id)
286 286 price = product.price || 0
287   - products_list[id] = {:quantity => quantity, :price => price, :name => product.name}
  287 + products_list[id] = {quantity: quantity, price: price, name: product.name}
288 288 end
289 289  
290 290 order = OrdersPlugin::Sale.new
291 291 order.profile = environment.profiles.find(cart[:profile_id])
292   - order.supplier_delivery = profile.delivery_methods.find params[:order][:supplier_delivery_id]
  292 + order.supplier_delivery = profile.delivery_methods.where(id: params[:order][:supplier_delivery_id]).first
293 293 order.session_id = session_id unless user
294 294 order.consumer = user
295 295 order.source = 'shopping_cart_plugin'
... ... @@ -330,11 +330,11 @@ class ShoppingCartPluginController &lt; OrdersPluginController
330 330 after_filter :save_cookie
331 331 def save_cookie
332 332 if @cart.nil?
333   - cookies.delete(cookie_key, :path => '/plugin/shopping_cart')
  333 + cookies.delete(cookie_key, path: '/plugin/shopping_cart')
334 334 else
335 335 cookies[cookie_key] = {
336   - :value => Base64.encode64(@cart.to_yaml),
337   - :path => "/plugin/shopping_cart"
  336 + value: Base64.encode64(@cart.to_yaml),
  337 + path: "/plugin/shopping_cart"
338 338 }
339 339 end
340 340 end
... ... @@ -351,20 +351,20 @@ class ShoppingCartPluginController &lt; OrdersPluginController
351 351 self.cart[:items].collect do |id, quantity|
352 352 product = Product.find_by_id(id)
353 353 if product
354   - { :id => product.id,
355   - :name => product.name,
356   - :price => get_price(product, product.profile.environment),
357   - :description => product.description,
358   - :picture => product.default_image(:minor),
359   - :quantity => quantity
  354 + { id: product.id,
  355 + name: product.name,
  356 + price: get_price(product, product.profile.environment),
  357 + description: product.description,
  358 + picture: product.default_image(:minor),
  359 + quantity: quantity
360 360 }
361 361 else
362   - { :id => id,
363   - :name => _('Undefined product'),
364   - :price => 0,
365   - :description => _('Wrong product id'),
366   - :picture => '',
367   - :quantity => quantity
  362 + { id: id,
  363 + name: _('Undefined product'),
  364 + price: 0,
  365 + description: _('Wrong product id'),
  366 + picture: '',
  367 + quantity: quantity
368 368 }
369 369 end
370 370 end
... ...
plugins/shopping_cart/controllers/shopping_cart_plugin_myprofile_controller.rb
... ... @@ -5,13 +5,8 @@ class ShoppingCartPluginMyprofileController &lt; MyProfileController
5 5 def edit
6 6 params[:settings] = treat_cart_options(params[:settings])
7 7 @settings = profile.shopping_cart_settings params[:settings] || {}
8   - respond_to do |format|
9   - format.js do
10   - if request.post?
11   - @success = @settings.save!
12   - end
13   - end
14   - format.html
  8 + if request.post?
  9 + @success = @settings.save!
15 10 end
16 11 end
17 12  
... ...
plugins/shopping_cart/delivery_admin.feature
... ... @@ -1,81 +0,0 @@
1   -Feature: delivery administration
2   - As an enterprise's administrator
3   - I want to create delivery methods
4   - In order to allow my customer to choose which delivery they want
5   -
6   - Background:
7   - Given "ShoppingCart" plugin is enabled
8   - And "Delivery" plugin is enabled
9   - And the following users
10   - | login | name |
11   - | moe | Moe |
12   - And the following enterprise
13   - | identifier | name | owner |
14   - | moes-tavern | Moes Tavern | moe |
15   - And the shopping basket is enabled on "Moes Tavern"
16   - And "Moe" is admin of "Moes Tavern"
17   - And I am logged in as "moe"
18   - And I go to moes-tavern's control panel
19   -
20   - @selenium
21   - Scenario: enable delivery
22   - Given I follow "Shopping basket"
23   - When I check "Enable shopping basket"
24   - Then I should see "Deliveries or pickups"
25   -
26   - @selenium
27   - Scenario: disable delivery
28   - Given I follow "Shopping basket"
29   - When I uncheck "Enable shopping basket"
30   - Then I should not see "Deliveries or pickups"
31   -
32   - @selenium
33   - Scenario: create new deliver
34   - Given I follow "Shopping basket"
35   - And I check "Enable shopping basket"
36   - And I follow "New delivery or pickup"
37   - And I select "Deliver" from "Type"
38   - And I fill in "Name" with "Bike"
39   - And I fill in "Description" with "Beers delivered with my old bike."
40   - And I fill in "Fixed cost" with "8.00"
41   - And I fill in "Order's minimum price for free delivery" with "35.50"
42   - When I press "Add"
43   - Then I should see "Bike" within ".delivery-method"
44   -
45   - @selenium
46   - Scenario: create new pickup
47   - Given I follow "Shopping basket"
48   - And I check "Enable shopping basket"
49   - And I follow "New delivery or pickup"
50   - And I select "Pickup" from "Type"
51   - And I fill in "Name" with "Bar"
52   - And I fill in "Description" with "Come to my bar and pick it yourself."
53   - And I fill in "Fixed cost" with "0.00"
54   - When I press "Add"
55   - Then I should see "Bar"
56   -
57   - @selenium
58   - Scenario: remove delivery
59   - Given I follow "Shopping basket"
60   - And I check "Enable shopping basket"
61   - And I follow "New delivery or pickup"
62   - And I fill in "Name" with "Bike"
63   - When I press "Add"
64   - Then I should see "Bike"
65   - And I follow "Remove" within ".delivery-method"
66   - When I confirm the browser dialog
67   - Then I should see "Bike"
68   -
69   - @selenium
70   - Scenario: edit delivery
71   - Given I follow "Shopping basket"
72   - And I check "Enable shopping basket"
73   - And I follow "New delivery or pickup"
74   - And I fill in "Name" with "Bike"
75   - When I press "Add"
76   - Then I should see "Bike"
77   - And I follow "Edit" within ".delivery-method"
78   - And I fill in "Name" with "Car"
79   - When I press "Save"
80   - Then I should not see "Bike"
81   - Then I should see "Car"
plugins/shopping_cart/delivery_client.feature
... ... @@ -1,77 +0,0 @@
1   -Feature: delivery client
2   - As an enterprise's client
3   - I want to choose the delivery method
4   - In order to receive my procucts properly
5   -
6   - Background:
7   - Given "ShoppingCart" plugin is enabled
8   - And "Delivery" plugin is enabled
9   - And the following users
10   - | login | name | email |
11   - | moe | Moe | moe@springfield.com |
12   - | homer | Homer | homer@springfield.com |
13   - And the following enterprise
14   - | identifier | name | owner |
15   - | moes-tavern | Moes Tavern | moe |
16   - And the shopping basket is enabled on "Moes Tavern"
17   - And the following product_categories
18   - | name |
19   - | Beer |
20   - | Snacks |
21   - And the following products
22   - | owner | category | name | price |
23   - | moes-tavern | beer | Duff | 3.00 |
24   - | moes-tavern | snacks | French fries | 7.00 |
25   - And "moes-tavern" has the following delivery methods
26   - | delivery_type | name | description | fixed_cost | free_over_price |
27   - | deliver | Bike | My good old bike. | 8.00 | 10.00 |
28   - | pickup | Bar | Come to my bar and drink it! | 0.00 | 0.00 |
29   - And feature "products_for_enterprises" is enabled on environment
30   - And I am logged in as "homer"
31   - And I go to moes-tavern's products page
32   -
33   - @selenium
34   - Scenario: choose deliver method for purchase
35   - Given I follow "Add to basket"
36   - And I follow "Add to basket"
37   - And I should see "Show basket"
38   - And I follow "Show basket"
39   - And I follow "Shopping checkout"
40   - And I fill in "Contact phone" with "123456789"
41   - When I select "Bike ($8.00)" from "Option"
42   - Then I should see "My good old bike." within ".instructions"
43   - And I should see "Address"
44   - And I should see "Bike" within "#delivery-name"
45   - And I should see "8.00" within "#delivery-price"
46   -
47   - @selenium
48   - Scenario: choose pickup method for purchase
49   - Given I follow "Add to basket"
50   - And I follow "Add to basket"
51   - And I should see "Show basket"
52   - And I follow "Show basket"
53   - And I follow "Shopping checkout"
54   - And I fill in "Contact phone" with "123456789"
55   - When I select "Bar" from "Option"
56   - Then I should see "Come to my bar and drink it!" within ".instructions"
57   - And I should not see "Address"
58   - And I should see "Bar" within "#delivery-name"
59   - And I should see "0.00" within "#delivery-price"
60   -
61   - @selenium
62   - Scenario: gets free delivery due to free over price
63   - Given I follow "Add to basket"
64   - And I follow "Add to basket"
65   - And I follow "Add to basket"
66   - And I follow "Add to basket"
67   - And I follow "Add to basket"
68   - And I follow "Add to basket"
69   - And I should see "Show basket"
70   - And I follow "Show basket"
71   - And I follow "Shopping checkout"
72   - And I fill in "Contact phone" with "123456789"
73   - When I select "Bike ($8.00)" from "Option"
74   - Then I should see "My good old bike." within ".instructions"
75   - And I should see "Address"
76   - And I should see "Bike" within "#delivery-name"
77   - And I should see "0.00" within "#delivery-price"
plugins/shopping_cart/features/delivery_admin.feature 0 → 100644
... ... @@ -0,0 +1,81 @@
  1 +Feature: delivery administration
  2 + As an enterprise's administrator
  3 + I want to create delivery methods
  4 + In order to allow my customer to choose which delivery they want
  5 +
  6 + Background:
  7 + Given "ShoppingCart" plugin is enabled
  8 + And "Delivery" plugin is enabled
  9 + And the following users
  10 + | login | name |
  11 + | moe | Moe |
  12 + And the following enterprise
  13 + | identifier | name | owner |
  14 + | moes-tavern | Moes Tavern | moe |
  15 + And the shopping basket is enabled on "Moes Tavern"
  16 + And "Moe" is admin of "Moes Tavern"
  17 + And I am logged in as "moe"
  18 + And I go to moes-tavern's control panel
  19 +
  20 + @selenium
  21 + Scenario: enable delivery
  22 + Given I follow "Shopping basket"
  23 + When I check "Enable shopping basket"
  24 + Then I should see "Deliveries or pickups"
  25 +
  26 + @selenium
  27 + Scenario: disable delivery
  28 + Given I follow "Shopping basket"
  29 + When I uncheck "Enable shopping basket"
  30 + Then I should not see "Deliveries or pickups"
  31 +
  32 + @selenium
  33 + Scenario: create new deliver
  34 + Given I follow "Shopping basket"
  35 + And I check "Enable shopping basket"
  36 + And I follow "New delivery or pickup"
  37 + And I select "Deliver" from "Type"
  38 + And I fill in "Name" with "Bike"
  39 + And I fill in "Description" with "Beers delivered with my old bike."
  40 + And I fill in "Fixed cost" with "8.00"
  41 + And I fill in "Order's minimum price for free delivery" with "35.50"
  42 + When I press "Add"
  43 + Then I should see "Bike" within ".delivery-method"
  44 +
  45 + @selenium
  46 + Scenario: create new pickup
  47 + Given I follow "Shopping basket"
  48 + And I check "Enable shopping basket"
  49 + And I follow "New delivery or pickup"
  50 + And I select "Pickup" from "Type"
  51 + And I fill in "Name" with "Bar"
  52 + And I fill in "Description" with "Come to my bar and pick it yourself."
  53 + And I fill in "Fixed cost" with "0.00"
  54 + When I press "Add"
  55 + Then I should see "Bar"
  56 +
  57 + @selenium
  58 + Scenario: remove delivery
  59 + Given I follow "Shopping basket"
  60 + And I check "Enable shopping basket"
  61 + And I follow "New delivery or pickup"
  62 + And I fill in "Name" with "Bike"
  63 + When I press "Add"
  64 + Then I should see "Bike"
  65 + And I follow "Remove" within ".delivery-method"
  66 + When I confirm the browser dialog
  67 + Then I should see "Bike"
  68 +
  69 + @selenium
  70 + Scenario: edit delivery
  71 + Given I follow "Shopping basket"
  72 + And I check "Enable shopping basket"
  73 + And I follow "New delivery or pickup"
  74 + And I fill in "Name" with "Bike"
  75 + When I press "Add"
  76 + Then I should see "Bike"
  77 + And I follow "Edit" within ".delivery-method"
  78 + And I fill in "Name" with "Car"
  79 + When I press "Save"
  80 + Then I should not see "Bike"
  81 + Then I should see "Car"
... ...
plugins/shopping_cart/features/delivery_client.feature 0 → 100644
... ... @@ -0,0 +1,77 @@
  1 +Feature: delivery client
  2 + As an enterprise's client
  3 + I want to choose the delivery method
  4 + In order to receive my procucts properly
  5 +
  6 + Background:
  7 + Given "ShoppingCart" plugin is enabled
  8 + And "Delivery" plugin is enabled
  9 + And the following users
  10 + | login | name | email |
  11 + | moe | Moe | moe@springfield.com |
  12 + | homer | Homer | homer@springfield.com |
  13 + And the following enterprise
  14 + | identifier | name | owner |
  15 + | moes-tavern | Moes Tavern | moe |
  16 + And the shopping basket is enabled on "Moes Tavern"
  17 + And the following product_categories
  18 + | name |
  19 + | Beer |
  20 + | Snacks |
  21 + And the following products
  22 + | owner | category | name | price |
  23 + | moes-tavern | beer | Duff | 3.00 |
  24 + | moes-tavern | snacks | French fries | 7.00 |
  25 + And "moes-tavern" has the following delivery methods
  26 + | delivery_type | name | description | fixed_cost | free_over_price |
  27 + | deliver | Bike | My good old bike. | 8.00 | 10.00 |
  28 + | pickup | Bar | Come to my bar and drink it! | 0.00 | 0.00 |
  29 + And feature "products_for_enterprises" is enabled on environment
  30 + And I am logged in as "homer"
  31 + And I go to moes-tavern's products page
  32 +
  33 + @selenium
  34 + Scenario: choose deliver method for purchase
  35 + Given I follow "Add to basket"
  36 + And I follow "Add to basket"
  37 + And I should see "Show basket"
  38 + And I follow "Show basket"
  39 + And I follow "Shopping checkout"
  40 + And I fill in "Contact phone" with "123456789"
  41 + When I select "Bike ($8.00)" from "Option"
  42 + Then I should see "My good old bike." within ".instructions"
  43 + And I should see "Address"
  44 + And I should see "Bike" within "#delivery-name"
  45 + And I should see "8.00" within "#delivery-price"
  46 +
  47 + @selenium
  48 + Scenario: choose pickup method for purchase
  49 + Given I follow "Add to basket"
  50 + And I follow "Add to basket"
  51 + And I should see "Show basket"
  52 + And I follow "Show basket"
  53 + And I follow "Shopping checkout"
  54 + And I fill in "Contact phone" with "123456789"
  55 + When I select "Bar" from "Option"
  56 + Then I should see "Come to my bar and drink it!" within ".instructions"
  57 + And I should not see "Address"
  58 + And I should see "Bar" within "#delivery-name"
  59 + And I should see "0.00" within "#delivery-price"
  60 +
  61 + @selenium
  62 + Scenario: gets free delivery due to free over price
  63 + Given I follow "Add to basket"
  64 + And I follow "Add to basket"
  65 + And I follow "Add to basket"
  66 + And I follow "Add to basket"
  67 + And I follow "Add to basket"
  68 + And I follow "Add to basket"
  69 + And I should see "Show basket"
  70 + And I follow "Show basket"
  71 + And I follow "Shopping checkout"
  72 + And I fill in "Contact phone" with "123456789"
  73 + When I select "Bike ($8.00)" from "Option"
  74 + Then I should see "My good old bike." within ".instructions"
  75 + And I should see "Address"
  76 + And I should see "Bike" within "#delivery-name"
  77 + And I should see "0.00" within "#delivery-price"
... ...
plugins/shopping_cart/features/step_definitions/orders_steps.rb
1   -Given /^"([^""]*)" has the following delivery methods$/ do |name, table|
2   - enterprise = Enterprise.find_by_name(name) || Enterprise[name]
3   - table.hashes.map{|item| item.dup}.each do |item|
4   - delivery_method = enterprise.delivery_methods.build
5   - delivery_method.update_attributes(item)
6   - end
7   -end
8   -
9 1 Given /^the following purchase from "([^""]*)" on "([^""]*)" that is "([^""]*)"$/ do |consumer_identifier, enterprise_identifier, status, table|
10 2 consumer = Person.find_by_name(consumer_identifier) || Person[consumer_identifier]
11 3 enterprise = Enterprise.find_by_name(enterprise_identifier) || Enterprise[enterprise_identifier]
... ...
plugins/shopping_cart/lib/shopping_cart_plugin/cart_helper.rb
... ... @@ -59,7 +59,7 @@ module ShoppingCartPlugin::CartHelper
59 59 @order
60 60 end
61 61  
62   - def items_table(items, profile, delivery_method = nil, by_mail = false)
  62 + def items_table(items, delivery_method = nil, by_mail = false)
63 63 # partial key needed in mailer context
64 64 render partial: 'shopping_cart_plugin/items', locals: {order: build_order(items, delivery_method), by_mail: by_mail}
65 65 end
... ...
plugins/shopping_cart/test/functional/shopping_cart_plugin_controller_test.rb
1   -require File.dirname(__FILE__) + '/../../../../test/test_helper'
2   -require File.dirname(__FILE__) + '/../../controllers/shopping_cart_plugin_controller'
  1 +require 'test_helper'
  2 +require_relative '../../controllers/shopping_cart_plugin_controller'
3 3  
4 4 # Re-raise errors caught by the controller.
5 5 class ShoppingCartPluginController; def rescue_action(e) raise e end; end
... ... @@ -12,7 +12,7 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
12 12 @response = ActionController::TestResponse.new
13 13 @profile = fast_create(Enterprise)
14 14 @profile.contact_email = 'enterprise@noosfero.org';@profile.save
15   - @product = fast_create(Product, :profile_id => @profile.id)
  15 + @product = fast_create(Product, profile_id: @profile.id)
16 16 end
17 17 attr_reader :profile
18 18 attr_reader :product
... ... @@ -23,22 +23,22 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
23 23 end
24 24  
25 25 should 'add a new product to cart' do
26   - get :add, :id => product.id
  26 + get :add, id: product.id
27 27  
28 28 assert product_in_cart?(product)
29 29 assert_equal 1, product_quantity(product)
30 30 end
31 31  
32 32 should 'grow quantity through add' do
33   - get :add, :id => product.id
  33 + get :add, id: product.id
34 34 assert_equal 1, product_quantity(product)
35 35  
36   - get :add, :id => product.id
  36 + get :add, id: product.id
37 37 assert_equal 2, product_quantity(product)
38 38 end
39 39  
40 40 should 'not add product to cart if it does not exists' do
41   - assert_nothing_raised { get :add, :id => 9999 }
  41 + assert_nothing_raised { get :add, id: 9999 }
42 42  
43 43 refute product_in_cart?(product)
44 44 refute response_ok?
... ... @@ -46,10 +46,10 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
46 46 end
47 47  
48 48 should 'remove cart if the product being removed is the last one' do
49   - get :add, :id => product.id
  49 + get :add, id: product.id
50 50 assert cart?
51 51  
52   - get :remove, :id => product.id
  52 + get :remove, id: product.id
53 53 refute cart?
54 54 end
55 55  
... ... @@ -57,25 +57,25 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
57 57 instantiate_cart
58 58 refute cart?
59 59  
60   - assert_nothing_raised { get :remove, :id => 9999 }
  60 + assert_nothing_raised { get :remove, id: 9999 }
61 61 refute response_ok?
62 62 assert_equal 2, reponse_error_code
63 63 end
64 64  
65 65 should 'just remove product if there are other products on cart' do
66   - another_product = fast_create(Product, :profile_id => profile.id)
67   - get :add, :id => product.id
68   - get :add, :id => another_product.id
  66 + another_product = fast_create(Product, profile_id: profile.id)
  67 + get :add, id: product.id
  68 + get :add, id: another_product.id
69 69  
70   - get :remove, :id => product.id
  70 + get :remove, id: product.id
71 71 assert cart?
72 72 refute product_in_cart?(product)
73 73 end
74 74  
75 75 should 'not try to remove a product that is not in the cart' do
76   - get :add, :id => product.id
  76 + get :add, id: product.id
77 77 assert cart?
78   - assert_nothing_raised { get :remove, :id => 9999 }
  78 + assert_nothing_raised { get :remove, id: 9999 }
79 79  
80 80 refute response_ok?
81 81 assert_equal 4, reponse_error_code
... ... @@ -91,17 +91,17 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
91 91 end
92 92  
93 93 should 'list products without errors' do
94   - get :add, :id => product.id
  94 + get :add, id: product.id
95 95  
96 96 assert_nothing_raised { get :list }
97 97 assert response_ok?
98 98 end
99 99  
100 100 should 'update the quantity of a product' do
101   - get :add, :id => product.id
  101 + get :add, id: product.id
102 102 assert_equal 1, product_quantity(product)
103 103  
104   - get :update_quantity, :id => product.id, :quantity => 3
  104 + get :update_quantity, id: product.id, quantity: 3
105 105 assert_equal 3, product_quantity(product)
106 106 end
107 107  
... ... @@ -109,36 +109,36 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
109 109 instantiate_cart
110 110 refute cart?
111 111  
112   - assert_nothing_raised { get :update_quantity, :id => 9999, :quantity => 3 }
  112 + assert_nothing_raised { get :update_quantity, id: 9999, quantity: 3 }
113 113 refute response_ok?
114 114 assert_equal 2, reponse_error_code
115 115 end
116 116  
117 117 should 'not try to update the quantity of a product that is not in the cart' do
118   - get :add, :id => product.id
  118 + get :add, id: product.id
119 119 assert cart?
120   - assert_nothing_raised { get :update_quantity, :id => 9999, :quantity => 3 }
  120 + assert_nothing_raised { get :update_quantity, id: 9999, quantity: 3 }
121 121  
122 122 refute response_ok?
123 123 assert_equal 4, reponse_error_code
124 124 end
125 125  
126 126 should 'not update the quantity of a product with a invalid value' do
127   - get :add, :id => product.id
  127 + get :add, id: product.id
128 128  
129   - assert_nothing_raised { get :update_quantity, :id => product.id, :quantity => -1}
  129 + assert_nothing_raised { get :update_quantity, id: product.id, quantity: -1}
130 130 refute response_ok?
131 131 assert_equal 5, reponse_error_code
132 132  
133   - assert_nothing_raised { get :update_quantity, :id => product.id, :quantity => 'asdf'}
  133 + assert_nothing_raised { get :update_quantity, id: product.id, quantity: 'asdf'}
134 134 refute response_ok?
135 135 assert_equal 5, reponse_error_code
136 136 end
137 137  
138 138 should 'clean the cart' do
139   - another_product = fast_create(Product, :profile_id => profile.id)
140   - get :add, :id => product.id
141   - get :add, :id => another_product.id
  139 + another_product = fast_create(Product, profile_id: profile.id)
  140 + get :add, id: product.id
  141 + get :add, id: another_product.id
142 142  
143 143 assert_nothing_raised { get :clean }
144 144 refute cart?
... ... @@ -151,12 +151,11 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
151 151 end
152 152  
153 153 should 'register order on send request' do
154   - product1 = fast_create(Product, :profile_id => profile.id, :price => 1.99)
155   - product2 = fast_create(Product, :profile_id => profile.id, :price => 2.23)
156   - @controller.stubs(:cart).returns({ :profile_id => profile.id, :items => {product1.id => 1, product2.id => 2}})
  154 + product1 = fast_create(Product, profile_id: profile.id, price: 1.99)
  155 + product2 = fast_create(Product, profile_id: profile.id, price: 2.23)
  156 + @controller.stubs(:cart).returns({ profile_id: profile.id, items: {product1.id => 1, product2.id => 2}})
157 157 assert_difference 'OrdersPlugin::Order.count', 1 do
158   - post :send_request,
159   - :customer => {:name => "Manuel", :email => "manuel@ceu.com"}
  158 + xhr :post, :send_request, order: {consumer_data: {name: "Manuel", email: "manuel@ceu.com"}}
160 159 end
161 160  
162 161 order = OrdersPlugin::Order.last
... ... @@ -165,15 +164,14 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
165 164 assert_equal 1, order.products_list[product1.id][:quantity]
166 165 assert_equal 2.23, order.products_list[product2.id][:price]
167 166 assert_equal 2, order.products_list[product2.id][:quantity]
168   - assert_equal 'confirmed', order.status
  167 + assert_equal 'ordered', order.status
169 168 end
170 169  
171 170 should 'register order on send request and not crash if product is not defined' do
172   - product1 = fast_create(Product, :profile_id => profile.id)
173   - @controller.stubs(:cart).returns({ :profile_id => profile.id, :items => {product1.id => 1}})
  171 + product1 = fast_create(Product, profile_id: profile.id)
  172 + @controller.stubs(:cart).returns({ profile_id: profile.id, items: {product1.id => 1}})
174 173 assert_difference 'OrdersPlugin::Order.count', 1 do
175   - post :send_request,
176   - :customer => {:name => "Manuel", :email => "manuel@ceu.com"}
  174 + xhr :post, :send_request, order: {consumer_data: {name: "Manuel", email: "manuel@ceu.com"}}
177 175 end
178 176  
179 177 order = OrdersPlugin::Order.last
... ... @@ -182,16 +180,15 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
182 180 end
183 181  
184 182 should 'clean the cart after placing the order' do
185   - product1 = fast_create(Product, :profile_id => profile.id)
186   - post :add, :id => product1.id
187   - post :send_request, :customer => { :name => "Manuel", :email => "manuel@ceu.com" }
  183 + product1 = fast_create(Product, profile_id: profile.id)
  184 + post :add, id: product1.id
  185 + xhr :post, :send_request, order: {consumer_data: {name: "Manuel", email: "manuel@ceu.com"}}
188 186 refute cart?, "cart expected to be empty!"
189 187 end
190 188  
191 189 should 'not allow buy without any cart' do
192 190 get :buy
193   - refute json_response[:ok]
194   - assert_equal 2, json_response['error']['code']
  191 + assert_response :redirect
195 192 end
196 193  
197 194 private
... ... @@ -225,8 +222,8 @@ class ShoppingCartPluginControllerTest &lt; ActionController::TestCase
225 222 # temporary hack...if I don't do this the session stays as an Array instead
226 223 # of a TestSession
227 224 def instantiate_cart
228   - get :add, :id => product.id
229   - get :remove, :id => product.id
  225 + get :add, id: product.id
  226 + get :remove, id: product.id
230 227 end
231 228  
232 229 end
... ...
plugins/shopping_cart/test/functional/shopping_cart_plugin_myprofile_controller_test.rb
1   -require File.dirname(__FILE__) + '/../../../../test/test_helper'
  1 +require 'test_helper'
2 2  
3 3 class ShoppingCartPluginMyprofileControllerTest < ActionController::TestCase
4 4  
5   - TIME_FORMAT = '%Y-%m-%d'
6   -
7 5 def setup
8 6 @profile = fast_create(Enterprise)
9 7 @admin = create_user('admin').person
... ... @@ -13,115 +11,23 @@ class ShoppingCartPluginMyprofileControllerTest &lt; ActionController::TestCase
13 11 attr_reader :profile
14 12  
15 13 should 'be able to enable shopping cart' do
16   - settings.enabled = false
17   - settings.save!
18   - post :edit, :profile => profile.identifier, :settings => {:enabled => '1'}
19   -
20   - assert settings.enabled
21   - end
22   -
23   - should 'be able to disable shopping cart' do
24   - settings.enabled = true
25   - settings.save!
26   - post :edit, :profile => profile.identifier, :settings => {:enabled => '0'}
27   -
28   - refute settings.enabled
29   - end
  14 + profile.shopping_cart_settings.enabled = false
  15 + profile.shopping_cart_settings.save!
30 16  
31   - should 'be able to enable shopping cart delivery' do
32   - settings.delivery = false
33   - settings.save!
34   - post :edit, :profile => profile.identifier, :settings => {:delivery => '1'}
  17 + post :edit, profile: profile.identifier, settings: {enabled: '1'}
  18 + profile.reload
35 19  
36   - assert settings.delivery
  20 + assert profile.shopping_cart_settings.enabled
37 21 end
38 22  
39   - should 'be able to disable shopping cart delivery' do
40   - settings.delivery = true
41   - settings.save!
42   - post :edit, :profile => profile.identifier, :settings => {:delivery => '0'}
43   -
44   - refute settings.delivery
45   - end
46   -
47   - should 'be able to choose the delivery price' do
48   - price = 4.35
49   - post :edit, :profile => profile.identifier, :settings => {:delivery_price => price}
50   -
51   - assert settings.delivery_price == price.to_s
52   - end
53   -
54   - # FIXME
55   - should 'be able to choose delivery_options' do
56   - delivery_options = {:options => ['car', 'bike'], :prices => ['20', '5']}
57   - post :edit, :profile => profile.identifier, :settings => {:delivery_options => delivery_options}
58   -
59   - assert_equal '20', settings.delivery_options['car']
60   - assert_equal '5', settings.delivery_options['bike']
61   - end
62   -
63   - should 'filter the reports correctly' do
64   - another_profile = fast_create(Enterprise)
65   - po1 = OrdersPlugin::Sale.create! :profile => profile, :status => 'confirmed'
66   - po2 = OrdersPlugin::Sale.create! :profile => profile, :status => 'shipped'
67   - po3 = OrdersPlugin::Sale.create! :profile => profile, :status => 'confirmed'
68   - po3.created_at = 1.year.ago
69   - po3.save!
70   - po4 = OrdersPlugin::Sale.create! :profile => another_profile, :status => 'confirmed'
71   -
72   - post :reports,
73   - :profile => profile.identifier,
74   - :from => (Time.now - 1.day).strftime(TIME_FORMAT),
75   - :to => (Time.now + 1.day).strftime(TIME_FORMAT),
76   - :filter_status => 'confirmed'
77   -
78   - assert_includes assigns(:orders), po1
79   - assert_not_includes assigns(:orders), po2
80   - assert_not_includes assigns(:orders), po3
81   - assert_not_includes assigns(:orders), po4
82   - end
83   -
84   - should 'group filtered orders products and quantities' do
85   - p1 = fast_create(Product, :profile_id => profile.id, :price => 1, :name => 'p1')
86   - p2 = fast_create(Product, :profile_id => profile.id, :price => 2, :name => 'p2')
87   - p3 = fast_create(Product, :profile_id => profile.id, :price => 3)
88   - po1_products = {p1.id => {:quantity => 1, :price => p1.price, :name => p1.name}, p2.id => {:quantity => 2, :price => p2.price, :name => p2.name }}
89   - po2_products = {p2.id => {:quantity => 1, :price => p2.price, :name => p2.name }, p3.id => {:quantity => 2, :price => p3.price, :name => p3.name}}
90   - po1 = OrdersPlugin::Sale.create! :profile => profile, :products_list => po1_products, :status => 'confirmed'
91   - po2 = OrdersPlugin::Sale.create! :profile => profile, :products_list => po2_products, :status => 'confirmed'
92   -
93   - post :reports,
94   - :profile => profile.identifier,
95   - :from => (Time.now - 1.day).strftime(TIME_FORMAT),
96   - :to => (Time.now + 1.day).strftime(TIME_FORMAT),
97   - :filter_status => 'confirmed'
98   -
99   - lineitem1 = ShoppingCartPlugin::LineItem.new(p1.id, p1.name)
100   - lineitem1.quantity = 1
101   - lineitem2 = ShoppingCartPlugin::LineItem.new(p2.id, p2.name)
102   - lineitem2.quantity = 3
103   - lineitem3 = ShoppingCartPlugin::LineItem.new(p3.id, p3.name)
104   - lineitem3.quantity = 2
105   - hash = {p1.id => lineitem1, p2.id => lineitem2, p3.id => lineitem3}
106   -
107   - assert_equal hash, assigns(:products)
108   - end
  23 + should 'be able to disable shopping cart' do
  24 + profile.shopping_cart_settings.enabled = true
  25 + profile.shopping_cart_settings.save!
109 26  
110   - should 'be able to update the order status' do
111   - po = OrdersPlugin::Sale.create!(:profile => profile, :status => 'confirmed')
  27 + post :edit, profile: profile.identifier, settings: {enabled: '0'}
  28 + profile.reload
112 29  
113   - post :update_order_status,
114   - :profile => profile.identifier,
115   - :order_id => po.id,
116   - :order_status => 'confirmed'
117   - po.reload
118   - assert_equal 'confirmed', po.status
  30 + refute profile.shopping_cart_settings.enabled
119 31 end
120 32  
121   - private
122   -
123   - def settings
124   - @profile.reload
125   - profile.shopping_cart_settings
126   - end
127 33 end
... ...
plugins/shopping_cart/test/unit/shopping_cart_plugin/cart_helper_test.rb
1   -require File.dirname(__FILE__) + '/../../../../../test/test_helper'
  1 +require 'test_helper'
2 2  
3 3 class ShoppingCartPlugin::CartHelperTest < ActiveSupport::TestCase
4 4  
... ... @@ -41,19 +41,4 @@ class ShoppingCartPlugin::CartHelperTest &lt; ActiveSupport::TestCase
41 41 assert_equal "#{environment.currency_unit}13#{environment.currency_separator}70", float_to_currency_cart(value,environment)
42 42 end
43 43  
44   - should 'return a table of items' do
45   - enterprise = Enterprise.new(name: "Test Enterprise", identifier: "test-enterprise")
46   - enterprise.environment = Environment.default
47   - enterprise.save!
48   -
49   - product_category = fast_create(ProductCategory, :name => 'Products')
50   - product = fast_create(Product, :name => 'test product1', :product_category_id => product_category.id, :profile_id => enterprise.id)
51   - setting = Noosfero::Plugin::Settings.new(enterprise, ShoppingCartPlugin)
52   - setting.delivery = true
53   - setting.save!
54   -
55   - assert_match 'table id="cart-items-table"', items_table([product], enterprise)
56   - assert_match '<td>test product1</td>', items_table([product], enterprise)
57   - end
58   -
59 44 end
... ...
plugins/shopping_cart/views/shopping_cart_plugin/buy.html.erb
... ... @@ -39,7 +39,7 @@
39 39 <fieldset>
40 40 <legend><%=s_('Your Order')%></legend>
41 41 <% supplier_delivery = @order.supplier_delivery || profile.delivery_methods.first %>
42   - <%= items_table @cart[:items], @profile, supplier_delivery %>
  42 + <%= items_table @cart[:items], supplier_delivery %>
43 43 </fieldset>
44 44 </div>
45 45  
... ...
plugins/shopping_cart/views/shopping_cart_plugin/mailer/customer_notification.html.erb
... ... @@ -18,9 +18,11 @@
18 18 <li><b><%= c_('Email') %>: </b><%= @order.consumer_data[:email] %></li>
19 19 <li><b><%= _('Phone number') %>: </b><%= @order.consumer_data[:contact_phone] %></li>
20 20  
21   - <li><b><%= _("Payment's method") %>: </b><%= _ OrdersPlugin::Order::PaymentMethods[@order.payment_data[:method].to_sym].call %></li>
22   - <% if @order.payment_data[:method] == 'money' %>
23   - <li><b><%= s_('shopping_cart|Change') %>: </b><%= @order.payment_data[:change] %></li>
  21 + <% if @order.payment_data[:method] %>
  22 + <li><b><%= _("Payment's method") %>: </b><%= _ OrdersPlugin::Order::PaymentMethods[@order.payment_data[:method].to_sym].call %></li>
  23 + <% if @order.payment_data[:method] == 'money' %>
  24 + <li><b><%= s_('shopping_cart|Change') %>: </b><%= @order.payment_data[:change] %></li>
  25 + <% end %>
24 26 <% end %>
25 27  
26 28 <li><b><%= _('Delivery or pickup') %>:</b></li>
... ... @@ -59,7 +61,7 @@
59 61 </ul>
60 62  
61 63 <p><%=_('Here are the products you bought:')%></p>
62   - <%= items_table(@items, @order.profile, @order.supplier_delivery, true) %>
  64 + <%= items_table(@items, @order.supplier_delivery, true) %>
63 65 <p>
64 66 --<br/>
65 67 <%=_('Thanks for buying with us!')%><br/>
... ...
plugins/shopping_cart/views/shopping_cart_plugin/mailer/supplier_notification.html.erb
... ... @@ -16,9 +16,11 @@
16 16 <li><b><%= c_('Email') %>: </b><%= @order.consumer_data[:email] %></li>
17 17 <li><b><%= _('Phone number') %>: </b><%= @order.consumer_data[:contact_phone] %></li>
18 18  
19   - <li><b><%= _('Payment') %>: </b><%= OrdersPlugin::Order::PaymentMethods[@order.payment_data[:method].to_sym].call %></li>
20   - <% if @order.payment_data[:method] == 'money' %>
21   - <li><b><%= s_('shopping_cart|Change') %>: </b><%= @order.payment_data[:change] %></li>
  19 + <% if @order.payment_data[:method] %>
  20 + <li><b><%= _('Payment') %>: </b><%= OrdersPlugin::Order::PaymentMethods[@order.payment_data[:method].to_sym].call %></li>
  21 + <% if @order.payment_data[:method] == 'money' %>
  22 + <li><b><%= s_('shopping_cart|Change') %>: </b><%= @order.payment_data[:change] %></li>
  23 + <% end %>
22 24 <% end %>
23 25  
24 26 <% if !@order.consumer_delivery_data[:address].blank? || !@order.consumer_delivery_data[:city].blank? || !@order.consumer_delivery_data[:zip_code].blank? || !@order.consumer_delivery_data[:district].blank? || !@order.consumer_delivery_data[:address_reference].blank? %>
... ... @@ -51,7 +53,7 @@
51 53 </ul>
52 54  
53 55 <p><%=_('And here are the items bought by this customer:')%></p>
54   - <%= items_table(@items, @order.profile, @order.supplier_delivery, true) %>
  56 + <%= items_table(@items, @order.supplier_delivery, true) %>
55 57 <p>
56 58 --<br/>
57 59 <%=_('If there are any problems with this email contact the admin of %s.') % @environment.name %>
... ...
test/fixtures/environments.yml
... ... @@ -3,6 +3,7 @@ colivre_net:
3 3 id: 1
4 4 name: 'Colivre.net'
5 5 contact_email: 'colivre@localhost.localdomain'
  6 + noreply_email: 'noreply@localhost.localdomain'
6 7 is_default: true
7 8 theme: 'noosfero'
8 9 anhetegua_net:
... ... @@ -10,3 +11,4 @@ anhetegua_net:
10 11 name: 'Anheteguá'
11 12 is_default: false
12 13 contact_email: 'anhetegua@localhost.localdomain'
  14 + noreply_email: 'noreply@localhost.localdomain'
... ...