Acceptance tests for user

This commit is contained in:
2015-09-17 17:46:33 +02:00
parent 8e931cabd4
commit cb744943bd
35 changed files with 91 additions and 49 deletions
+1
View File
@@ -46,3 +46,4 @@ erl_crash.dump
/*.autosave
/db/data
/db/config
public/user
+2 -1
View File
@@ -99,6 +99,7 @@ end
group :development, :test do
gem 'rspec-rails'
gem 'pry-rails'
gem 'pry-doc'
gem 'test_squad'
gem 'factory_girl_rails'
end
@@ -124,7 +125,7 @@ group :test do
#gem 'capybara-webkit' #, '~>0.14.2' # version 1.1.0 does not yet compile in mavericks
#gem 'selenium-webdriver', '~> 2.45.0.dev3'
gem 'selenium-webdriver'
gem 'hashie'
gem 'timecop'
#gem 'poltergeist'
#gem 'capybara-webkit'
gem 'capybara-screenshot'
+8 -2
View File
@@ -31,7 +31,7 @@ GIT
GIT
remote: git://github.com/bterkuile/simply_stored.git
revision: 57773e8d4b3fc3410875576b3257ffa628e8d4ec
revision: 323c11efe7f86b3e156acfa7e53d8f06d8fb73c4
specs:
simply_stored (1.0.0)
activesupport
@@ -313,6 +313,9 @@ GEM
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-doc (0.8.0)
pry (~> 0.9)
yard (~> 0.8)
pry-rails (0.3.4)
pry (>= 0.9.10)
puma (2.13.4)
@@ -436,6 +439,7 @@ GEM
thor (0.19.1)
thread_safe (0.3.5)
tilt (2.0.1)
timecop (0.8.0)
timers (4.0.4)
hitimes
tinymce-rails (4.2.5)
@@ -467,6 +471,7 @@ GEM
websocket-extensions (0.1.2)
xpath (2.0.0)
nokogiri (~> 1.3)
yard (0.8.7.6)
PLATFORMS
ruby
@@ -499,7 +504,6 @@ DEPENDENCIES
foreman
foundation-rails
fuubar
hashie
iso_country_codes
jquery-rails
jquery-ui-rails
@@ -514,6 +518,7 @@ DEPENDENCIES
omniauth-instagram
paperclip (>= 4.2.4, != 4.3.0)
pickadate-rails
pry-doc
pry-rails
puma
quiet_assets
@@ -534,6 +539,7 @@ DEPENDENCIES
sucker_punch
test_squad
therubyracer
timecop
turnip
uglifier (>= 1.0.3)
web-console (~> 2.0.0)
+1 -1
View File
@@ -31,7 +31,7 @@ module Admin
sign_in user
render layout: false
else
render nothing: true
head :not_found
end
end
+1 -1
View File
@@ -59,7 +59,7 @@ private
end
def _render_with_renderer_json(resource, options)
return super if resource.is_a?(Hash)
return super if resource.is_a?(Hash) or resource.is_a?(String)
options[:serializer] ||= begin
if resource.is_a?(SimplyStored::Couch)
#infer based on controller path replacing actual controller part with resouce part /lists/:id/table
+6 -1
View File
@@ -14,7 +14,7 @@ module Users
#EMBER
def current
@list = current_user.active_list
params[:id] = @list.id # serializer determines collection or not based on the presence of this
params[:id] = @list.try(:id) # serializer determines collection or not based on the presence of this
show
end
@@ -67,6 +67,11 @@ module Users
# POST /user/lists/:id/order_products
def order_products
res = {}
unless active_list.present?
res[:list_closed] = true
render json: res, status: 404
return
end
res[:supplier_closed] = active_list.supplier.closed?
unless res[:supplier_closed]
# Create new list
+1 -1
View File
@@ -75,7 +75,7 @@ module Users
list = List.from_table( table, current_user )
res[:active_list_id] = list.id # used to set the active list in the app
order = list.place_order product_orders: product_orders, user: current_user, first_order: true
res[:payload] = JSONAPI::Serializer.serialize(order, serializer: Users::OrderSerializer, include: %w[list product_orders])
res[:payload] = JSONAPI::Serializer.serialize(order, serializer: Users::OrderSerializer, include: %w[list list.users product_orders])
end
render json: res
end
+5
View File
@@ -0,0 +1,5 @@
module UsersHelper
def user_ember_target
"*"
end
end
+2 -2
View File
@@ -163,7 +163,7 @@ class List
for user in users
user.active_list_id = nil
user.save
broadcast_user user.id, 'list_closed', broadcast_info
#broadcast_user user.id, 'list_closed', broadcast_info
end
broadcast_supplier supplier_id, 'list_closed', broadcast_info
end
@@ -333,7 +333,7 @@ class List
user
product_orders
])
broadcast_users 'new_order', user_payload
broadcast_users 'new_order', supplier_orders_placed_count: orders_placed_count, payload: user_payload
broadcast_supplier supplier.id, 'new_order', supplier_orders_placed_count: orders_placed_count, payload: supplier_payload
end
#broadcast_supplier supplier.id, 'orders_placed_count', count: orders_placed_count # done inside new order payload
+1 -1
View File
@@ -20,7 +20,7 @@ class List
self.join_request_user_ids |= [requester.id]
self.is_dirty
if save
broadcast_users 'user_join_request', payload: JSONAPI::Serializer.serialize( join_request_for_user(requester), serializer: Users::JoinRequestSerializer, include: %w[list user])
broadcast_users 'user_join_request', payload: Users::JoinRequestSerializer.serialize(join_request_for_user(requester), include: %w[list user])
end
end
end
+3 -1
View File
@@ -13,7 +13,9 @@ class User
property :oauth_expires_at
property :auth_data
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :omniauthable, :omniauth_providers => [:facebook, :instagram] #, :token_authenticatable , :registerable
devise_plugins = [:database_authenticatable, :recoverable, :rememberable, :trackable, :omniauthable, {omniauth_providers: [:facebook, :instagram]}] #, :token_authenticatable , :registerable
devise_plugins -= [:trackable] if Rails.env.test? # creates conflicts
devise *devise_plugins
property :authentication_token
+1 -1
View File
@@ -1,5 +1,5 @@
class Users::SupplierSerializer
include Qwaiter::UserBaseSerializer
attributes :open, :name
attributes :open, :name, :orders_placed_count, :orders_in_process_count
has_many :product_categories, serializer: Users::ProductCategorySerializer
end
@@ -5,8 +5,6 @@ html
localStorage.setItem('auth_token', '#{current_user.authentication_token}');
localStorage.setItem('user_id', '#{current_user.id}');
localStorage.setItem('locale', '#{I18n.default_locale}');
body
p Test login page
p= "Signed in as: #{current_user.email}"
+1 -1
View File
@@ -3,7 +3,7 @@
<head>
<script>
console.log("closing window");
window.opener.postMessage({user_id: '<%= params[:user_id] %>', authentication_token: '<%= params[:authentication_token] %>'}, "http://localhost:4200");
window.opener.postMessage({user_id: '<%= params[:user_id] %>', authentication_token: '<%= params[:authentication_token] %>'}, "<%= user_ember_target %>");
window.close();
</script>
</head>
+8
View File
@@ -0,0 +1,8 @@
#!/usr/bin/env ruby
require 'pathname'
require 'active_support/all'
mozo_user_path = ENV['MOZO_USER_PATH'] || Pathname.new(File.expand_path('../../../mozo-user', __FILE__))
Dir.chdir mozo_user_path do
`ember build --output-path=../mozo/public/user/ --environment=testexport` # not production, because then the production servers will be queried
end
+1 -1
View File
@@ -236,7 +236,7 @@ Devise.setup do |config|
# config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo'
if Rails.env.production?
# config.omniauth :facebook, "505160086210072", "fcc474a3fb13c6bcc0f7c83a92ad1b17",
# scope: 'email,user_birthday,publish_stream'
# scope: 'email,user_birthday,publish_actions'
config.omniauth :facebook, "653729178057509", "d4cea86f70803f1b75ed03c506a4d78e",
scope: 'email,user_birthday,publish_actions'
config.omniauth :instagram, "cd7bdfbee825499b94fb3783d1bc143b", "6b4f9ecf251c462993a696eebc0189be"
+2 -3
View File
@@ -73,11 +73,10 @@ Qwaiter::Application.routes.draw do
#post '/user/approve_join_request' => 'user#approve_join_request'
post '/user/check_table_join_status' => 'user#check_table_join_status'
#post '/user/check_table_join_status' => 'user#check_table_join_status'
get '/user/obtain_token' => 'user#obtain_token', as: :user_obtain_token
post '/user/obtain_token' => 'user#obtain_token', constraints: {format: :json}
#post '/user/obtain_token' => 'user#obtain_token', constraints: {format: :json}
get '/close_window' => 'dashboard#close_window'
namespace :users, path: '/user/api/v1' do
resources :product_categories, only: [:index]
resources :lists, only: [:index, :show] do
@@ -11,6 +11,7 @@ Feature: Joining an occupied table
And the original user should see a join request message
When the original user approves the other user's join request
Then the original user should not see the join request anymore
And the original user should see the other user added below the active list
And the other user should be added to the active list
And the other user should be redirected to active list it just joined
+1 -1
View File
@@ -20,5 +20,5 @@ step 'a new order on a table in another section is created' do
# @new_section = create :section, title: 'Terrace', supplier: @supplier
# @new_table = create :table, number: 59, section: @new_section, supplier: @supplier
@new_list = create :list, section: @other_section, table: @other_table, supplier: @supplier, user_ids: [@user.id]
@new_order = @new_list.place_order(product_orders: [ {'product_id' => @product.id, 'quantity' => 3}], user: @user)
@new_order = @new_list.place_order(product_orders: [ {'product_id' => @product.id, 'quantity' => 3}], user: @user, first_order: true)
end
+1 -1
View File
@@ -1,7 +1,7 @@
step "A new order is placed" do
@user ||= create :user
@list = create :list, state: 'active', supplier: @supplier, table: @table, section: @section, user_ids: [@user.id]
@order = @list.place_order product_orders: [{ 'product_id' => @product.id, 'quantity' => 2}], user: @user
@order = @list.place_order product_orders: [{ 'product_id' => @product.id, 'quantity' => 2}], user: @user, first_order: true
end
step "an order with :quantity products :product_name should have been created" do |quantity, product_name|
+5 -3
View File
@@ -1,6 +1,8 @@
step "the user scans a table QR code" do
step 'there is a table'
page.execute_script "App.__container__.lookup('route:application').transitionTo('table','#{@table.id}')"
when_ember_is_ready do
page.execute_script "MozoUser.__container__.lookup('route:application').transitionTo('table','#{@table.id}')"
end
end
step "I am on the user homepage" do
@@ -8,12 +10,12 @@ step "I am on the user homepage" do
end
step "the user is on the homepage" do
visit '/user'
user_visit '/'
end
step "the user should be redirected to the user order overview page" do
#route_should_be 'user#active_list'
ember_route_should_be "/active_list"
ember_route_should_be "/active-list"
end
step "the user should be redirected to the archived list path" do
+1 -1
View File
@@ -9,7 +9,7 @@ step "the order should be marked as delivered" do
end
step "another order is placed" do
@new_order = @list.place_order(product_orders: [{ 'product_id' => @product.id, 'quantity' => 5}], user: @user)
@new_order = @list.place_order(product_orders: [{ 'product_id' => @product.id, 'quantity' => 5}], user: @user, first_order: false)
end
step "the user order should be created as a new order" do
@@ -1,15 +1,11 @@
step "there is no user information stored in the local storage" do
visit '/'
user_visit '/'
page.execute_script %|Qstorage = window.localStorage|
page.execute_script(%|Qstorage.removeItem('user_id')|)
page.execute_script(%|Qstorage.removeItem('auth_token')|)
end
step "I visit the user obtain token path" do
visit user_root_path # obtain token through ember application
end
step "there is a user" do
@user ||= create :user
end
@@ -33,7 +33,9 @@ step "there is another table with an active list of another user" do
end
step "the user scans a QR code of another not occupied table" do
page.execute_script %|App.__container__.lookup('controller:select_qrcode').send('selectQr', {_id: "#{@other_table.id}"})|
when_ember_is_ready do
page.execute_script %|MozoUser.__container__.lookup('route:application').send('selectQr', {_id: "#{@other_table.id}"})|
end
#page.execute_script "Quser.actions_for_table({table_id: '#{@other_table.id}'})"
end
@@ -7,7 +7,7 @@ step "the user clicks on the submit feedback button" do
end
step "the user should see the feedback submitted message" do
page.should have_content I18n.t('user.about.feedback.received')
page.should have_content 'Thank you for your feedback'
end
step "a user feedback should be created containing the feedback" do
@@ -16,12 +16,16 @@ end
step "another user scans the QR code on the table" do
step 'there is another signed in user user'
visit user_root_path
user_visit '/'
when_ember_is_ready do
page.execute_script "App.__container__.lookup('route:application').transitionTo('table','#{@table.id}')"
page.execute_script "MozoUser.__container__.lookup('route:application').transitionTo('table','#{@table.id}')"
end
end
step "the original user should see the other user added below the active list" do
page.evaluate_script(%|$('.list-user-total-container').length()|).should eq 2
end
step "the original user approves the other user's join request" do
find('.join-request-approve').click
end
@@ -67,5 +71,5 @@ end
step "the other user should be redirected to active list it just joined" do
Capybara.session_name = :other_user
ember_route_should_be '/active_list'
ember_route_should_be '/active-list'
end
@@ -43,7 +43,7 @@ step "there is another signed in user on the same list" do
end
step 'the other user orders a product :count times' do |count|
@list.place_order product_orders: [{'product_id' => @product.id, 'quantity' => count.to_i}], user: @other_user
@list.place_order product_orders: [{'product_id' => @product.id, 'quantity' => count.to_i}], user: @other_user, first_order: false
end
step 'the other user is part of the list' do
@@ -111,7 +111,7 @@ step "the user should see an empty active order panel" do
end
step 'the user is on the order products page' do
visit "/user#/tables/#{@table.id}"
user_visit "tables/#{@table.id}"
end
step 'the user should see the products listed for the active list' do
+2 -1
View File
@@ -4,7 +4,8 @@ FactoryGirl.define do
password "secret"
trait :other_auth do
auth_data( {
sequence( :email ){|i| "test-other-user#{i}@example.com" }
auth_data( {
'info' => {
'nickname' => "UOther",
"name" => "USR Other",
+12
View File
@@ -10,5 +10,17 @@ describe "persistance" do
response.should include %|"ruby_class":"Employee"|
response.should_not include %|"id":|
end
it "stores time in UTC iso8601 format" do
time = Time.utc(1981, 3, 9, 13, 22, 2).in_time_zone
Timecop.travel time do
employee_shift = create :employee_shift, start_from: time, end_on: time + 2.hours
response = JSON.parse Net::HTTP.get URI(File.join(db_uri, employee_shift.id))
response['created_at'].should eq "1981-03-09T13:22:02Z"
response['updated_at'].should eq "1981-03-09T13:22:02Z"
response['start_from'].should eq "1981-03-09T13:22:02Z"
response['end_on'].should eq "1981-03-09T15:22:02Z"
end
end
end
end
-2
View File
@@ -9,14 +9,12 @@ describe EmployeeShift do
es2 = create :employee_shift, supplier: supplier2, start_from: 9.days.ago, end_on: 5.days.ago
es3 = create :employee_shift, supplier: supplier2, start_from: 9.days.ago, end_on: 8.days.ago
es4 = create :employee_shift, supplier: supplier2, start_from: 1.day.from_now, end_on: 1.day.from_now + 2.hours
es5 = create :employee_shift, supplier: supplier2, end_on: 1.day.from_now
results = EmployeeShift.for_supplier(supplier2)
results.should_not include(es1), 'different supplier'
results.should include(es2), 'end day within a week ago'
results.should_not include(es3), 'end day more than a week ago'
results.should include(es4) , 'Most relevant case'
results.should_not include(es5) , 'missing start_from'
end
end
end
+4 -4
View File
@@ -36,7 +36,7 @@ describe List do
expect{
list.send_table_join_request_for_user! other_user
}.to broadcast_to_user(user.id).message('user_join_request').with(
hash_including(:users, :join_request)
hash_including(:payload)
)
end
end
@@ -74,14 +74,14 @@ describe List do
it "broadcasts the event to the user itself" do
joining_user
expect{ list.approve_join_request_for_user! joining_user }
.to broadcast_to_user(joining_user).message('join_request_approved')
.with( hash_including(:user) )
.to broadcast_to_user(joining_user).message('join_request_approved')
.with( id: "jr-#{joining_user.id}" )
end
it "broadcasts the event to other associated users" do
expect{ list.approve_join_request_for_user! joining_user }
.to broadcast_to_user(user).message('join_request_approved')
.with( hash_including(:user) )
.with( id: "jr-#{joining_user.id}" )
end
end
+1
View File
@@ -24,6 +24,7 @@ Devise.stretches = 1
#Capybara.javascript_driver = :poltergeist
Capybara.javascript_driver = :selenium
Capybara.default_wait_time = 5 # ember needs more time than the default of 2
Capybara.server_port = 62625
Capybara::Screenshot.webkit_options = { width: 1024, height: 768 }
WebMock.disable_net_connect!(allow_localhost: true)
+3 -3
View File
@@ -1,7 +1,7 @@
module SpecEmberHelpers
def ember_store
h = page.evaluate_script <<-SCRIPT
$s = App.__container__.lookup('store:main');
$s = (MozoUser || App).__container__.lookup('store:main');
JSON.stringify({
lists: $s.all('list').invoke('serialize'),
orders: $s.all('order').invoke('serialize'),
@@ -85,13 +85,13 @@ module SpecEmberHelpers
def ember_find(typeKey, id)
h = page.evaluate_script <<-SCRIPT
App.__container__.lookup('store:main').all('#{typeKey}').findBy('id', '#{id}').serialize()
(MozoUser || App).__container__.lookup('store:main').all('#{typeKey}').findBy('id', '#{id}').serialize()
SCRIPT
end
def ember_all(typeKey)
h = page.evaluate_script <<-SCRIPT
App.__container__.lookup('store:main').all('#{typeKey}').invoke('serialize')
(MozoUser || App).__container__.lookup('store:main').all('#{typeKey}').invoke('serialize')
SCRIPT
end
+1 -1
View File
@@ -23,7 +23,7 @@ module Features
def user_visit(path)
#visit File.join("http://localhost:3/")
visit File.join("/user#", path)
visit File.join("/user/index.html#", path)
end
def login_employee_as(email)
+1 -1
View File
@@ -31,7 +31,7 @@ module SpecRouteHelpers
# currentRouteName does not include model information: /list/123 => currentRouteName == 'list'
# page.evaluate_script %|App.__container__.lookup('controller:application').get('currentRouteName')|
# page.evaluate_script %|App.__container__.lookup('router:main').location.lastSetURL| # not working for direct path supplier#/settings
route = page.evaluate_script(%{App.__container__ && (window.location.hash || "#/").substr(1)})
route = page.evaluate_script(%{(MozoUser || App).__container__ && (window.location.hash || "#/").substr(1)})
unless omit_should_raise
def route.should(*)
raise "Cannot call should on ember route. Use ember_route_should_be instead"