diff --git a/Gemfile b/Gemfile index 984276b9..2110d3fd 100644 --- a/Gemfile +++ b/Gemfile @@ -107,8 +107,8 @@ end group :test do #gem 'capybara-webkit' #, '~>0.14.2' # version 1.1.0 does not yet compile in mavericks - gem 'selenium-webdriver' - #gem 'poltergeist' + gem 'selenium-webdriver', '~> 2.45.0.dev3' + gem 'poltergeist' gem 'capybara-screenshot' gem 'turnip' gem 'rspec-its' diff --git a/Gemfile.lock b/Gemfile.lock index 5220ce37..891ca6c4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -135,6 +135,7 @@ GEM ffi (~> 1.0, >= 1.0.11) climate_control (0.0.3) activesupport (>= 3.0) + cliver (0.3.2) cocaine (0.5.5) climate_control (>= 0.0.3, < 1.0) coderay (1.1.0) @@ -300,6 +301,11 @@ GEM activesupport (>= 3.0.0) cocaine (~> 0.5.3) mime-types + poltergeist (1.6.0) + capybara (~> 2.1) + cliver (~> 0.3.1) + multi_json (~> 1.0) + websocket-driver (>= 0.2.0) pry (0.10.1) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -371,14 +377,14 @@ GEM ruby-progressbar (1.7.1) rubyzip (1.1.7) safe_yaml (1.0.4) - sass (3.4.12) + sass (3.4.13) sass-rails (5.0.1) railties (>= 4.0.0, < 5.0) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (~> 1.1) - selenium-webdriver (2.44.0) + selenium-webdriver (2.45.0.dev3) childprocess (~> 0.5) multi_json (~> 1.0) rubyzip (~> 1.0) @@ -398,7 +404,7 @@ GEM railties (>= 3.1, < 5.0) slim (~> 3.0) slop (3.6.0) - spring (1.3.2) + spring (1.3.3) spring-commands-rspec (1.0.4) spring (>= 0.9.1) sprockets (2.12.3) @@ -488,6 +494,7 @@ DEPENDENCIES omniauth-facebook omniauth-instagram paperclip + poltergeist pry-rails quiet_assets rack-cors @@ -496,7 +503,7 @@ DEPENDENCIES rspec-its rspec-rails sass-rails (~> 5.0.0) - selenium-webdriver + selenium-webdriver (~> 2.45.0.dev3) simplecov simply_stored! slim-rails diff --git a/app/controllers/suppliers/application_controller.rb b/app/controllers/suppliers/application_controller.rb index ab9bef42..d6672891 100644 --- a/app/controllers/suppliers/application_controller.rb +++ b/app/controllers/suppliers/application_controller.rb @@ -30,7 +30,7 @@ module Suppliers raise CanCan::AccessDenied unless current_employee.active? @current_ability = ::Ability.new( current_employee ) Array.wrap(after_authentication_hooks).each do |hook| - next if hook[:options][:only].present? && !Array.wrap(hook[:options][:only].include?(action_name.to_sym)) + next if hook[:options][:only].present? && !Array.wrap(hook[:options][:only]).include?(action_name.to_sym) instance_eval &hook[:block] end end diff --git a/app/controllers/suppliers/employees_controller.rb b/app/controllers/suppliers/employees_controller.rb index dbce69f6..4698ec74 100644 --- a/app/controllers/suppliers/employees_controller.rb +++ b/app/controllers/suppliers/employees_controller.rb @@ -20,10 +20,23 @@ module Suppliers # POST /employees # POST /employees.json def create - @employee = Employee.find_by_email(employee_params[:email]) if employee_params[:email].present? + valid = false + if existing_employee = Employee.find_by_email(employee_params[:email]) + @employee = existing_employee + if valid = @employee.valid? + current_supplier.add_employee @employee + @employee.update_attributes employee_params + end + else + @employee = Employee.new(employee_params) + @employee.password = SecureRandom.hex(8) + if valid = @employee.save + current_supplier.add_employee @employee + @employee.update_attributes employee_params # needed for supplier specific settings + end + end - if @employee.save - current_supplier.add_employee @employee unless current_supplier.employee_ids.include? @employee.id # already linked + if valid render json: @employee, serializer: Suppliers::EmployeeSerializer, status: :created else render json: {errors: @employee.errors}, status: :unprocessable_entity diff --git a/app/models/supplier.rb b/app/models/supplier.rb index bb3cf887..c929839b 100644 --- a/app/models/supplier.rb +++ b/app/models/supplier.rb @@ -67,11 +67,17 @@ class Supplier def add_manager(employee) add_employee employee unless employee_ids.include? employee.id - settings = employee_settings.for_employee(employee) + settings = settings_for(employee) settings.is_manager! save and employee end + after_method :add_employee do |result, employee| + @employee_settings = nil + employee.settings = settings_for(employee) + result + end + def employee_settings @employee_settings ||= SupplierEmployeesSettings.new(self) end diff --git a/app/services/supplier_employees_settings.rb b/app/services/supplier_employees_settings.rb index b55769ad..43706c87 100644 --- a/app/services/supplier_employees_settings.rb +++ b/app/services/supplier_employees_settings.rb @@ -112,6 +112,10 @@ class SupplierEmployeesSettings all_employees_settings.supplier.save end + def supplier + all_employees_settings.supplier + end + # Parse a method name to its underlying operations # settings.is_manager? # is a getter for the attribute manager diff --git a/config/initializers/language_additions.rb b/config/initializers/language_additions.rb index 5308ce06..3452d356 100644 --- a/config/initializers/language_additions.rb +++ b/config/initializers/language_additions.rb @@ -8,7 +8,7 @@ module MethodPrependAndAppend def before_method(m, &blk) alias_method :"#{m}_before_extending_before", m define_method m do |*args| - instance_eval(&blk) + instance_exec(*args, &blk) send :"#{m}_before_extending_before", *args end end @@ -17,7 +17,8 @@ module MethodPrependAndAppend alias_method :"#{m}_before_extending_after", m define_method m do |*args| result = send :"#{m}_before_extending_after", *args - instance_eval(result, &blk) + args.unshift result + instance_exec(*args, &blk) end end end diff --git a/spec/acceptance/suppliers/employees.feature b/spec/acceptance/suppliers/employees.feature index f8e7c822..0392ae8f 100644 --- a/spec/acceptance/suppliers/employees.feature +++ b/spec/acceptance/suppliers/employees.feature @@ -1,5 +1,38 @@ Feature: Manage employees + @javascript + Scenario: create an not yet existing extra employee + Given there is a confirmed and open supplier + And I am signed in as supplier + When the supplier employee visits the 'employees' path + And I click on selector '.new-employee-button' + And the supplier emloyee sets the 'name' to 'New employee' in the employee popup + And the supplier emloyee sets the 'email' to 'new-employee@example.com' in the employee popup + And I click on selector '.form-row.manager .switch' + And I click on selector '.modal-confirm' + And I wait 1 second + Then the new employee should be added to the supplier + + @javascript + Scenario: adding an already existing employee that was firstly added as manager without manager and active + Given there is a confirmed and open supplier + And I am signed in as supplier + When the supplier employee visits the 'employees' path + And I click on selector '.new-employee-button' + And the supplier emloyee sets the 'name' to 'Existing employee' in the employee popup + And the supplier emloyee sets the 'email' to 'existing-employee@example.com' in the employee popup + And I click on selector '.form-row.manager .switch' + And I click on selector '.modal-confirm' + And the supplier employee clicks on the existing employee table destroy button + And I click on selector '.modal-confirm' + And I click on selector '.new-employee-button' + And the supplier emloyee sets the 'name' to 'Existing employee readded' in the employee popup + And the supplier emloyee sets the 'email' to 'existing-employee@example.com' in the employee popup + And I click on selector '.form-row.active .switch' + And I click on selector '.modal-confirm' + And I wait 1 second + Then the new employee should be re-added to the supplier as non manager non active + @javascript Scenario: a just signed up manager can manage employees Given there is a confirmed and open supplier @@ -7,7 +40,7 @@ Feature: Manage employees And I am signed in as supplier When the supplier employee visits the 'employees' path And the supplier employee clicks on the other employee table edit button - And the supplier emloyee sets the 'name' to 'Edited employee' + And the supplier emloyee sets the 'name' to 'Edited employee' in the employee popup And the supplier emloyee clicks the active switch to deactivate the employee And the supplier employee clicks the confirm modal button Then the other employee should no longer be active for the current supplier diff --git a/spec/acceptance_steps/suppliers/employees_steps.rb b/spec/acceptance_steps/suppliers/employees_steps.rb index e718bf57..f981f3c7 100644 --- a/spec/acceptance_steps/suppliers/employees_steps.rb +++ b/spec/acceptance_steps/suppliers/employees_steps.rb @@ -8,7 +8,13 @@ step "the supplier employee clicks on the other employee table edit button" do all('tr').last.find('.table-edit').click end -step "the supplier emloyee sets the :attribute to :value" do |attribute, value| +step "the supplier employee clicks on the existing employee table destroy button" do + find 'table.table' + sleep 0.2 + all('tr').last.find('.table-destroy').click +end + +step "the supplier emloyee sets the :attribute to :value in the employee popup" do |attribute, value| js_set_field ".form-row.#{attribute} input", value end @@ -21,3 +27,24 @@ step "the other employee should no longer be active for the current supplier" do @supplier.reload @supplier.settings_for(@other_employee).active?.should be false end + +step "the new employee should be added to the supplier" do + @new_employee = Employee.find_by_email('new-employee@example.com') + @new_employee.should be_present + @new_employee.name.should eq 'New employee' + @supplier.reload + settings = @supplier.settings_for @new_employee + settings.is_manager?.should be true + settings.is_active?.should be true +end + +step "the new employee should be re-added to the supplier as non manager non active" do + # Non active for a non default setting change to be recorded + @existing_employee = Employee.find_by_email('existing-employee@example.com') + @existing_employee.should be_present + @existing_employee.name.should eq 'Existing employee readded' + @supplier.reload + settings = @supplier.settings_for @existing_employee + settings.is_manager?.should be false + settings.is_active?.should be false +end diff --git a/spec/factories/employee_factory.rb b/spec/factories/employee_factory.rb index c1b5ac90..7725c608 100644 --- a/spec/factories/employee_factory.rb +++ b/spec/factories/employee_factory.rb @@ -1,7 +1,7 @@ FactoryGirl.define do factory :employee do sequence(:name){|i| "Employee #{i}"} - email 'employee@mozo.bar' + sequence(:email){ |i| "employee#{i}@mozo.bar" } password 'secret' trait :confirmed do diff --git a/spec/models/supplier_spec.rb b/spec/models/supplier_spec.rb index 6e6c4e0b..16d9bdee 100644 --- a/spec/models/supplier_spec.rb +++ b/spec/models/supplier_spec.rb @@ -124,9 +124,30 @@ describe Supplier do settings = supplier.employee_settings.for_employee(employee) settings.manager?.should be true reloaded_supplier = Supplier.find(supplier.id) - settings = reloaded_supplier.employee_settings.for_employee(employee) + settings = reloaded_supplier.settings_for(employee) + settings.manager?.should be true + end + + it "Adds another manager (second appears to work different as the first)" do + supplier.add_manager employee + new_employee = create :employee, email: 'new-employee@example.com' + supplier.add_manager new_employee + reloaded_supplier = Supplier.find(supplier.id) + settings = reloaded_supplier.settings_for(new_employee) settings.manager?.should be true end end + + describe '#add_employee' do + it 'resets the settings to the supplier settings' do + employee = create :employee + expect( employee.settings ).not_to be_present + expect( employee.settings.supplier ).not_to be_present + supplier.add_employee employee + new_supplier_referenced = (employee.settings.supplier == supplier) + new_supplier_referenced.should be true + end + + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 184b088c..0245a70f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -10,7 +10,7 @@ require 'turnip/capybara' require 'in_memory_q_counter' require 'capybara-screenshot/rspec' require 'webmock/rspec' -#require 'capybara/poltergeist' +require 'capybara/poltergeist' # Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories. @@ -21,9 +21,9 @@ Dir.glob("spec/acceptance_steps/**/*steps.rb") { |f| load f, true } I18n.locale =I18n.default_locale Devise.stretches = 1 #Capybara.javascript_driver = :webkit -#Capybara.javascript_driver = :poltergeist -Capybara.javascript_driver = :selenium -Capybara.default_wait_time = 4 # ember needs more time than the default of 2 +Capybara.javascript_driver = :poltergeist +#Capybara.javascript_driver = :selenium +Capybara.default_wait_time = 3 # ember needs more time than the default of 2 Capybara::Screenshot.webkit_options = { width: 1024, height: 768 } WebMock.disable_net_connect!(allow_localhost: true) @@ -169,12 +169,14 @@ RSpec.configure do |config| end config.after :suite do +=begin rspec_outfile = Rails.root.join('coverage/rspec_results.html') result = File.read rspec_outfile replacement = %|
| result.gsub! //, replacement File.open(rspec_outfile, 'w'){|f| f.puts result} `open #{rspec_outfile}` +=end end # If true, the base class of anonymous controllers will be inferred diff --git a/wip.md b/wip.md index 9d79f9b0..9faa304b 100644 --- a/wip.md +++ b/wip.md @@ -4,6 +4,8 @@ Release Supplier -------- +- Fix employee creation +- Fix add manager functionality - Link employee to orders - Employee personal schedule - english emails