More advance signup flow

This commit is contained in:
2015-02-24 17:56:06 +01:00
parent 16418dde30
commit cb723ea432
19 changed files with 123 additions and 48 deletions
@@ -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
+8 -1
View File
@@ -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?
+3 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1
View File
@@ -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
+16 -8
View File
@@ -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
-1
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+1 -7
View File
@@ -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
+19 -5
View File
@@ -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
+1 -1
View File
@@ -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