Compare commits

..

5 Commits

Author SHA1 Message Date
Bilal
c17f41525d fix MR comment 2020-07-15 19:03:35 +02:00
Bilal
d12cec8487 remove validation and add specs 2020-07-15 12:25:54 +02:00
Bilal
bde18ab0f1 add Chat Now button 2020-07-15 12:25:54 +02:00
Bilal
fc320a3421 rebase 2020-07-15 12:25:54 +02:00
Senad Uka
7f49f31ebf Master sync 2020-07-15 11:58:34 +02:00
22 changed files with 110 additions and 366 deletions

View File

@@ -33,6 +33,11 @@ class BroadcastsController < ApplicationController
end end
def update def update
unless params.has_key?(:broadcast)
@broadcast.regenerate_token
redirect_to([@project, @broadcast], notice: t('.reset_notice')) and return
end
@broadcast.update(broadcast_params) @broadcast.update(broadcast_params)
@files = @broadcast.files.order("created_at DESC").paginate(page: 1) @files = @broadcast.files.order("created_at DESC").paginate(page: 1)

View File

@@ -1,33 +0,0 @@
# frozen_string_literal: true
class ContractTemplates::DuplicatesController < ApplicationController
before_action :set_contract_template
def create
authorize(ContractTemplate)
new_contract_template = @contract_template.dup
new_contract_template.name = I18n.t('contract_templates.duplicate.name_prefix', template_name: @contract_template.name)
# Duplicate rich text fields
new_contract_template.body = @contract_template.body
new_contract_template.guardian_clause = @contract_template.guardian_clause
new_contract_template.signature_legal_text = @contract_template.signature_legal_text
if new_contract_template.save
redirect_to [:edit, new_contract_template]
else
redirect_to [@contract_template.project, :contract_templates], alert: t('.error')
end
end
private
def contract_templates
policy_scope(ContractTemplate)
end
def set_contract_template
@contract_template = contract_templates.find(params[:contract_template_id])
end
end

View File

@@ -5,9 +5,8 @@ class ContractTemplatesController < ApplicationController
layout 'project' layout 'project'
before_action :set_project, except: [:destroy, :edit, :update] before_action :set_project, except: [:destroy]
before_action :set_contract_template, only: [:destroy, :edit, :update] before_action :set_contract_template, only: [:destroy]
before_action :set_project_from_contract_template, only: [:edit, :update]
before_action :show_splash_screen, only: :index before_action :show_splash_screen, only: :index
def index def index
@@ -33,20 +32,6 @@ class ContractTemplatesController < ApplicationController
end end
end end
def edit
@release_type = @contract_template.release_type
end
def update
@contract_template.attributes = contract_template_params
if @contract_template.save
redirect_to [@project, :contract_templates], notice: t('.notice')
else
render :edit
end
end
def destroy def destroy
@contract_template.archive @contract_template.archive
redirect_to [@contract_template.project, :contract_templates], alert: t('.archived_notice') redirect_to [@contract_template.project, :contract_templates], alert: t('.archived_notice')
@@ -54,10 +39,6 @@ class ContractTemplatesController < ApplicationController
private private
def set_project_from_contract_template
@project = @contract_template.project
end
def show_splash_screen def show_splash_screen
render :splash if contract_templates.non_archived.count.zero? render :splash if contract_templates.non_archived.count.zero?
end end

View File

@@ -69,13 +69,9 @@ class ContractTemplate < ApplicationRecord
(1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence } (1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence }
end end
def editable?
releases.size.zero?
end
def attributes def attributes
result = super() result = super()
result[:signature_legal_text] = signature_legal_text.as_json result[:signature_legal_text] = signature_legal_text.as_json
result result
end end
end end

View File

@@ -6,5 +6,5 @@ class TaskRequest < ApplicationRecord
scope :order_by_recent, -> { order(created_at: :desc) } scope :order_by_recent, -> { order(created_at: :desc) }
validates :time_allowed, numericality: { only_integer: true, greater_than_or_equal_to: 2 } validates :time_allowed, numericality: { only_integer: true, greater_than_or_equal_to: 2 }, allow_blank: true
end end

View File

@@ -23,18 +23,6 @@ class ContractTemplatePolicy < ApplicationPolicy
create? create?
end end
def edit?
record.editable? && create?
end
def update?
edit?
end
def duplicate?
create?
end
def import? def import?
if user.account_manager? if user.account_manager?
record.project.account = user.account record.project.account = user.account

View File

@@ -102,6 +102,7 @@
<i class="fa fa-clipboard"></i> <i class="fa fa-clipboard"></i>
Copy URL Copy URL
</button> </button>
<%= link_to t('.actions.reset_url'), [@project, @broadcast], method: :patch, class: "btn btn-danger" %>
</div> </div>
<% else %> <% else %>
<input type="text" class="form-control" value="<%= broadcast_url(@broadcast.token) %>" readonly> <input type="text" class="form-control" value="<%= broadcast_url(@broadcast.token) %>" readonly>
@@ -110,6 +111,7 @@
<i class="fa fa-clipboard"></i> <i class="fa fa-clipboard"></i>
Copy URL Copy URL
</button> </button>
<%= link_to t('.actions.reset_url'), [@project, @broadcast], method: :patch, class: "btn btn-danger" %>
</div> </div>
<% end %> <% end %>
</div> </div>

View File

@@ -19,12 +19,6 @@
<div class="btn-group"> <div class="btn-group">
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %> <%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
<div class="dropdown-menu dropdown-menu-right"> <div class="dropdown-menu dropdown-menu-right">
<% if policy(contract_template).edit? %>
<%= link_to fa_icon("pencil fw", text: t(".actions.edit")), [:edit, contract_template], class: "dropdown-item" %>
<% end %>
<% if policy(ContractTemplate).duplicate? %>
<%= link_to fa_icon("clone fw", text: t(".actions.duplicate")), contract_template_duplicates_path(contract_template), method: :post, class: "dropdown-item" %>
<% end %>
<% if policy(QrCode).show? %> <% if policy(QrCode).show? %>
<%= link_to fa_icon("qrcode", text: t(".actions.qr_code")), [contract_template, :qr_codes], class: "dropdown-item", target: :_blank %> <%= link_to fa_icon("qrcode", text: t(".actions.qr_code")), [contract_template, :qr_codes], class: "dropdown-item", target: :_blank %>
<% end %> <% end %>

View File

@@ -1,4 +1,4 @@
<%= bootstrap_form_with model: model, local: true do |form| %> <%= bootstrap_form_with model: [project, contract_template], local: true do |form| %>
<%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %> <%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
<div class="form-row"> <div class="form-row">
<%= form.text_field :name, wrapper_class: "col-sm-6" %> <%= form.text_field :name, wrapper_class: "col-sm-6" %>

View File

@@ -1,6 +0,0 @@
<div class="card shadow-sm">
<%= card_header text: t(".heading"), close_action_path: [@project, :contract_templates] %>
<div class="card-body">
<%= render "form", model: @contract_template, project: @project, contract_template: @contract_template %>
</div>
</div>

View File

@@ -1,6 +1,6 @@
<div class="card shadow-sm"> <div class="card shadow-sm">
<%= card_header text: t(".heading"), close_action_path: [@project, :contract_templates] %> <%= card_header text: t(".heading"), close_action_path: [@project, :contract_templates] %>
<div class="card-body"> <div class="card-body">
<%= render "form", model: [@project, @contract_template], project: @project, contract_template: @contract_template %> <%= render "form", project: @project, contract_template: @contract_template %>
</div> </div>
</div> </div>

View File

@@ -1,9 +1,19 @@
<%= errors_summary_for task_request %> <%= errors_summary_for task_request %>
<%= bootstrap_form_with model: model, url: [@project, @task_request, show_chat: true], local: true do |form| %> <%= bootstrap_form_with model: model, url: [@project, @task_request, show_chat: true], local: true do |form| %>
<div class="alert alert-info text-center text-md-left">
<%= fa_icon "info-circle" %> <div class="d-flex">
<strong><%= t '.info_message' %></strong> <div class="row">
<div class="col-xl-10 col-12">
<div class="alert alert-info text-center text-md-left">
<%= fa_icon "info-circle" %>
<strong><%= t '.info_message' %></strong>
</div>
</div>
<div class="col-xl-2 col-12">
<%= form.submit t('.actions.chat_now'), class: "btn btn-block btn-warning pt-4 pb-4 mb-1", data: { disable_with: t("shared.disable_with") } %>
</div>
</div>
</div> </div>
<%= form.text_area :description, label: t('.labels.description') %> <%= form.text_area :description, label: t('.labels.description') %>

View File

@@ -217,6 +217,9 @@ en:
new: new:
heading: heading:
Create Live Stream Create Live Stream
show:
actions:
reset_url: Reset URL
splash: splash:
actions: actions:
book_demo: Schedule a Demo book_demo: Schedule a Demo
@@ -235,6 +238,8 @@ en:
share_stream: Share live stream link with clients share_stream: Share live stream link with clients
stream_from_mobile_app: Stream from ME Suite Mobile app, or via a professional camera stream_from_mobile_app: Stream from ME Suite Mobile app, or via a professional camera
stream_multiple_cameras: Stream multiple cameras at one time stream_multiple_cameras: Stream multiple cameras at one time
update:
reset_notice: The Share URL has been reset, and the previous URL will no longer work. Please click "Copy URL" and share it again with those who you want to have access to this live stream
bulk_taggings: bulk_taggings:
new_bulk_tag_modal: new_bulk_tag_modal:
submit: Add submit: Add
@@ -250,8 +255,6 @@ en:
contract_template: contract_template:
actions: actions:
copy_url: Copy Release URL copy_url: Copy Release URL
duplicate: Duplicate
edit: Edit
manage: Manage manage: Manage
qr_code: QR Code qr_code: QR Code
sign: Sign sign: Sign
@@ -261,13 +264,6 @@ en:
destroy: destroy:
archived_failure: Failed to archive the release template archived_failure: Failed to archive the release template
archived_notice: The release template has been archived archived_notice: The release template has been archived
duplicate:
name_prefix: Copy of %{template_name}
duplicates:
create:
error: Failed to duplicate release template
edit:
heading: Edit Contract Template
form: form:
custom_fields: custom_fields:
heading: Questionnaire heading: Questionnaire
@@ -306,8 +302,6 @@ en:
manage_large_audience: Easily manage large audiences with the crowd control feature manage_large_audience: Easily manage large audiences with the crowd control feature
print_QR_code: Print out release QR codes print_QR_code: Print out release QR codes
releases_automatically_organized: Releases are automatically organized as theyre submitted releases_automatically_organized: Releases are automatically organized as theyre submitted
update:
notice: The release template has been updated
contracts: contracts:
for_office_use_only: for_office_use_only:
description_labels: description_labels:
@@ -700,7 +694,6 @@ en:
update: Save Changes update: Save Changes
contract_template: contract_template:
create: Create Release Template create: Create Release Template
update: Save Changes
directory: directory:
create: Create Folder create: Create Folder
new_file: Upload Files new_file: Upload Files
@@ -1291,7 +1284,9 @@ en:
heading: heading:
Edit Task Request Edit Task Request
form: form:
info_message: After submitting this task request, you'll be connected via chat with a ME Suite representative. actions:
chat_now: Chat Now
info_message: For best results, please fill out this form prior to being connected with a TaskME assistant. However, if urgent, you can start speaking with a TaskME assistant by pressing the Chat Now button to the right
labels: labels:
additional_notes: Please add any additional notes we should be aware of regarding this task. additional_notes: Please add any additional notes we should be aware of regarding this task.
deadline: What is the deadline for this task? deadline: What is the deadline for this task?

View File

@@ -81,6 +81,9 @@ es:
do_not_copy_warning: "Do not copy (ES)" do_not_copy_warning: "Do not copy (ES)"
serial_number_label: "Serial Number (ES)" serial_number_label: "Serial Number (ES)"
broadcasts: broadcasts:
show:
actions:
reset_url: Reset URL (ES)
splash: splash:
actions: actions:
book_demo: Schedule a Demo book_demo: Schedule a Demo
@@ -99,21 +102,12 @@ es:
share_stream: Share live stream link with clients share_stream: Share live stream link with clients
stream_from_mobile_app: Stream from ME Suite Mobile app, or via a professional camera stream_from_mobile_app: Stream from ME Suite Mobile app, or via a professional camera
stream_multiple_cameras: Stream multiple cameras at one time stream_multiple_cameras: Stream multiple cameras at one time
update:
reset_notice: The Share URL has been reset, and the previous URL will no longer work. Please click "Copy URL" and share it again with those who you want to have access to this live stream
contract_templates: contract_templates:
blank_contracts: blank_contracts:
create: create:
number_of_copies_invalid_notice: Please enter valid number greater than 0 (ES) number_of_copies_invalid_notice: Please enter valid number greater than 0 (ES)
contract_template:
actions:
duplicate: Duplicate (ES)
edit: Edit (ES)
duplicate:
name_prefix: Copy of %{template_name} (ES)
duplicates:
create:
error: Failed to duplicate release template (ES)
edit:
heading: Edit Contract Template (ES)
form: form:
custom_fields: custom_fields:
heading: Medical Questionnaire (ES) heading: Medical Questionnaire (ES)
@@ -140,8 +134,6 @@ es:
manage_large_audience: Easily manage large audiences with the crowd control feature (ES) manage_large_audience: Easily manage large audiences with the crowd control feature (ES)
print_QR_code: Print out release QR codes (ES) print_QR_code: Print out release QR codes (ES)
releases_automatically_organized: Releases are automatically organized as theyre submitted (ES) releases_automatically_organized: Releases are automatically organized as theyre submitted (ES)
update:
notice: The release template has been updated (ES)
contracts: contracts:
for_office_use_only: for_office_use_only:
description_labels: description_labels:
@@ -317,8 +309,6 @@ es:
broadcast: broadcast:
create: Create Live Stream (ES) create: Create Live Stream (ES)
update: Save Changes (ES) update: Save Changes (ES)
contract_template:
update: Save changes (ES)
create: 'Crear %{model}' create: 'Crear %{model}'
medical_release: medical_release:
update: Approve (ES) update: Approve (ES)
@@ -494,7 +484,9 @@ es:
create: create:
success_message: Your task request was successfully submitted. Thank you. A chat window will pop up on the lower right in a few seconds. (ES) success_message: Your task request was successfully submitted. Thank you. A chat window will pop up on the lower right in a few seconds. (ES)
form: form:
info_message: After submitting this task request, you'll be connected via chat with a ME Suite representative. (ES) actions:
chat_now: Chat Now (ES)
info_message: For best results, please fill out this form prior to being connected with a TaskME assistant. However, if urgent, you can start speaking with a TaskME assistant by pressing the Chat Now button to the right (ES)
index: index:
table_headers: table_headers:
task_request_description: Description (ES) task_request_description: Description (ES)

View File

@@ -56,10 +56,9 @@ Rails.application.routes.draw do
resources :talent_releases, except: [:show], concerns: [:contractable, :notable, :photoable] resources :talent_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
resources :medical_releases, except: [:show], concerns: [:contractable, :notable, :photoable] resources :medical_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
resources :misc_releases, except: [:show], concerns: [:contractable, :notable, :photoable] resources :misc_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
resources :contract_templates, only: [:index, :new, :create, :edit, :update, :destroy] do resources :contract_templates, only: [:index, :new, :create, :destroy] do
resource :qr_codes, only: [:show], controller: "contract_templates/qr_codes" resource :qr_codes, only: [:show], controller: "contract_templates/qr_codes"
resource :blank_contracts, only: [:show, :new, :create], controller: "contract_templates/blank_contracts" resource :blank_contracts, only: [:show, :new, :create], controller: "contract_templates/blank_contracts"
resource :duplicates, only: [:create], controller: "contract_templates/duplicates"
end end
resource :release_template_imports, only: [:new, :create] resource :release_template_imports, only: [:new, :create]
resources :project_memberships, only: [:index, :create, :destroy] resources :project_memberships, only: [:index, :create, :destroy]

View File

@@ -203,6 +203,15 @@ RSpec.describe BroadcastsController, type: :controller do
expect(BroadcastsChannel).to have_received(:broadcast_file_upload_updates) expect(BroadcastsChannel).to have_received(:broadcast_file_upload_updates)
end end
it "regenerates token if #update is called without broadcast param" do
old_token = broadcast.token
patch :update, params: { project_id: project.id, id: broadcast.id }
expect(response).to redirect_to [project, broadcast]
expect(flash.notice).to eq token_reset_notice
expect(Broadcast.last.token).not_to eq old_token
end
end end
describe "#destroy" do describe "#destroy" do
@@ -252,4 +261,8 @@ RSpec.describe BroadcastsController, type: :controller do
def create_stream def create_stream
t 'broadcasts.splash.actions.create_stream' t 'broadcasts.splash.actions.create_stream'
end end
def token_reset_notice
t 'broadcasts.update.reset_notice'
end
end end

View File

@@ -1,30 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
describe ContractTemplates::DuplicatesController do
let(:account) { build(:account) }
let(:current_user) { create(:user, :manager, primary_account: account) }
let(:project) { create(:project, members: [current_user], account: account) }
before do
sign_in(current_user)
end
describe '#create' do
it "responds with redirect to the edit page for newly created duplicate" do
contract_template = create(:contract_template, project: project)
expect do
post :create, params: { contract_template_id: contract_template }
end.to change(ContractTemplate, :count).by(1)
new_ct = ContractTemplate.last
expect(new_ct.name).to eq t('contract_templates.duplicate.name_prefix', template_name: contract_template.name)
expect(new_ct.release_type).to eq contract_template.release_type
expect(response).to redirect_to [:edit, new_ct]
end
end
end

View File

@@ -118,57 +118,6 @@ describe ContractTemplatesController do
end end
end end
describe '#edit' do
let(:contract_template) do
create(:contract_template,
name: 'My Contract Template', fee: 50, release_type: 'appearance',
project: project)
end
it 'responds ok' do
get :edit, params: { project_id: project, id: contract_template }
expect(response).to be_successful
end
context 'when current user is an associate' do
let(:current_user) { create(:user, :associate) }
it 'raises exception' do
expect do
get :edit, params: { project_id: project, id: contract_template }
end.to raise_error(Pundit::NotAuthorizedError)
end
end
end
describe '#update' do
let(:contract_template) do
create(:contract_template,
name: 'My Contract Template', fee: 50, release_type: 'appearance',
project: project)
end
it 'redirects' do
patch :update, params: { project_id: project, id: contract_template, contract_template: contract_template_params }
expect(response).to redirect_to(project_contract_templates_path(project))
end
context 'when current user is an associate' do
let(:current_user) { create(:user, :associate) }
it 'raises exception' do
expect do
patch :update, params: { project_id: project, id: contract_template, contract_template: contract_template_params }
end.to raise_error(Pundit::NotAuthorizedError)
end
end
end
describe '#destroy' do describe '#destroy' do
let!(:contract_template) { create(:contract_template, project: project) } let!(:contract_template) { create(:contract_template, project: project) }

View File

@@ -262,93 +262,6 @@ RSpec.feature 'User manages contract templates', type: :feature do
expect(page).to have_content('Active template') expect(page).to have_content('Active template')
end end
scenario 'edit button is visible for not-signed contract template' do
create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_link(edit_button_label, exact: true, count: 1)
end
scenario 'edit button is not visible for signed contract template' do
ct = create(:contract_template, project: project)
create(:appearance_release, contract_template: ct)
visit project_contract_templates_path(project)
expect(page).to have_link(edit_button_label, exact: true, count: 0)
end
scenario 'duplicate button is visible for not signed contract template' do
create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
end
scenario 'duplicate button is visible for signed contract template' do
ct = create(:contract_template, project: project)
create(:appearance_release, contract_template: ct)
visit project_contract_templates_path(project)
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
end
scenario 'clicking edit button opens edit page for contract template' do
ct = create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_content ct.name
expect(page).not_to have_content 'Updated CT'
expect(page).not_to have_content 'Medical'
click_link edit_button_label
expect(page).to have_content edit_page_heading
fill_in name_field, with: 'Updated CT'
select 'Medical Release', from: 'Release type'
fill_in_trix body_field, with: 'Updated legal text'
click_on update_contract_template_button_label
expect(page).to have_content 'Updated CT'
expect(page).to have_content 'Medical'
end
scenario 'clicking duplicate button opens edit page for newly created contract template' do
ct = create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_content ct.name
expect(page).not_to have_content 'Modified duplicate'
expect(page).not_to have_content 'Misc'
expect do
click_link duplicate_button_label
end.to change(ContractTemplate, :count).by(1)
expect(page).to have_content edit_page_heading
name_input = find("##{name_field}")
expect(name_input.value).to eq duplicate_release_name(ct.name)
fill_in name_field, with: 'Modified duplicate'
select 'Misc Release', from: 'Release type'
fill_in_trix body_field, with: 'Legal text for duplicate'
click_on update_contract_template_button_label
expect(page).to have_content 'Modified duplicate'
expect(page).to have_content 'Misc'
expect(ct.body.id).not_to eq ContractTemplate.last.body.id
expect(ct.guardian_clause.id).not_to eq ContractTemplate.last.guardian_clause.id
expect(ct.signature_legal_text.id).not_to eq ContractTemplate.last.signature_legal_text.id
end
context 'When the user is associate' do context 'When the user is associate' do
let(:current_user) { create(:user, :associate) } let(:current_user) { create(:user, :associate) }
@@ -367,22 +280,6 @@ RSpec.feature 'User manages contract templates', type: :feature do
expect(page).to have_content schedule_demo expect(page).to have_content schedule_demo
expect(page).not_to have_content create_release_template expect(page).not_to have_content create_release_template
end end
it 'does not show edit button' do
create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_link(edit_button_label, exact: true, count: 0)
end
it 'does not show duplicate button' do
create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_link(duplicate_button_label, exact: true, count: 0)
end
end end
context 'When the user is account manager' do context 'When the user is account manager' do
@@ -403,40 +300,6 @@ RSpec.feature 'User manages contract templates', type: :feature do
expect(page).to have_content schedule_demo expect(page).to have_content schedule_demo
expect(page).to have_content create_release_template expect(page).to have_content create_release_template
end end
it 'shows edit button when contract template is not signed' do
create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_link(edit_button_label, exact: true, count: 1)
end
it 'does not show edit button when contract template is signed' do
ct = create(:contract_template, project: project)
create(:appearance_release, contract_template: ct)
visit project_contract_templates_path(project)
expect(page).to have_link(edit_button_label, exact: true, count: 0)
end
it 'shows duplicate button when contract template is not signed' do
create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
end
it 'shows duplicate button when contract template is signed' do
ct = create(:contract_template, project: project)
create(:appearance_release, contract_template: ct)
visit project_contract_templates_path(project)
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
end
end end
private private
@@ -492,28 +355,4 @@ RSpec.feature 'User manages contract templates', type: :feature do
def signature_legal_text_trix_field def signature_legal_text_trix_field
'Signature legal text' 'Signature legal text'
end end
def edit_button_label
t 'contract_templates.contract_template.actions.edit'
end
def duplicate_button_label
t 'contract_templates.contract_template.actions.duplicate'
end
def edit_page_heading
t 'contract_templates.edit.heading'
end
def name_field
'contract_template_name'
end
def update_contract_template_button_label
t 'helpers.submit.contract_template.update'
end
def duplicate_release_name(template_name = '')
t 'contract_templates.duplicate.name_prefix', template_name: template_name
end
end end

View File

@@ -63,6 +63,21 @@ feature 'User managing broadcasts' do
expect(page).to have_content(recording.download_file_name) expect(page).to have_content(recording.download_file_name)
end end
scenario 'Clicking Reset URL regenerates broadcast token' do
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
old_token = broadcast.token
visit project_broadcast_path(project, broadcast)
expect(page).to have_content reset_url
expect(page).to have_xpath "//input[@readonly][@value='#{broadcast_url(old_token)}']"
click_link reset_url
expect(Broadcast.last.token).not_to eq old_token
expect(page).to have_xpath "//input[@readonly][@value='#{broadcast_url(Broadcast.last.token)}']"
expect(page).to have_content token_reset_notice
end
scenario 'user can go back and forth between live session and previous sessions', js: true do scenario 'user can go back and forth between live session and previous sessions', js: true do
broadcast = create(:broadcast, :with_stream, :with_files, project: project) broadcast = create(:broadcast, :with_stream, :with_files, project: project)
recording = create(:broadcast_recording, broadcast: broadcast) recording = create(:broadcast_recording, broadcast: broadcast)
@@ -189,4 +204,12 @@ feature 'User managing broadcasts' do
def create_stream def create_stream
t 'broadcasts.splash.actions.create_stream' t 'broadcasts.splash.actions.create_stream'
end end
def reset_url
t 'broadcasts.show.actions.reset_url'
end
def token_reset_notice
t 'broadcasts.update.reset_notice'
end
end end

View File

@@ -91,6 +91,21 @@ feature "User managing task requests" do
expect(page).to have_content add_new_project_label expect(page).to have_content add_new_project_label
end end
scenario "user can click Chat Now and start chat event with a blank form" do
visit project_task_requests_path(project)
click_on create_task_request
expect(page).to have_content chat_now_button
expect(page).to have_content form_notice
expect do
click_on chat_now_button
end.to change(TaskRequest, :count).by(1)
expect(page).to have_content task_request_created_notice
end
private private
def no_task_requests_label def no_task_requests_label
@@ -120,4 +135,20 @@ feature "User managing task requests" do
def schedule_demo def schedule_demo
t 'task_requests.splash.actions.book_demo' t 'task_requests.splash.actions.book_demo'
end end
def create_task_request
t 'task_requests.index.actions.new'
end
def chat_now_button
t 'task_requests.form.actions.chat_now'
end
def form_notice
t 'task_requests.form.info_message'
end
def task_request_created_notice
t 'task_requests.create.success_message'
end
end end

View File

@@ -13,8 +13,4 @@ RSpec.describe TaskRequest, type: :model do
subject { described_class } subject { described_class }
it { is_expected.to respond_to(:order_by_recent) } it { is_expected.to respond_to(:order_by_recent) }
end end
describe "#validations" do
it { should validate_numericality_of(:time_allowed).only_integer.is_greater_than_or_equal_to(2) }
end
end end