Commit 255387618964b6796594fdaf43158605cd573356
1 parent
c99dd6da
Exists in
master
and in
21 other branches
Fix tests and plugins dependencies
Showing
33 changed files
with
362 additions
and
804 deletions
Show diff stats
@@ -0,0 +1,58 @@ | @@ -0,0 +1,58 @@ | ||
1 | +module CodeNumbering | ||
2 | + module ClassMethods | ||
3 | + def code_numbering field, options = {} | ||
4 | + class_attribute :code_numbering_field | ||
5 | + class_attribute :code_numbering_options | ||
6 | + | ||
7 | + self.code_numbering_field = field | ||
8 | + self.code_numbering_options = options | ||
9 | + | ||
10 | + before_create :create_code_numbering | ||
11 | + | ||
12 | + include CodeNumbering::InstanceMethods | ||
13 | + end | ||
14 | + end | ||
15 | + | ||
16 | + module InstanceMethods | ||
17 | + | ||
18 | + def code | ||
19 | + self.attributes[self.code_numbering_field.to_s] | ||
20 | + end | ||
21 | + | ||
22 | + def code_scope | ||
23 | + scope = self.code_numbering_options[:scope] | ||
24 | + case scope | ||
25 | + when Symbol | ||
26 | + self.send scope | ||
27 | + when Proc | ||
28 | + instance_exec &scope | ||
29 | + else | ||
30 | + self.class | ||
31 | + end | ||
32 | + end | ||
33 | + | ||
34 | + def code_maximum | ||
35 | + self.code_scope.maximum(self.code_numbering_field) || 0 | ||
36 | + end | ||
37 | + | ||
38 | + def create_code_numbering | ||
39 | + max = self.code_numbering_options[:start].to_i - 1 if self.code_numbering_options[:start] | ||
40 | + max = self.code_maximum | ||
41 | + self.send "#{self.code_numbering_field}=", max+1 | ||
42 | + end | ||
43 | + | ||
44 | + def reset_scope_code_numbering | ||
45 | + max = self.code_numbering_options[:start].to_i - 1 if self.code_numbering_options[:start] | ||
46 | + max ||= 1 | ||
47 | + | ||
48 | + self.code_scope.order(:created_at).each do |record| | ||
49 | + record.update_column self.code_numbering_field, max | ||
50 | + max += 1 | ||
51 | + end | ||
52 | + self.reload | ||
53 | + end | ||
54 | + | ||
55 | + end | ||
56 | +end | ||
57 | + | ||
58 | +ActiveRecord::Base.extend CodeNumbering::ClassMethods |
@@ -0,0 +1,72 @@ | @@ -0,0 +1,72 @@ | ||
1 | + | ||
2 | +module SplitDatetime | ||
3 | + | ||
4 | + class << self | ||
5 | + def nil_time | ||
6 | + Time.parse "#{Time.now.hour}:0:0" | ||
7 | + end | ||
8 | + def nil_date | ||
9 | + Date.today | ||
10 | + end | ||
11 | + | ||
12 | + def to_time datetime | ||
13 | + datetime = self.nil_time if datetime.blank? | ||
14 | + datetime.to_formatted_s :time | ||
15 | + end | ||
16 | + def to_date datetime | ||
17 | + datetime = self.nil_date if datetime.blank? | ||
18 | + datetime.strftime '%d/%m/%Y' | ||
19 | + end | ||
20 | + def set_time datetime, value | ||
21 | + value = if value.blank? | ||
22 | + self.nil_time | ||
23 | + elsif value.kind_of? String | ||
24 | + Time.parse value | ||
25 | + else | ||
26 | + value.to_time | ||
27 | + end | ||
28 | + datetime = self.nil_date if datetime.blank? | ||
29 | + | ||
30 | + Time.mktime(datetime.year, datetime.month, datetime.day, value.hour, value.min, value.sec).to_datetime | ||
31 | + end | ||
32 | + def set_date datetime, value | ||
33 | + value = if value.blank? | ||
34 | + self.nil_date | ||
35 | + elsif value.kind_of? String | ||
36 | + DateTime.strptime value, '%d/%m/%Y' | ||
37 | + else | ||
38 | + value.to_time | ||
39 | + end | ||
40 | + datetime = nil_time if datetime.blank? | ||
41 | + | ||
42 | + Time.mktime(value.year, value.month, value.day, datetime.hour, datetime.min, datetime.sec).to_datetime | ||
43 | + end | ||
44 | + end | ||
45 | + | ||
46 | + module SplitMethods | ||
47 | + | ||
48 | + def split_datetime attr | ||
49 | + define_method "#{attr}_time" do | ||
50 | + datetime = send attr | ||
51 | + SplitDatetime.to_time datetime | ||
52 | + end | ||
53 | + define_method "#{attr}_date" do | ||
54 | + datetime = send attr | ||
55 | + SplitDatetime.to_date datetime | ||
56 | + end | ||
57 | + define_method "#{attr}_time=" do |value| | ||
58 | + datetime = send attr | ||
59 | + send "#{attr}=", SplitDatetime.set_time(datetime, value) | ||
60 | + end | ||
61 | + define_method "#{attr}_date=" do |value| | ||
62 | + datetime = send attr | ||
63 | + send "#{attr}=", SplitDatetime.set_date(datetime, value) | ||
64 | + end | ||
65 | + end | ||
66 | + | ||
67 | + end | ||
68 | + | ||
69 | +end | ||
70 | + | ||
71 | +Class.extend SplitDatetime::SplitMethods | ||
72 | +ActiveRecord::Base.extend SplitDatetime::SplitMethods |
plugins/delivery/features/delivery_admin.feature
@@ -1,81 +0,0 @@ | @@ -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/delivery/features/delivery_client.feature
@@ -1,77 +0,0 @@ | @@ -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/delivery/features/step_definitions/delivery_steps.rb
@@ -1,14 +0,0 @@ | @@ -1,14 +0,0 @@ | ||
1 | -Given /^the shopping basket is (enabled|disabled) on "([^""]*)"$/ do |status, name| | ||
2 | - status = status == 'enabled' | ||
3 | - enterprise = Enterprise.find_by_name(name) || Enterprise[name] | ||
4 | - settings = enterprise.shopping_cart_settings({:enabled => status}) | ||
5 | - settings.save! | ||
6 | -end | ||
7 | - | ||
8 | -Given /^"([^""]*)" has the following delivery methods$/ do |name, table| | ||
9 | - enterprise = Enterprise.find_by_name(name) || Enterprise[name] | ||
10 | - table.hashes.map{|item| item.dup}.each do |item| | ||
11 | - delivery_method = enterprise.delivery_methods.build | ||
12 | - delivery_method.update_attributes(item) | ||
13 | - end | ||
14 | -end |
plugins/fb_app/install.rb
plugins/orders/lib/code_numbering.rb
@@ -1,58 +0,0 @@ | @@ -1,58 +0,0 @@ | ||
1 | -module CodeNumbering | ||
2 | - module ClassMethods | ||
3 | - def code_numbering field, options = {} | ||
4 | - class_attribute :code_numbering_field | ||
5 | - class_attribute :code_numbering_options | ||
6 | - | ||
7 | - self.code_numbering_field = field | ||
8 | - self.code_numbering_options = options | ||
9 | - | ||
10 | - before_create :create_code_numbering | ||
11 | - | ||
12 | - include CodeNumbering::InstanceMethods | ||
13 | - end | ||
14 | - end | ||
15 | - | ||
16 | - module InstanceMethods | ||
17 | - | ||
18 | - def code | ||
19 | - self.attributes[self.code_numbering_field.to_s] | ||
20 | - end | ||
21 | - | ||
22 | - def code_scope | ||
23 | - scope = self.code_numbering_options[:scope] | ||
24 | - case scope | ||
25 | - when Symbol | ||
26 | - self.send scope | ||
27 | - when Proc | ||
28 | - instance_exec &scope | ||
29 | - else | ||
30 | - self.class | ||
31 | - end | ||
32 | - end | ||
33 | - | ||
34 | - def code_maximum | ||
35 | - self.code_scope.maximum(self.code_numbering_field) || 0 | ||
36 | - end | ||
37 | - | ||
38 | - def create_code_numbering | ||
39 | - max = self.code_numbering_options[:start].to_i - 1 if self.code_numbering_options[:start] | ||
40 | - max = self.code_maximum | ||
41 | - self.send "#{self.code_numbering_field}=", max+1 | ||
42 | - end | ||
43 | - | ||
44 | - def reset_scope_code_numbering | ||
45 | - max = self.code_numbering_options[:start].to_i - 1 if self.code_numbering_options[:start] | ||
46 | - max ||= 1 | ||
47 | - | ||
48 | - self.code_scope.order(:created_at).each do |record| | ||
49 | - record.update_column self.code_numbering_field, max | ||
50 | - max += 1 | ||
51 | - end | ||
52 | - self.reload | ||
53 | - end | ||
54 | - | ||
55 | - end | ||
56 | -end | ||
57 | - | ||
58 | -ActiveRecord::Base.extend CodeNumbering::ClassMethods |
plugins/orders/plugin.yml
plugins/orders_cycle/plugin.yml
plugins/orders_cycle/test/factories.rb
@@ -1,57 +0,0 @@ | @@ -1,57 +0,0 @@ | ||
1 | -module OrdersCyclePlugin::Factory | ||
2 | - | ||
3 | - def defaults_for_suppliers_plugin_supplier | ||
4 | - {:profile => build(Profile), | ||
5 | - :consumer => build(Profile)} | ||
6 | - end | ||
7 | - | ||
8 | - def defaults_for_suppliers_plugin_distributed_product attrs = {} | ||
9 | - profile = attrs[:profile] || build(Profile) | ||
10 | - {:profile => profile, :name => "product-#{factory_num_seq}", :price => 2.0, | ||
11 | - :product => build(Product, :enterprise => profile.profile, :price => 2.0), | ||
12 | - :supplier => build(SuppliersPlugin::Supplier, :profile => profile, :consumer => profile)} | ||
13 | - end | ||
14 | - | ||
15 | - def defaults_for_orders_cycle_plugin_offered_product attrs = {} | ||
16 | - hash = defaults_for_orders_cycle_plugin_product(attrs) | ||
17 | - profile = hash[:profile] | ||
18 | - hash.merge({ | ||
19 | - :from_products => [build(SuppliersPlugin::DistributedProduct, :profile => profile)]}) | ||
20 | - end | ||
21 | - | ||
22 | - def defaults_for_delivery_plugin_method | ||
23 | - {:profile => build(OrdersCyclePlugin::Profile), | ||
24 | - :name => "My delivery #{factory_num_seq.to_s}", | ||
25 | - :delivery_type => 'deliver'} | ||
26 | - end | ||
27 | - | ||
28 | - def defaults_for_delivery_plugin_option | ||
29 | - {:cycle => build(OrdersCyclePlugin::Cycle), | ||
30 | - :delivery_method => build(DeliveryPlugin::Method)} | ||
31 | - end | ||
32 | - | ||
33 | - def defaults_for_orders_plugin_order attrs = {} | ||
34 | - profile = attrs[:profile] || build(OrdersCyclePlugin::Profile) | ||
35 | - {:status => 'ordered', | ||
36 | - :cycle => build(OrdersCyclePlugin::Cycle, :profile => profile), | ||
37 | - :consumer => build(OrdersCyclePlugin::Profile), | ||
38 | - :supplier_delivery => build(DeliveryPlugin::Method, :profile => profile), | ||
39 | - :consumer_delivery => build(DeliveryPlugin::Method, :profile => profile)} | ||
40 | - end | ||
41 | - | ||
42 | - def defaults_for_orders_plugin_items | ||
43 | - {:order => build(OrdersPlugin::Order), | ||
44 | - :product => build(OrdersCyclePlugin::OfferedProduct), | ||
45 | - :quantity_shipped => 1.0, :quantity_ordered => 2.0, :quantity_accepted => 3.0, | ||
46 | - :price_shipped => 10.0, :price_ordered => 20.0, :price_accepted => 30.0} | ||
47 | - end | ||
48 | - | ||
49 | - def defaults_for_orders_cycle_plugin_cycle | ||
50 | - {:profile => build(OrdersCyclePlugin::Profile), :status => 'orders', | ||
51 | - :name => 'weekly', :start => Time.now, :finish => Time.now+1.days} | ||
52 | - end | ||
53 | - | ||
54 | -end | ||
55 | - | ||
56 | -Noosfero::Factory.register_extension OrdersCyclePlugin::Factory | ||
57 | - |
plugins/orders_cycle/test/functional/orders_cycle_plugin/order_controller_test.rb
@@ -1,12 +0,0 @@ | @@ -1,12 +0,0 @@ | ||
1 | -require "#{File.dirname(__FILE__)}/../../test_helper" | ||
2 | - | ||
3 | -class OrdersCyclePlugin::OrderControllerTest < Test::Unit::TestCase | ||
4 | - | ||
5 | - def setup | ||
6 | - @controller = OrdersCyclePluginOrderController.new | ||
7 | - @request = ActionController::TestRequest.new | ||
8 | - @response = ActionController::TestResponse.new | ||
9 | - end | ||
10 | - | ||
11 | - | ||
12 | -end |
plugins/orders_cycle/test/functional/orders_cycle_plugin/session_controller_test.rb
@@ -1,14 +0,0 @@ | @@ -1,14 +0,0 @@ | ||
1 | -require "#{File.dirname(__FILE__)}/../../test_helper" | ||
2 | - | ||
3 | -class OrdersCyclePlugin::CycleControllerTest < Test::Unit::TestCase | ||
4 | - | ||
5 | - def setup | ||
6 | - @controller = OrdersCyclePluginCycleController.new | ||
7 | - @request = ActionController::TestRequest.new | ||
8 | - @response = ActionController::TestResponse.new | ||
9 | - end | ||
10 | - | ||
11 | - should 'create a new cycle' do | ||
12 | - end | ||
13 | - | ||
14 | -end |
plugins/orders_cycle/test/test_helper.rb
plugins/orders_cycle/test/unit/orders_cycle_plugin/cycle_test.rb
@@ -1,27 +0,0 @@ | @@ -1,27 +0,0 @@ | ||
1 | -require "#{File.dirname(__FILE__)}/../../test_helper" | ||
2 | - | ||
3 | -class OrdersCyclePlugin::CycleTest < ActiveSupport::TestCase | ||
4 | - | ||
5 | - def setup | ||
6 | - @profile = Enterprise.create!(:name => "trocas verdes", :identifier => "trocas-verdes") | ||
7 | - @pc = ProductCategory.create!(:name => 'frutas', :environment_id => 1) | ||
8 | - @profile.products = [Product.create!(:name => 'banana', :product_category => @pc), | ||
9 | - Product.new(:name => 'mandioca', :product_category => @pc), Product.new(:name => 'alface', :product_category => @pc)] | ||
10 | - | ||
11 | - profile.offered_products = @profile.products.map{ |p| OrdersCyclePlugin::OfferedProduct.create!(:product => p) } | ||
12 | - DeliveryPlugin::Method.create! :name => 'at home', :delivery_type => 'pickup', :profile => @profile | ||
13 | - @cycle = OrdersCyclePlugin::Cycle.create!(:profile => @profile) | ||
14 | - end | ||
15 | - | ||
16 | - should 'add products from profile after create' do | ||
17 | - assert_equal @cycle.products.collect(&:product_id), @profile.products.collect(&:id) | ||
18 | - end | ||
19 | - | ||
20 | - should 'have at least one delivery method unless in edition status' do | ||
21 | - cycle = OrdersCyclePlugin::Cycle.create! :profile => @profile, :name => "Testes batidos", :start => DateTime.now, :status => 'edition' | ||
22 | - assert cycle | ||
23 | - cycle.status = 'orders' | ||
24 | - assert_nil cycle.save! | ||
25 | - end | ||
26 | - | ||
27 | -end |
plugins/orders_cycle/test/unit/orders_cycle_plugin/offered_product_test.rb
plugins/orders_cycle/test/unit/profile_test.rb
@@ -1,127 +0,0 @@ | @@ -1,127 +0,0 @@ | ||
1 | -require "#{File.dirname(__FILE__)}/../../test_helper" | ||
2 | - | ||
3 | -class OrdersCyclePlugin::ProfileTest < ActiveRecord::TestCase | ||
4 | - | ||
5 | - def setup | ||
6 | - @profile = build(Profile) | ||
7 | - @invisible_profile = build(Enterprise, :visible => false) | ||
8 | - @other_profile = build(Enterprise) | ||
9 | - @profile = build(OrdersCyclePlugin::profile, :profile => @profile) | ||
10 | - @self_supplier = build(OrdersCyclePlugin::Supplier, :consumer => @profile, :profile => @profile) | ||
11 | - @dummy_supplier = build(OrdersCyclePlugin::Supplier, :consumer => @profile, :profile => @dummy_profile) | ||
12 | - @other_supplier = build(OrdersCyclePlugin::Supplier, :consumer => @profile, :profile => @other_profile) | ||
13 | - end | ||
14 | - | ||
15 | - attr_accessor :profile, :invisible_profile, :other_profile, | ||
16 | - :self_supplier, :dummy_supplier, :other_supplier | ||
17 | - | ||
18 | - should 'respond to name methods' do | ||
19 | - profile.expects(:name).returns('name') | ||
20 | - assert_equal 'name', profile.name | ||
21 | - end | ||
22 | - | ||
23 | - should 'respond to dummy methods' do | ||
24 | - profile.dummy = true | ||
25 | - assert_equal true, profile.dummy? | ||
26 | - profile.dummy = false | ||
27 | - assert_equal false, profile.dummy | ||
28 | - end | ||
29 | - | ||
30 | - should "return closed cycles' date range" do | ||
31 | - DateTime.expects(:now).returns(1).at_least_once | ||
32 | - assert_equal 1..1, profile.orders_cycles_closed_date_range | ||
33 | - s1 = create(OrdersCyclePlugin::Cycle, :profile => profile, :start => Time.now-1.days, :finish => nil) | ||
34 | - s2 = create(OrdersCyclePlugin::Cycle, :profile => profile, :finish => Time.now+1.days, :start => Time.now) | ||
35 | - assert_equal (s1.start.to_date..s2.finish.to_date), profile.orders_cycles_closed_date_range | ||
36 | - end | ||
37 | - | ||
38 | - should 'return abbreviation or the name' do | ||
39 | - profile.name_abbreviation = 'coll.' | ||
40 | - profile.profile.name = 'collective' | ||
41 | - assert_equal 'coll.', profile.abbreviation_or_name | ||
42 | - profile.name_abbreviation = nil | ||
43 | - assert_equal 'collective', profile.abbreviation_or_name | ||
44 | - end | ||
45 | - | ||
46 | - ### | ||
47 | - # Products | ||
48 | - ### | ||
49 | - | ||
50 | - should "default products's margins when asked" do | ||
51 | - profile.update_attributes! :margin_percentage => 10 | ||
52 | - product = create(SuppliersPlugin::DistributedProduct, :profile => profile, :supplier => profile.self_supplier, | ||
53 | - :price => 10, :default_margin_percentage => false) | ||
54 | - cycle = create(OrdersCyclePlugin::Cycle, :profile => profile) | ||
55 | - sproduct = cycle.products.first | ||
56 | - sproduct.update_attributes! :margin_percentage => 5 | ||
57 | - cycleclosed = create(OrdersCyclePlugin::Cycle, :profile => profile, :status => 'closed') | ||
58 | - | ||
59 | - profile.orders_cycles_products_default_margins | ||
60 | - product.reload | ||
61 | - sproduct.reload | ||
62 | - assert_equal true, product.default_margin_percentage | ||
63 | - assert_equal sproduct.margin_percentage, profile.margin_percentage | ||
64 | - end | ||
65 | - | ||
66 | - should 'return not yet distributed products' do | ||
67 | - profile.save! | ||
68 | - other_profile.save! | ||
69 | - other_supplier.save! | ||
70 | - product = create(SuppliersPlugin::DistributedProduct, :profile => other_profile, :supplier => other_profile.self_supplier) | ||
71 | - profile.add_supplier_products other_supplier | ||
72 | - product2 = create(SuppliersPlugin::DistributedProduct, :profile => other_profile, :supplier => other_profile.self_supplier) | ||
73 | - assert_equal [product2], profile.not_distributed_products(other_supplier) | ||
74 | - end | ||
75 | - | ||
76 | - ### | ||
77 | - # Suppliers | ||
78 | - ### | ||
79 | - | ||
80 | - should 'add supplier' do | ||
81 | - @profile.save! | ||
82 | - @other_profile.save! | ||
83 | - | ||
84 | - assert_difference OrdersCyclePlugin::Supplier, :count do | ||
85 | - @profile.add_supplier @other_profile | ||
86 | - end | ||
87 | - assert @profile.suppliers_profiles.include?(@other_profile) | ||
88 | - assert @other_profile.consumers_profiles.include?(@profile) | ||
89 | - end | ||
90 | - | ||
91 | - should "add all supplier's products when supplier is added" do | ||
92 | - @profile.save! | ||
93 | - @other_profile.save! | ||
94 | - product = create(SuppliersPlugin::DistributedProduct, :profile => @other_profile) | ||
95 | - @profile.add_supplier @other_profile | ||
96 | - assert_equal [product], @profile.from_products | ||
97 | - end | ||
98 | - | ||
99 | - should 'remove supplier' do | ||
100 | - @profile.save! | ||
101 | - @other_profile.save! | ||
102 | - | ||
103 | - @profile.add_supplier @other_profile | ||
104 | - assert_difference OrdersCyclePlugin::Supplier, :count, -1 do | ||
105 | - assert_difference RoleAssignment, :count, -1 do | ||
106 | - @profile.remove_supplier @other_profile | ||
107 | - end | ||
108 | - end | ||
109 | - assert !@profile.suppliers_profiles.include?(@other_profile) | ||
110 | - end | ||
111 | - | ||
112 | - should "archive supplier's products when supplier is removed" do | ||
113 | - @profile.save! | ||
114 | - @other_profile.save! | ||
115 | - product = create(SuppliersPlugin::DistributedProduct, :profile => @other_profile) | ||
116 | - @profile.add_supplier @other_profile | ||
117 | - @profile.remove_supplier @other_profile | ||
118 | - assert_equal [product], @profile.from_products | ||
119 | - assert_equal 1, @profile.distributed_products.archived.count | ||
120 | - end | ||
121 | - | ||
122 | - should 'create self supplier automatically' do | ||
123 | - profile = create(OrdersCyclePlugin::profile, :profile => @profile) | ||
124 | - assert_equal 1, profile.suppliers.count | ||
125 | - end | ||
126 | - | ||
127 | -end |
@@ -0,0 +1,81 @@ | @@ -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" |
@@ -0,0 +1,77 @@ | @@ -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/plugin.yml
plugins/shopping_cart/step_definitions/delivery_steps.rb
0 → 100644
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +Given /^the shopping basket is (enabled|disabled) on "([^""]*)"$/ do |status, name| | ||
2 | + status = status == 'enabled' | ||
3 | + enterprise = Enterprise.find_by_name(name) || Enterprise[name] | ||
4 | + settings = enterprise.shopping_cart_settings({:enabled => status}) | ||
5 | + settings.save! | ||
6 | +end | ||
7 | + | ||
8 | +Given /^"([^""]*)" has the following delivery methods$/ do |name, table| | ||
9 | + enterprise = Enterprise.find_by_name(name) || Enterprise[name] | ||
10 | + table.hashes.map{|item| item.dup}.each do |item| | ||
11 | + delivery_method = enterprise.delivery_methods.build | ||
12 | + delivery_method.update_attributes(item) | ||
13 | + end | ||
14 | +end |
plugins/suppliers/test/test_helper.rb
@@ -1 +0,0 @@ | @@ -1 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/../../../test/test_helper' |
plugins/suppliers/test/unit/code_numbering_test.rb
plugins/suppliers/test/unit/default_delegate_test.rb
plugins/suppliers/test/unit/suppliers_plugin/distributed_product_test.rb
@@ -1,108 +0,0 @@ | @@ -1,108 +0,0 @@ | ||
1 | -require "#{File.dirname(__FILE__)}/../../test_helper" | ||
2 | - | ||
3 | -class SuppliersPlugin::DistributedProductTest < ActiveSupport::TestCase | ||
4 | - | ||
5 | - def setup | ||
6 | - @product_category = create(ProductCategory, :name => 'parent') | ||
7 | - @profile = build(Enterprise) | ||
8 | - @invisible_profile = build(Enterprise, :visible => false) | ||
9 | - @other_profile = build(Enterprise) | ||
10 | - @self_supplier = build(SuppliersPlugin::Supplier, :consumer => @profile, :profile => @profile) | ||
11 | - @dummy_supplier = build(SuppliersPlugin::Supplier, :consumer => @profile, :profile => @dummy_profile) | ||
12 | - @other_supplier = build(SuppliersPlugin::Supplier, :consumer => @profile, :profile => @other_profile) | ||
13 | - end | ||
14 | - | ||
15 | - attr_accessor :product_category, | ||
16 | - :profile, :invisible_profile, :other_profile, | ||
17 | - :profile, :dummy_profile, :other_profile, :self_supplier, :dummy_supplier, :other_supplier | ||
18 | - | ||
19 | - should 'return default settings considering dummy supplier' do | ||
20 | - product = build(SuppliersPlugin::DistributedProduct, :profile => @profile, :supplier => @dummy_supplier) | ||
21 | - assert_equal nil, product.default_name | ||
22 | - assert_equal nil, product.default_description | ||
23 | - product = build(SuppliersPlugin::DistributedProduct, :profile => @profile, :supplier => @other_supplier) | ||
24 | - assert_equal true, product.default_name | ||
25 | - assert_equal true, product.default_description | ||
26 | - end | ||
27 | - | ||
28 | - should 'return price without margins if it is own product' do | ||
29 | - product = build(SuppliersPlugin::DistributedProduct, :price => 10, :margin_percentage => 10, :profile => @profile, :supplier => @self_supplier) | ||
30 | - assert_equal 10.0, product.price.to_f | ||
31 | - end | ||
32 | - | ||
33 | - should 'return price without margins if supplier product has no price' do | ||
34 | - supplier_product = build(SuppliersPlugin::DistributedProduct, :profile => @other_profile, :supplier => @other_profile.self_supplier) | ||
35 | - product = build(SuppliersPlugin::DistributedProduct, :price => 10, :margin_percentage => 10, :profile => @profile, :supplier => @other_supplier) | ||
36 | - assert_equal 10.0, product.price.to_f | ||
37 | - end | ||
38 | - | ||
39 | - should 'return price with margins' do | ||
40 | - supplier_product = build(SuppliersPlugin::DistributedProduct, :price => 10, :margin_percentage => 10, :profile => @other_profile, :supplier => @other_profile.self_supplier) | ||
41 | - product = build(SuppliersPlugin::DistributedProduct, :price => 10, :margin_percentage => 10, :supplier_product => supplier_product, :profile => @profile, :supplier => @other_supplier) | ||
42 | - | ||
43 | - product.default_margin_percentage = false | ||
44 | - assert_equal 11.0, product.price.to_f | ||
45 | - profile.margin_percentage = 20 | ||
46 | - product.default_margin_percentage = true | ||
47 | - assert_equal 12.0, product.price.to_f | ||
48 | - end | ||
49 | - | ||
50 | - should 'allow set of supplier product' do | ||
51 | - product = build(SuppliersPlugin::DistributedProduct, :price => 10, :margin_percentage => 10, :profile => @profile, :supplier => @self_supplier) | ||
52 | - | ||
53 | - product.from_product = build(SuppliersPlugin::DistributedProduct, :profile => @profile, :supplier => @self_supplier) | ||
54 | - assert_nothing_raised do | ||
55 | - product.supplier_product = {:price => 10, :margin_percentage => 10} | ||
56 | - product.supplier_product = SuppliersPlugin::DistributedProduct.new :price => 5 | ||
57 | - end | ||
58 | - end | ||
59 | - | ||
60 | - should 'create a supplier product for a dummy supplier' do | ||
61 | - product = build(SuppliersPlugin::DistributedProduct, :profile => @profile, :supplier => @dummy_supplier) | ||
62 | - assert product.supplier_product | ||
63 | - # negative assertion | ||
64 | - product = build(SuppliersPlugin::DistributedProduct, :profile => @profile, :supplier => @other_supplier) | ||
65 | - assert !product.supplier_product | ||
66 | - end | ||
67 | - | ||
68 | - should 'respond to supplier_product_id setter and getter' do | ||
69 | - product = create(SuppliersPlugin::DistributedProduct, :profile => @profile, :supplier => @dummy_supplier) | ||
70 | - assert_equal product.supplier_product.id, product.supplier_product_id | ||
71 | - product.expects(:distribute_from) | ||
72 | - product.supplier_product_id = 1 | ||
73 | - end | ||
74 | - | ||
75 | - should 'respond to distribute_from' do | ||
76 | - product = create(SuppliersPlugin::DistributedProduct, :profile => @profile, :supplier => @profile.self_supplier) | ||
77 | - | ||
78 | - assert_raise RuntimeError do | ||
79 | - supplier_product = build(SuppliersPlugin::DistributedProduct, :profile => @other_profile) | ||
80 | - product.distribute_from(supplier_product) | ||
81 | - end | ||
82 | - | ||
83 | - supplier_product = create(SuppliersPlugin::DistributedProduct, :profile => @other_profile) | ||
84 | - product.profile.add_supplier @other_profile | ||
85 | - product.distribute_from supplier_product | ||
86 | - assert_equal product.supplier.profile, supplier_product.profile | ||
87 | - assert_equal product.supplier.profile, supplier_product.profile | ||
88 | - end | ||
89 | - | ||
90 | - should 'return json for category hierarchy' do | ||
91 | - grandparent = create(ProductCategory, :name => 'grand parent') | ||
92 | - parent = create(ProductCategory, :name => 'parent') | ||
93 | - child = product_category | ||
94 | - | ||
95 | - product = SuppliersPlugin::DistributedProduct.new :category => parent | ||
96 | - hash = {:own_name => "parent", :id => "2", :subcats => [], :name => "parent", | ||
97 | - :hierarchy => [{:own_name => "parent", :subcats => [], :name => "parent", :id => "2"}]} | ||
98 | - assert_equal hash, product.json_for_category | ||
99 | - end | ||
100 | - | ||
101 | - should 'block own product distribution' do | ||
102 | - product = Product.create :enterprise => @profile, :product_category => product_category | ||
103 | - distributed = SuppliersPlugin::DistributedProduct.new :enterprise => @profile, :from_products => [product] | ||
104 | - | ||
105 | - assert distributed.invalid? | ||
106 | - end | ||
107 | - | ||
108 | -end |
plugins/suppliers/test/unit/suppliers_plugin/product_test.rb
@@ -1,49 +0,0 @@ | @@ -1,49 +0,0 @@ | ||
1 | -require "test_helper" | ||
2 | - | ||
3 | -class SuppliersPlugin::ProductTest < ActiveSupport::TestCase | ||
4 | - | ||
5 | - def setup | ||
6 | - @product = build(SuppliersPlugin::BaseProduct) | ||
7 | - end | ||
8 | - | ||
9 | - should 'return first from product as supplier product' do | ||
10 | - fp = build(SuppliersPlugin::BaseProduct, :profile => @product.profile) | ||
11 | - @product.from_products = [fp] | ||
12 | - assert_equal fp, @product.from_product | ||
13 | - assert_equal fp, @product.supplier_product | ||
14 | - end | ||
15 | - | ||
16 | - should 'respond to dummy and own' do | ||
17 | - assert !@product.dummy? | ||
18 | - assert @product.own? | ||
19 | - end | ||
20 | - | ||
21 | - should 'return price with margins' do | ||
22 | - supplier_product = build(SuppliersPlugin::DistributedProduct, :price => 10, :margin_percentage => 10, :profile => @product.profile, :supplier => @product.profile.self_supplier) | ||
23 | - product = build(SuppliersPlugin::DistributedProduct, :price => 10, :margin_percentage => 10, :supplier_product => supplier_product, :profile => @product.profile, :supplier => @product.profile.self_supplier) | ||
24 | - | ||
25 | - product.default_margin_percentage = false | ||
26 | - assert_equal 11.0, product.price_with_margins | ||
27 | - @product.profile.margin_percentage = 20 | ||
28 | - product.default_margin_percentage = true | ||
29 | - assert_equal 12.0, product.price_with_margins | ||
30 | - end | ||
31 | - | ||
32 | - should 'build default unit if none exists' do | ||
33 | - assert_equal 0, Unit.count | ||
34 | - assert 'unit', @product.unit.singular | ||
35 | - end | ||
36 | - | ||
37 | - should 'avoid destroy by raising an exception' do | ||
38 | - assert_raise RuntimeError do | ||
39 | - @product.destroy | ||
40 | - end | ||
41 | - end | ||
42 | - | ||
43 | - should 'accept price in different formats' do | ||
44 | - @product.price = '2,45' | ||
45 | - assert_equal 2.45, @product.price | ||
46 | - end | ||
47 | - | ||
48 | - | ||
49 | -end |
plugins/suppliers/test/unit/suppliers_plugin/source_product_test.rb
plugins/suppliers/test/unit/suppliers_plugin/supplier_test.rb
plugins/volunteers/lib/split_datetime.rb
@@ -1,72 +0,0 @@ | @@ -1,72 +0,0 @@ | ||
1 | - | ||
2 | -module SplitDatetime | ||
3 | - | ||
4 | - class << self | ||
5 | - def nil_time | ||
6 | - Time.parse "#{Time.now.hour}:0:0" | ||
7 | - end | ||
8 | - def nil_date | ||
9 | - Date.today | ||
10 | - end | ||
11 | - | ||
12 | - def to_time datetime | ||
13 | - datetime = self.nil_time if datetime.blank? | ||
14 | - datetime.to_formatted_s :time | ||
15 | - end | ||
16 | - def to_date datetime | ||
17 | - datetime = self.nil_date if datetime.blank? | ||
18 | - datetime.strftime '%d/%m/%Y' | ||
19 | - end | ||
20 | - def set_time datetime, value | ||
21 | - value = if value.blank? | ||
22 | - self.nil_time | ||
23 | - elsif value.kind_of? String | ||
24 | - Time.parse value | ||
25 | - else | ||
26 | - value.to_time | ||
27 | - end | ||
28 | - datetime = self.nil_date if datetime.blank? | ||
29 | - | ||
30 | - Time.mktime(datetime.year, datetime.month, datetime.day, value.hour, value.min, value.sec).to_datetime | ||
31 | - end | ||
32 | - def set_date datetime, value | ||
33 | - value = if value.blank? | ||
34 | - self.nil_date | ||
35 | - elsif value.kind_of? String | ||
36 | - DateTime.strptime value, '%d/%m/%Y' | ||
37 | - else | ||
38 | - value.to_time | ||
39 | - end | ||
40 | - datetime = nil_time if datetime.blank? | ||
41 | - | ||
42 | - Time.mktime(value.year, value.month, value.day, datetime.hour, datetime.min, datetime.sec).to_datetime | ||
43 | - end | ||
44 | - end | ||
45 | - | ||
46 | - module SplitMethods | ||
47 | - | ||
48 | - def split_datetime attr | ||
49 | - define_method "#{attr}_time" do | ||
50 | - datetime = send attr | ||
51 | - SplitDatetime.to_time datetime | ||
52 | - end | ||
53 | - define_method "#{attr}_date" do | ||
54 | - datetime = send attr | ||
55 | - SplitDatetime.to_date datetime | ||
56 | - end | ||
57 | - define_method "#{attr}_time=" do |value| | ||
58 | - datetime = send attr | ||
59 | - send "#{attr}=", SplitDatetime.set_time(datetime, value) | ||
60 | - end | ||
61 | - define_method "#{attr}_date=" do |value| | ||
62 | - datetime = send attr | ||
63 | - send "#{attr}=", SplitDatetime.set_date(datetime, value) | ||
64 | - end | ||
65 | - end | ||
66 | - | ||
67 | - end | ||
68 | - | ||
69 | -end | ||
70 | - | ||
71 | -Class.extend SplitDatetime::SplitMethods | ||
72 | -ActiveRecord::Base.extend SplitDatetime::SplitMethods |
plugins/volunteers/test/unit/split_datetime_test.rb
@@ -1,53 +0,0 @@ | @@ -1,53 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/../../../../test/test_helper' | ||
2 | - | ||
3 | -class ModelWithDate | ||
4 | - | ||
5 | - def initialize | ||
6 | - @delivery = DateTime.now | ||
7 | - end | ||
8 | - | ||
9 | - attr_accessor :delivery | ||
10 | - | ||
11 | - extend SplitDatetime::SplitMethods | ||
12 | - split_datetime :delivery | ||
13 | - | ||
14 | -end | ||
15 | - | ||
16 | -class SplitDatetimeTest < ActiveSupport::TestCase | ||
17 | - | ||
18 | - def setup | ||
19 | - @m = ModelWithDate.new | ||
20 | - @m.delivery = (Time.mktime(2011) + 2.hours + 2.minutes + 2.seconds).to_datetime | ||
21 | - end | ||
22 | - | ||
23 | - should 'return get splitted times' do | ||
24 | - assert_equal @m.delivery_date, '2011-01-01' | ||
25 | - assert_equal @m.delivery_time, '02:02' | ||
26 | - end | ||
27 | - | ||
28 | - should 'return set splitted times by Date' do | ||
29 | - @m.delivery_date = (Time.mktime(2011, 3, 5) + 3.hours + 3.minutes + 3.seconds).to_datetime | ||
30 | - assert_equal @m.delivery_date, '2011-03-05' | ||
31 | - assert_equal @m.delivery_time, '02:02' | ||
32 | - end | ||
33 | - | ||
34 | - should 'return set splitted times by Time' do | ||
35 | - @m.delivery_time = (Time.mktime(2011, 3, 5) + 3.hours + 3.minutes + 3.seconds).to_datetime | ||
36 | - assert_equal @m.delivery_date, '2011-01-01' | ||
37 | - assert_equal @m.delivery_time, '03:03' | ||
38 | - end | ||
39 | - | ||
40 | - should 'return set splitted times by Date String' do | ||
41 | - @m.delivery_date = "2011-11-11" | ||
42 | - assert_equal @m.delivery_date, '2011-11-11' | ||
43 | - assert_equal @m.delivery_time, '02:02' | ||
44 | - end | ||
45 | - | ||
46 | - should 'return set splitted times by Time String' do | ||
47 | - @m.delivery_time = "15:43" | ||
48 | - assert_equal @m.delivery_date, '2011-01-01' | ||
49 | - assert_equal @m.delivery_time, '15:43' | ||
50 | - end | ||
51 | - | ||
52 | -end | ||
53 | - |
@@ -0,0 +1,53 @@ | @@ -0,0 +1,53 @@ | ||
1 | +require 'test_helper' | ||
2 | + | ||
3 | +class ModelWithDate | ||
4 | + | ||
5 | + def initialize | ||
6 | + @delivery = DateTime.now | ||
7 | + end | ||
8 | + | ||
9 | + attr_accessor :delivery | ||
10 | + | ||
11 | + extend SplitDatetime::SplitMethods | ||
12 | + split_datetime :delivery | ||
13 | + | ||
14 | +end | ||
15 | + | ||
16 | +class SplitDatetimeTest < ActiveSupport::TestCase | ||
17 | + | ||
18 | + def setup | ||
19 | + @m = ModelWithDate.new | ||
20 | + @m.delivery = (Time.mktime(2011) + 2.hours + 2.minutes + 2.seconds).to_datetime | ||
21 | + end | ||
22 | + | ||
23 | + should 'return get splitted times' do | ||
24 | + assert_equal '01/01/2011', @m.delivery_date | ||
25 | + assert_equal '02:02', @m.delivery_time | ||
26 | + end | ||
27 | + | ||
28 | + should 'return set splitted times by Date' do | ||
29 | + @m.delivery_date = (Time.mktime(2011, 3, 5) + 3.hours + 3.minutes + 3.seconds).to_datetime | ||
30 | + assert_equal '05/03/2011', @m.delivery_date | ||
31 | + assert_equal '02:02', @m.delivery_time | ||
32 | + end | ||
33 | + | ||
34 | + should 'return set splitted times by Time' do | ||
35 | + @m.delivery_time = (Time.mktime(2011, 3, 5) + 3.hours + 3.minutes + 3.seconds).to_datetime | ||
36 | + assert_equal '01/01/2011', @m.delivery_date | ||
37 | + assert_equal '03:03', @m.delivery_time | ||
38 | + end | ||
39 | + | ||
40 | + should 'return set splitted times by Date String' do | ||
41 | + @m.delivery_date = "11/11/2011" | ||
42 | + assert_equal '11/11/2011', @m.delivery_date | ||
43 | + assert_equal '02:02', @m.delivery_time | ||
44 | + end | ||
45 | + | ||
46 | + should 'return set splitted times by Time String' do | ||
47 | + @m.delivery_time = "15:43" | ||
48 | + assert_equal '01/01/2011', @m.delivery_date | ||
49 | + assert_equal '15:43', @m.delivery_time | ||
50 | + end | ||
51 | + | ||
52 | +end | ||
53 | + |