More advance signup flow
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
attr = DS.attr
|
attr = DS.attr
|
||||||
App.Supplier = DS.Model.extend
|
App.Supplier = DS.Model.extend
|
||||||
name: attr 'string'
|
name: attr 'string'
|
||||||
|
email: attr 'string'
|
||||||
time_zone: attr 'string'
|
time_zone: attr 'string'
|
||||||
address: attr 'string'
|
address: attr 'string'
|
||||||
house_number: attr 'number'
|
house_number: attr 'number'
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
= partial "global/top_menu"
|
if loading
|
||||||
= partial "global/side_menu"
|
span.fa.fa-3x.fa-spinner.fa-spin
|
||||||
.main-section= outlet
|
else
|
||||||
= view flash_message
|
= partial "global/top_menu"
|
||||||
= outlet modal
|
= partial "global/side_menu"
|
||||||
|
.main-section= outlet
|
||||||
|
= view flash_message
|
||||||
|
= outlet modal
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ private
|
|||||||
def set_locale
|
def set_locale
|
||||||
I18n.locale = (params[:locale].presence || I18n.default_locale).to_sym
|
I18n.locale = (params[:locale].presence || I18n.default_locale).to_sym
|
||||||
end
|
end
|
||||||
|
|
||||||
def _render_with_renderer_json(resource, options)
|
def _render_with_renderer_json(resource, options)
|
||||||
serializer = build_json_serializer(resource, options)
|
serializer = build_json_serializer(resource, options)
|
||||||
|
|
||||||
@@ -55,6 +55,13 @@ private
|
|||||||
"theme1"
|
"theme1"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def after_sign_in_path_for(resource)
|
||||||
|
case resource
|
||||||
|
when Employee then supplier_root_path
|
||||||
|
else root_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def check_active_list_state
|
def check_active_list_state
|
||||||
if current_user.try(:active_list_id)
|
if current_user.try(:active_list_id)
|
||||||
unless active_list.active?
|
unless active_list.active?
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ class NewSuppliersController < ApplicationController
|
|||||||
@new_supplier.current_employee = current_employee
|
@new_supplier.current_employee = current_employee
|
||||||
|
|
||||||
if @new_supplier.save
|
if @new_supplier.save
|
||||||
redirect_to supplier_root_path
|
sign_in @new_supplier.employee unless current_employee
|
||||||
|
session[:supplier_id] = @new_supplier.supplier.try(:id)
|
||||||
|
redirect_to supplier_root_path(anchor: '/pages/introduction')
|
||||||
else
|
else
|
||||||
render 'new'
|
render 'new'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
class RegistrationsController < Devise::RegistrationsController
|
class RegistrationsController < Devise::RegistrationsController
|
||||||
|
protected
|
||||||
|
|
||||||
|
#def after_sign_up_path(resource)
|
||||||
|
#end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class Suppliers::SessionsController < Devise::SessionsController
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
session[:supplier_id] = nil
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -16,7 +16,7 @@ class Employee
|
|||||||
end
|
end
|
||||||
|
|
||||||
view :by_confirmation_token, key: :confirmation_token # devise confirmable
|
view :by_confirmation_token, key: :confirmation_token # devise confirmable
|
||||||
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable, :confirmable
|
devise :database_authenticatable, :recoverable, :rememberable, :trackable #, :registerable #, :confirmable
|
||||||
property :unconfirmed_email
|
property :unconfirmed_email
|
||||||
|
|
||||||
property :name
|
property :name
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ class Supplier
|
|||||||
#devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable, :confirmable
|
#devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable, :confirmable
|
||||||
|
|
||||||
property :name
|
property :name
|
||||||
|
property :email
|
||||||
property :open, type: :boolean, default: false
|
property :open, type: :boolean, default: false
|
||||||
property :time_zone, default: 'UTC'
|
property :time_zone, default: 'UTC'
|
||||||
property :night_offset, type: Fixnum, default: 0 # Minutes
|
property :night_offset, type: Fixnum, default: 0 # Minutes
|
||||||
|
|||||||
@@ -1,19 +1,20 @@
|
|||||||
class NewSupplier
|
class NewSupplier
|
||||||
include ActiveAttr::Model
|
include ActiveAttr::Model
|
||||||
attr_accessor :current_employee
|
attr_accessor :current_employee
|
||||||
|
attr_reader :employee, :supplier
|
||||||
|
|
||||||
attribute :supplier_name
|
attribute :supplier_name
|
||||||
attribute :email
|
attribute :email
|
||||||
attribute :password
|
attribute :password
|
||||||
attribute :password_confirmation
|
attribute :password_confirmation
|
||||||
|
|
||||||
without_current_supplier = { unless: 'current_employee.present?' }
|
without_current_employee = { unless: 'current_employee.present?' }
|
||||||
validates :supplier_name, presence: true
|
validates :supplier_name, presence: true
|
||||||
validates :email, email: without_current_supplier
|
validates :email, email: without_current_employee
|
||||||
validates :password, presence: without_current_supplier, confirmation: without_current_supplier
|
validates :password, presence: without_current_employee, confirmation: without_current_employee
|
||||||
|
|
||||||
validate :supplier_name_uniqueness
|
validate :supplier_name_uniqueness
|
||||||
validate :employee_uniqueness
|
validate :employee_uniqueness_or_existence
|
||||||
|
|
||||||
def save
|
def save
|
||||||
if valid?
|
if valid?
|
||||||
@@ -27,15 +28,22 @@ class NewSupplier
|
|||||||
private
|
private
|
||||||
|
|
||||||
def persist!
|
def persist!
|
||||||
employee = Employee.new unconfirmed_email: email, password: password, password_confirmation: password_confirmation
|
@employee ||= Employee.new email: email, password: password, password_confirmation: password_confirmation
|
||||||
raise "Cannot create employee with #{attributes.inspect}" unless employee.save
|
raise "Cannot create employee with #{attributes.inspect}" unless employee.save
|
||||||
supplier = Supplier.create name: supplier_name
|
@supplier = Supplier.create name: supplier_name
|
||||||
supplier.add_manager employee
|
supplier.add_manager employee
|
||||||
end
|
end
|
||||||
|
|
||||||
def employee_uniqueness
|
def employee_uniqueness_or_existence
|
||||||
return if current_employee.present?
|
return if current_employee.present?
|
||||||
errors.add :email, :taken if Employee.count_by_email(email) > 0
|
if Employee.count_by_email(email) > 0
|
||||||
|
employee = Employee.find_by_email(email)
|
||||||
|
if employee.valid_password? password
|
||||||
|
@employee = employee
|
||||||
|
else
|
||||||
|
errors.add :email, :taken
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def supplier_name_uniqueness
|
def supplier_name_uniqueness
|
||||||
|
|||||||
@@ -16,6 +16,5 @@ html lang="en"
|
|||||||
= javascript_include_tag 'supplier/app/application'
|
= javascript_include_tag 'supplier/app/application'
|
||||||
= yield :head
|
= yield :head
|
||||||
/= javascript_include_tag "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places&language=#{I18n.locale}"
|
/= javascript_include_tag "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places&language=#{I18n.locale}"
|
||||||
|
|
||||||
body
|
body
|
||||||
#ember-app-container
|
#ember-app-container
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ en:
|
|||||||
close_for_orders: Close the shop
|
close_for_orders: Close the shop
|
||||||
close_for_orders_confirmation: If you close the shop, you cannot receive orders. Are you sure?
|
close_for_orders_confirmation: If you close the shop, you cannot receive orders. Are you sure?
|
||||||
open_for_orders: 'Open up the place!'
|
open_for_orders: 'Open up the place!'
|
||||||
you_are_currently_closed_alert: 'You are currently closed and not able to take orders'
|
you_are_currently_closed_alert: 'You are currently closed so cannot receive orders!'
|
||||||
settings: Settings
|
settings: Settings
|
||||||
sign_out: Sign out
|
sign_out: Sign out
|
||||||
table_number: Table
|
table_number: Table
|
||||||
|
|||||||
+5
-1
@@ -2,7 +2,11 @@ ALLOWED_LOCALES = /nl|be|de|fr|en/
|
|||||||
Qwaiter::Application.routes.draw do
|
Qwaiter::Application.routes.draw do
|
||||||
devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }
|
devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }
|
||||||
#devise_for :suppliers, controllers: { confirmations: 'confirmations', registrations: 'registrations' }
|
#devise_for :suppliers, controllers: { confirmations: 'confirmations', registrations: 'registrations' }
|
||||||
devise_for :employees, controllers: { confirmations: 'confirmations', registrations: 'registrations' }
|
devise_for :employees, controllers: {
|
||||||
|
#confirmations: 'confirmations',
|
||||||
|
#registrations: 'registrations',
|
||||||
|
sessions: 'suppliers/sessions'
|
||||||
|
}
|
||||||
devise_for :administrators
|
devise_for :administrators
|
||||||
namespace :admin do
|
namespace :admin do
|
||||||
resources :users do
|
resources :users do
|
||||||
|
|||||||
@@ -18,13 +18,7 @@ Feature: Manage settings
|
|||||||
When I visit the supplier settings path
|
When I visit the supplier settings path
|
||||||
And I provide a new supplier email address
|
And I provide a new supplier email address
|
||||||
And the supplier submits the supplier settings form
|
And the supplier submits the supplier settings form
|
||||||
#Then the supplier should see a settings saved message
|
Then the supplier email is the new email
|
||||||
Then the supplier email should not have been changed
|
|
||||||
And the supplier unconfirmed email should have been set to the new supplier email
|
|
||||||
And an email should have been sent to the original supplier email with email confirmation instructions
|
|
||||||
When the supplier clicks on the new email confirmation link
|
|
||||||
Then the supplier should be redirected to the supplier settings path
|
|
||||||
And the supplier email is the new email and the unconfirmed email is empty
|
|
||||||
|
|
||||||
@javascript @broken
|
@javascript @broken
|
||||||
Scenario: Setting the timezone
|
Scenario: Setting the timezone
|
||||||
|
|||||||
@@ -6,8 +6,22 @@ Feature: A supplier can sign up
|
|||||||
And fill in the supplier signup form with new credentials
|
And fill in the supplier signup form with new credentials
|
||||||
And click on the supplier signup submit button
|
And click on the supplier signup submit button
|
||||||
And I wait 1 second
|
And I wait 1 second
|
||||||
Then a new unconfirmed supplier with the new signup credentials should be created
|
Then a new supplier with the new signup data should be created
|
||||||
And a supplier signup confirmation mail should be sent containing a link to the token
|
And the supplier should be redirected to the supplier '/pages/introduction' path
|
||||||
When I visit the supplier signup confirmation path with the correct token
|
|
||||||
Then the new signup supplier should be confirmed
|
@javascript
|
||||||
And the supplier should be redirected to the supplier settings path
|
Scenario: Existing non signed-in employee creates new supplier
|
||||||
|
Given there is a confirmed employee
|
||||||
|
When I visit the supplier signup path
|
||||||
|
And fill in the supplier signup form with existing employee credentials
|
||||||
|
And click on the supplier signup submit button
|
||||||
|
And I wait 1 second
|
||||||
|
Then a new supplier with the existing employee should be created
|
||||||
|
And the supplier should be redirected to the supplier '/pages/introduction' path
|
||||||
|
|
||||||
|
|
||||||
|
#Scenarios
|
||||||
|
#- non existing non signed in employee
|
||||||
|
#- existing non signed in employee
|
||||||
|
#- existing signed in emloyee
|
||||||
|
#- Supplier name exist for existing employee
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
step "there is a confirmed employee" do
|
||||||
|
@employee_password = 'admin123'
|
||||||
|
@employee = nil
|
||||||
|
expect {
|
||||||
|
@employee = create :employee, :confirmed, password: @employee_password
|
||||||
|
}.to change{ Employee.count }.by 1
|
||||||
|
end
|
||||||
|
|
||||||
@@ -36,3 +36,9 @@ end
|
|||||||
step "the supplier employee visits the :path_spec path" do |path_spec|
|
step "the supplier employee visits the :path_spec path" do |path_spec|
|
||||||
visit "/supplier#/#{path_spec}"
|
visit "/supplier#/#{path_spec}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
step "the supplier should be redirected to the supplier :path path" do |path|
|
||||||
|
# route_should_be 'supplier#edit'
|
||||||
|
ember_route_should_be path
|
||||||
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -35,15 +35,9 @@ step "the supplier clicks on the new email confirmation link" do
|
|||||||
visit @confirmation_link
|
visit @confirmation_link
|
||||||
end
|
end
|
||||||
|
|
||||||
step "the supplier should be redirected to the supplier settings path" do
|
step "the supplier email is the new email" do
|
||||||
# route_should_be 'supplier#edit'
|
|
||||||
ember_route_should_be '/settings'
|
|
||||||
end
|
|
||||||
|
|
||||||
step "the supplier email is the new email and the unconfirmed email is empty" do
|
|
||||||
@supplier.reload
|
@supplier.reload
|
||||||
@supplier.email.should == 'new-supplier-mail@mozo.bar'
|
@supplier.email.should == 'new-supplier-mail@mozo.bar'
|
||||||
@supplier.unconfirmed_email.should be_blank
|
|
||||||
end
|
end
|
||||||
|
|
||||||
step "the supplier selects :time_zone as Time Zone" do |visual_time_zone|
|
step "the supplier selects :time_zone as Time Zone" do |visual_time_zone|
|
||||||
@@ -51,6 +45,7 @@ step "the supplier selects :time_zone as Time Zone" do |visual_time_zone|
|
|||||||
end
|
end
|
||||||
|
|
||||||
step "the supplier timezone should be :time_zone" do |time_zone|
|
step "the supplier timezone should be :time_zone" do |time_zone|
|
||||||
|
sleep 1
|
||||||
@supplier.reload
|
@supplier.reload
|
||||||
@supplier.time_zone.should == time_zone
|
@supplier.time_zone.should == time_zone
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,29 +1,50 @@
|
|||||||
|
|
||||||
step "I visit the supplier signup path" do
|
step "I visit the supplier signup path" do
|
||||||
visit new_supplier_registration_path
|
visit new_suppliers_path
|
||||||
end
|
end
|
||||||
|
|
||||||
step "fill in the supplier signup form with new credentials" do
|
step "fill in the supplier signup form with new credentials" do
|
||||||
js_set_field '#supplier_name', 'Signup Supplier'
|
js_set_field '#new_supplier_supplier_name', 'Signup Supplier'
|
||||||
js_set_field '#supplier_email', 'signup_supplier@example.com'
|
js_set_field '#new_supplier_email', 'signup_supplier@example.com'
|
||||||
js_set_field '#supplier_password', 'SignupSupplier'
|
js_set_field '#new_supplier_password', 'SignupSupplier'
|
||||||
js_set_field '#supplier_password_confirmation', 'SignupSupplier'
|
js_set_field '#new_supplier_password_confirmation', 'SignupSupplier'
|
||||||
|
end
|
||||||
|
step "fill in the supplier signup form with existing employee credentials" do
|
||||||
|
js_set_field '#new_supplier_supplier_name', 'Signup Supplier'
|
||||||
|
js_set_field '#new_supplier_email', @employee.email
|
||||||
|
js_set_field '#new_supplier_password', @employee_password
|
||||||
|
js_set_field '#new_supplier_password_confirmation', @employee_password
|
||||||
end
|
end
|
||||||
|
|
||||||
step "click on the supplier signup submit button" do
|
step "click on the supplier signup submit button" do
|
||||||
find('[name="commit"]').click
|
find('[name="commit"]').click
|
||||||
end
|
end
|
||||||
|
|
||||||
step "a new unconfirmed supplier with the new signup credentials should be created" do
|
step "a new supplier with the new signup data should be created" do
|
||||||
@signup_supplier = Supplier.find_by_email('signup_supplier@example.com')
|
@signup_supplier = Supplier.find_by_name('Signup Supplier')
|
||||||
@signup_supplier.should be_present
|
@signup_supplier.should be_present
|
||||||
@signup_supplier.should_not be_confirmed
|
|
||||||
|
@signup_employee = Employee.find_by_email('signup_supplier@example.com')
|
||||||
|
@signup_employee.should be_present
|
||||||
|
|
||||||
|
@employee_settings = @signup_supplier.settings_for(@signup_employee)
|
||||||
|
@employee_settings.should be_present
|
||||||
|
@employee_settings.manager?.should be true
|
||||||
|
end
|
||||||
|
|
||||||
|
step "a new supplier with the existing employee should be created" do
|
||||||
|
@signup_supplier = Supplier.find_by_name('Signup Supplier')
|
||||||
|
@signup_supplier.should be_present
|
||||||
|
Employee.count.should eq 1 # No new employee, but existing
|
||||||
|
@employee_settings = @signup_supplier.settings_for(@employee)
|
||||||
|
@employee_settings.should be_present
|
||||||
|
@employee_settings.manager?.should be true
|
||||||
end
|
end
|
||||||
|
|
||||||
step "a supplier signup confirmation mail should be sent containing a link to the token" do
|
step "a supplier signup confirmation mail should be sent containing a link to the token" do
|
||||||
mail = ActionMailer::Base.deliveries.last
|
mail = ActionMailer::Base.deliveries.last
|
||||||
mail.should be_present
|
mail.should be_present
|
||||||
mail.body.should match /confirmation_token=#{@signup_supplier.confirmation_token}/
|
mail.body.should match /confirmation_token=\w+/
|
||||||
end
|
end
|
||||||
|
|
||||||
step "I visit the supplier signup confirmation path with the correct token" do
|
step "I visit the supplier signup confirmation path with the correct token" do
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ FactoryGirl.define do
|
|||||||
password 'secret'
|
password 'secret'
|
||||||
|
|
||||||
trait :confirmed do
|
trait :confirmed do
|
||||||
confirmed_at { Time.now }
|
#confirmed_at { Time.now }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user