Upstream sync
This commit is contained in:
@@ -57,6 +57,8 @@ RSpec.describe AccountsController, type: :controller do
|
||||
expect {
|
||||
post :create, params: params
|
||||
}.to have_enqueued_job(SubmitHubspotFormJob).with(
|
||||
"John",
|
||||
"Doe",
|
||||
"test_user+1@test.com",
|
||||
"Test Dev account",
|
||||
i_m_interested_in: "DirectME"
|
||||
|
||||
68
spec/controllers/admin/task_requests_controller_spec.rb
Normal file
68
spec/controllers/admin/task_requests_controller_spec.rb
Normal file
@@ -0,0 +1,68 @@
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe Admin::TaskRequestsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let!(:current_user) { create(:user, :admin) }
|
||||
|
||||
before do
|
||||
sign_in(current_user)
|
||||
end
|
||||
|
||||
describe "#index" do
|
||||
it "returns a successful response" do
|
||||
get :index
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
end
|
||||
|
||||
describe "#edit" do
|
||||
let(:task_request) { create(:task_request) }
|
||||
|
||||
it "returns a successful response" do
|
||||
get :edit, params: { id: task_request }
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it "assigns task request" do
|
||||
get :edit, params: { id: task_request }
|
||||
|
||||
expect(assigns(:task_request)).to eq task_request
|
||||
end
|
||||
end
|
||||
|
||||
describe "#update" do
|
||||
let(:task_request) { create(:task_request) }
|
||||
|
||||
it "redirects to task requests page" do
|
||||
patch :update, params: { id: task_request, task_request: update_params }
|
||||
|
||||
expect(response).to be_redirect
|
||||
expect(response).to redirect_to admin_task_requests_path
|
||||
end
|
||||
|
||||
it "sets a flash notice" do
|
||||
patch :update, params: { id: task_request, task_request: update_params }
|
||||
|
||||
expect(flash.notice).to eq "The task request has been updated successfully"
|
||||
end
|
||||
|
||||
it "updates task request" do
|
||||
patch :update, params: { id: task_request, task_request: update_params }
|
||||
|
||||
expect(task_request.reload.status).to eq("completed")
|
||||
expect(task_request.reload.deliverable_url).to eq("example.com/deliverables")
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def update_params
|
||||
{
|
||||
status: "completed",
|
||||
deliverable_url: "example.com/deliverables"
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -37,23 +37,26 @@ RSpec.describe Api::AppearanceReleasesController, type: :controller do
|
||||
|
||||
it 'includes photos' do
|
||||
project = create(:project, account_id: current_user.primary_account.id)
|
||||
appearance_release = create(:appearance_release, person_first_name: 'Release', person_last_name: 'Name', project: project)
|
||||
appearance_release = create(:appearance_release,
|
||||
:with_person_photo, :with_guardian_photo, :with_guardian_2_photo,
|
||||
project: project)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: appearance_release.id }
|
||||
|
||||
photo = appearance_release.person_photo
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
[appearance_release.person_photo, appearance_release.guardian_photo, appearance_release.guardian_2_photo].each do |photo|
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -184,7 +187,46 @@ RSpec.describe Api::AppearanceReleasesController, type: :controller do
|
||||
expect(appearance_release.guardian_photo).to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor without second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(appearance_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
})
|
||||
|
||||
expect(response.status).to eq 201
|
||||
expect(AppearanceRelease.last.signature).to be_attached
|
||||
expect(AppearanceRelease.last.guardian_2_photo).not_to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor with second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(appearance_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
guardian_2_photo: {
|
||||
io: guardian_photo_base64,
|
||||
filename: 'guardian_2_photo.jpeg'
|
||||
}
|
||||
})
|
||||
expect(response.status).to eq 201
|
||||
|
||||
appearance_release = AppearanceRelease.last
|
||||
photo = appearance_release.guardian_2_photo
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
expect(appearance_release.signature).to be_attached
|
||||
expect(appearance_release.guardian_2_photo).to be_attached
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -32,26 +32,28 @@ RSpec.describe Api::TalentReleasesController, type: :controller do
|
||||
end
|
||||
|
||||
it 'includes photos' do
|
||||
tested_release = create("talent_release_with_photo", person_name: 'Release 1', project: project)
|
||||
project = create(:project, account_id: current_user.primary_account.id)
|
||||
talent_release = create(:talent_release,
|
||||
:with_guardian_photo, :with_guardian_2_photo,
|
||||
project: project)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: tested_release.id }
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: talent_release.id }
|
||||
|
||||
tested_release.photos.each do |photo|
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
end
|
||||
end
|
||||
[talent_release.photos, talent_release.guardian_photo, talent_release.guardian_2_photo].flatten.each do |photo|
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
@@ -180,6 +182,47 @@ RSpec.describe Api::TalentReleasesController, type: :controller do
|
||||
expect(talent_release.signature).to be_attached
|
||||
expect(talent_release.guardian_photo).to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor without second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(talent_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
})
|
||||
|
||||
expect(response.status).to eq 201
|
||||
expect(TalentRelease.last.signature).to be_attached
|
||||
expect(TalentRelease.last.guardian_2_photo).not_to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor with second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(talent_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
guardian_2_photo: {
|
||||
io: guardian_photo_base64,
|
||||
filename: 'guardian_2_photo.jpeg'
|
||||
}
|
||||
})
|
||||
expect(response.status).to eq 201
|
||||
|
||||
talent_release = TalentRelease.last
|
||||
photo = talent_release.guardian_2_photo
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
expect(talent_release.signature).to be_attached
|
||||
expect(talent_release.guardian_2_photo).to be_attached
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -7,6 +7,7 @@ RSpec.describe StreamNotificationsController, type: :controller do
|
||||
let(:active_status) { {type: "video.live_stream.active", object: { id: "mux_stream" }} }
|
||||
let(:disconnected_status) { {type: "video.live_stream.disconnected", object: { id: "mux_stream" }} }
|
||||
let(:idle_status) { {type: "video.live_stream.idle", object: { id: "mux_stream" }} }
|
||||
let(:idle_status_for_unknown_broadcast) { {type: "video.live_stream.idle", object: { id: "unknown-id" }} }
|
||||
let(:asset_ready) { {
|
||||
type: "video.asset.static_renditions.ready",
|
||||
object: { id: "asset_uid" },
|
||||
@@ -59,6 +60,12 @@ RSpec.describe StreamNotificationsController, type: :controller do
|
||||
|
||||
expect(BroadcastsChannel).to have_received(:stream_recording_ready)
|
||||
end
|
||||
|
||||
it "returns OK response even for non-existing broadcast" do
|
||||
post :create, params: idle_status_for_unknown_broadcast
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
|
||||
129
spec/controllers/task_requests_controller_spec.rb
Normal file
129
spec/controllers/task_requests_controller_spec.rb
Normal file
@@ -0,0 +1,129 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe TaskRequestsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { create(:user) }
|
||||
let(:account) { user.primary_account }
|
||||
let(:project) { create(:project, account: user.primary_account) }
|
||||
|
||||
before do
|
||||
sign_in user
|
||||
end
|
||||
|
||||
describe "#index" do
|
||||
it "responds successfully" do
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it "renders content" do
|
||||
create(:task_request, project: project, description: "Another Request")
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_link "Create Task Request"
|
||||
expect(response.body).to have_content "Pending"
|
||||
end
|
||||
|
||||
context "when there are many records" do
|
||||
it "paginates the table" do
|
||||
create_list(:task_request, 20, project: project)
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_link("2", href: project_task_requests_path(project, page: 2))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#new" do
|
||||
it "responds successfully" do
|
||||
get :new, params: { project_id: project }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(assigns(:task_request)).to be_a_new(TaskRequest)
|
||||
expect(response).to render_template(:new)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#create" do
|
||||
it "does create a new record" do
|
||||
expect {
|
||||
post :create, params: { project_id: project.id, task_request: task_request_params }
|
||||
}.to change(TaskRequest, :count)
|
||||
end
|
||||
|
||||
it "logs an event" do
|
||||
expect {
|
||||
post :create, params: { project_id: project.id, task_request: task_request_params }
|
||||
}.to have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_task_request, user_agent: "Rails Testing", user_ip: "0.0.0.0")
|
||||
end
|
||||
|
||||
it "submits data to hubspot form" do
|
||||
expect {
|
||||
post :create, params: { project_id: project.id, task_request: task_request_params }
|
||||
}.to have_enqueued_job(SubmitHubspotTaskRequestFormJob)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#update" do
|
||||
let!(:task_request) { create(:task_request, project: project, description: "My description" ) }
|
||||
|
||||
it "updates task request" do
|
||||
patch :update, params: { project_id: project.id, id: task_request.id, task_request: update_params }
|
||||
|
||||
expect(task_request.reload.description).to eq("This is updated description")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#show" do
|
||||
let!(:task_request) { create(:task_request, project: project, description: "Task Request") }
|
||||
|
||||
it "responds successfully" do
|
||||
get :show, params: { project_id: project.id, id: task_request.id }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(assigns(:task_request)).to eq(task_request)
|
||||
end
|
||||
|
||||
it "renders content" do
|
||||
get :show, params: { project_id: project.id, id: task_request.id }
|
||||
|
||||
expect(response.body).to have_content "Task Request"
|
||||
expect(response.body).to have_content "pending"
|
||||
end
|
||||
end
|
||||
|
||||
describe "#cancel" do
|
||||
let!(:task_request) { create(:task_request, project: project, description: "Task to be cancelled") }
|
||||
|
||||
it "responds with redirect" do
|
||||
post :cancel, params: { project_id: project.id, id: task_request.id }
|
||||
|
||||
expect(response).to be_redirect
|
||||
expect(response).to redirect_to(project_task_requests_path(project))
|
||||
expect(flash.notice).not_to be_nil
|
||||
end
|
||||
|
||||
it "updates the status to 'cancelled'" do
|
||||
expect {
|
||||
post :cancel, params: { project_id: project.id, id: task_request.id }
|
||||
}.to change { task_request.reload.status }.from("pending").to("cancelled")
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def task_request_params
|
||||
attributes = attributes_for(:task_request).except(:status, :user_email)
|
||||
files = 2.times.map { Rack::Test::UploadedFile.new(file_fixture("location_photo.png"), "image/png") }
|
||||
|
||||
attributes.merge({ files: files })
|
||||
end
|
||||
|
||||
def update_params
|
||||
{ description: "This is updated description" }
|
||||
end
|
||||
end
|
||||
40
spec/controllers/tasks_controller_spec.rb
Normal file
40
spec/controllers/tasks_controller_spec.rb
Normal file
@@ -0,0 +1,40 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe TasksController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { create(:user) }
|
||||
let(:account) { user.primary_account }
|
||||
let(:project) { create(:project, account: user.primary_account) }
|
||||
|
||||
before do
|
||||
sign_in user
|
||||
end
|
||||
|
||||
describe "#index" do
|
||||
it "responds successfully" do
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it "renders content" do
|
||||
create(:task_request, :completed, project: project, description: "Another Request")
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_content "Completed"
|
||||
expect(response.body).to have_link "View Deliverable"
|
||||
end
|
||||
|
||||
context "when there are many records" do
|
||||
it "paginates the table" do
|
||||
create_list(:task_request, 20, :completed, project: project)
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_link("2", href: project_tasks_path(project, page: 2))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -58,10 +58,7 @@ FactoryBot.define do
|
||||
guardian_address_state "State"
|
||||
guardian_address_zip "ZIP"
|
||||
guardian_address_country "Country"
|
||||
guardian_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
with_guardian_photo
|
||||
end
|
||||
|
||||
trait :without_person_photo do
|
||||
@@ -74,6 +71,20 @@ FactoryBot.define do
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_guardian_photo do
|
||||
guardian_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_guardian_2_photo do
|
||||
guardian_2_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_person_photo_only do
|
||||
end
|
||||
|
||||
|
||||
@@ -35,12 +35,23 @@ FactoryBot.define do
|
||||
guardian_first_name "Jamie"
|
||||
guardian_last_name "Doe"
|
||||
guardian_phone "123-555-1234"
|
||||
with_guardian_photo
|
||||
end
|
||||
|
||||
trait :with_guardian_photo do
|
||||
guardian_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_guardian_2_photo do
|
||||
guardian_2_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
factory :talent_release_with_contract_template do
|
||||
after(:build) do |talent_release, _|
|
||||
talent_release.contract_template = build(:talent_release_contract_template)
|
||||
|
||||
20
spec/factories/task_requests.rb
Normal file
20
spec/factories/task_requests.rb
Normal file
@@ -0,0 +1,20 @@
|
||||
FactoryBot.define do
|
||||
factory :task_request do
|
||||
association :project
|
||||
user_email 'test@email.com'
|
||||
deadline { 10.days.from_now }
|
||||
time_allowed 5
|
||||
description "Task request"
|
||||
additional_notes "Additional notes"
|
||||
status 0
|
||||
|
||||
trait :completed do
|
||||
deliverable_url "example.com/deliverables"
|
||||
status 1
|
||||
end
|
||||
|
||||
trait :with_files do
|
||||
files { [Rack::Test::UploadedFile.new('spec/fixtures/files/contract.pdf', 'application/pdf')] }
|
||||
end
|
||||
end
|
||||
end
|
||||
108
spec/features/admin_managing_task_requests_spec.rb
Normal file
108
spec/features/admin_managing_task_requests_spec.rb
Normal file
@@ -0,0 +1,108 @@
|
||||
require "rails_helper"
|
||||
|
||||
feature "Admin managing task requests" do
|
||||
let(:current_user) { create(:user, admin: true, email: "user@test.com") }
|
||||
let(:project) { create(:project, account: current_user.primary_account, name: "Test Project") }
|
||||
|
||||
before do
|
||||
sign_in current_user
|
||||
end
|
||||
|
||||
scenario "admin should see View action for task request in Manage dropdown", js: true do
|
||||
create(:task_request)
|
||||
visit admin_task_requests_path
|
||||
|
||||
click_on 'Manage'
|
||||
expect(page).to have_content 'View'
|
||||
end
|
||||
|
||||
scenario "admin can open detail view of task request", js: true do
|
||||
task_request = create(:task_request, :with_files)
|
||||
visit admin_task_requests_path
|
||||
|
||||
click_on 'Manage'
|
||||
click_link 'View'
|
||||
switch_to_window(windows.last)
|
||||
|
||||
expect(page).to have_content 'Account Name'
|
||||
expect(page).to have_content task_request.project.account.name
|
||||
|
||||
expect(page).to have_content 'Project Name'
|
||||
expect(page).to have_content task_request.project.name
|
||||
|
||||
expect(page).to have_content 'Description'
|
||||
expect(page).to have_content task_request.description
|
||||
|
||||
expect(page).to have_content 'Created At'
|
||||
expect(page).to have_content task_request.created_at
|
||||
|
||||
expect(page).to have_content 'User Email'
|
||||
expect(page).to have_content task_request.user_email
|
||||
|
||||
expect(page).to have_content 'Deadline'
|
||||
expect(page).to have_content task_request.deadline
|
||||
|
||||
expect(page).to have_content 'Time Allowed'
|
||||
expect(page).to have_content task_request.time_allowed
|
||||
|
||||
expect(page).to have_content 'Additional Notes'
|
||||
expect(page).to have_content task_request.additional_notes
|
||||
|
||||
expect(page).to have_content 'Status'
|
||||
expect(page).to have_content task_request.status
|
||||
|
||||
expect(page).to have_content 'Files'
|
||||
task_request.files.each do |file|
|
||||
expect(page).to have_content file.blob.filename
|
||||
end
|
||||
end
|
||||
|
||||
scenario "no files attached label is shown if there are no files attached to the task request", js:true do
|
||||
create(:task_request)
|
||||
visit admin_task_requests_path
|
||||
|
||||
click_on 'Manage'
|
||||
click_link 'View'
|
||||
switch_to_window(windows.last)
|
||||
|
||||
expect(page).to have_content 'Attached files will appear here.'
|
||||
end
|
||||
|
||||
scenario "task requests table is visible" do
|
||||
visit admin_task_requests_path
|
||||
|
||||
expect(page).to have_content "Task ID"
|
||||
expect(page).to have_content "Account Name"
|
||||
expect(page).to have_content "Project Name"
|
||||
expect(page).to have_content "Created On"
|
||||
expect(page).to have_content "Deadline"
|
||||
expect(page).to have_content "Time Allowed"
|
||||
expect(page).to have_content "Status"
|
||||
end
|
||||
|
||||
scenario "sees list of task requests" do
|
||||
visit admin_task_requests_path
|
||||
|
||||
expect(page).to have_content no_task_requests_label
|
||||
|
||||
task_request = create(:task_request)
|
||||
|
||||
visit admin_task_requests_path
|
||||
|
||||
expect(page).not_to have_content no_task_requests_label
|
||||
|
||||
expect(page).to have_content task_request.id
|
||||
expect(page).to have_content task_request.project.account.name
|
||||
expect(page).to have_content task_request.project.name
|
||||
expect(page).to have_content task_request.created_at.try(:strftime, '%D')
|
||||
expect(page).to have_content task_request.deadline.try(:strftime, '%D')
|
||||
expect(page).to have_content task_request.time_allowed
|
||||
expect(page).to have_content task_request.status.capitalize
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def no_task_requests_label
|
||||
"Task requests will appear here"
|
||||
end
|
||||
end
|
||||
92
spec/features/user_creates_task_request_spec.rb
Normal file
92
spec/features/user_creates_task_request_spec.rb
Normal file
@@ -0,0 +1,92 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.feature 'User creates task request', type: :feature do
|
||||
let(:current_user) { create(:user, :manager) }
|
||||
let(:project) { create(:project, members: current_user, account: current_user.primary_account) }
|
||||
|
||||
before do
|
||||
sign_in(current_user)
|
||||
end
|
||||
|
||||
scenario 'creating a new task request' do
|
||||
visit new_project_task_request_path(project)
|
||||
|
||||
fill_in description_field, with: 'Description of the task'
|
||||
fill_in deadline_field, with: '2020-06-24'
|
||||
fill_in time_allowed_field, with: '30'
|
||||
fill_in additional_notes_field, with: 'Additional note about the task'
|
||||
|
||||
click_on 'Create Task request'
|
||||
|
||||
expect(page).to have_content task_created_message
|
||||
end
|
||||
|
||||
scenario 'user can view task request details' do
|
||||
create(:task_request, project: project, description: 'Description of the task', deadline: '2020-07-23', time_allowed: '10', additional_notes: 'Additional note about the task')
|
||||
|
||||
visit project_task_request_path(project, TaskRequest.first)
|
||||
|
||||
expect(page).to have_content('Description of the task')
|
||||
expect(page).to have_content('2020-07-23')
|
||||
expect(page).to have_content('10')
|
||||
expect(page).to have_content('Additional note about the task')
|
||||
end
|
||||
|
||||
scenario 'user can update existing task request' do
|
||||
create(:task_request, project: project, description: 'Description of the task', deadline: '2020-08-23', time_allowed: '10', additional_notes: 'Additional note about the task')
|
||||
|
||||
visit edit_project_task_request_path(project, TaskRequest.first)
|
||||
|
||||
fill_in deadline_field, with: '2020-07-01'
|
||||
fill_in time_allowed_field, with: '13'
|
||||
|
||||
click_on 'Update Task request'
|
||||
expect(page).to have_content('13')
|
||||
expect(page).to have_content('07/01/20')
|
||||
end
|
||||
|
||||
scenario 'user can cancel a task request' do
|
||||
create(:task_request, project: project, description: 'Description of the task', deadline: '2020-08-23', time_allowed: '10', additional_notes: 'Additional note about the task')
|
||||
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
click_on 'Manage'
|
||||
click_link 'Cancel'
|
||||
|
||||
expect(page).to have_content('Cancelled')
|
||||
end
|
||||
|
||||
scenario 'user can view completed tasks' do
|
||||
create_list(:task_request, 5, project: project, status: 'completed')
|
||||
create_list(:task_request, 5, project: project, status: 'pending')
|
||||
|
||||
visit project_tasks_path(project)
|
||||
|
||||
expect(page).to have_content('Completed')
|
||||
expect(page).not_to have_content('Pending')
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def description_field
|
||||
t "task_requests.form.labels.description"
|
||||
end
|
||||
|
||||
def deadline_field
|
||||
t "task_requests.form.labels.deadline"
|
||||
end
|
||||
|
||||
def time_allowed_field
|
||||
t "task_requests.form.labels.time_allowed"
|
||||
end
|
||||
|
||||
def additional_notes_field
|
||||
t "task_requests.form.labels.additional_notes"
|
||||
end
|
||||
|
||||
def task_created_message
|
||||
t 'task_requests.create.success_message'
|
||||
end
|
||||
end
|
||||
116
spec/features/user_managing_task_requests_spec.rb
Normal file
116
spec/features/user_managing_task_requests_spec.rb
Normal file
@@ -0,0 +1,116 @@
|
||||
require "rails_helper"
|
||||
|
||||
feature "User managing task requests" do
|
||||
let(:current_user) { create(:user) }
|
||||
let(:project) { create(:project, account: current_user.primary_account) }
|
||||
|
||||
before :each do
|
||||
sign_in current_user
|
||||
end
|
||||
|
||||
scenario "task requests table is visible" do
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
expect(page).to have_content "Created On"
|
||||
expect(page).to have_content "Deadline"
|
||||
expect(page).to have_content description_column
|
||||
expect(page).to have_content "Time Allowed"
|
||||
expect(page).to have_content "Status"
|
||||
end
|
||||
|
||||
scenario "sees list of task requests" do
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
expect(page).to have_content no_task_requests_label
|
||||
|
||||
task_request = create(:task_request, project: project)
|
||||
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
expect(page).not_to have_content no_task_requests_label
|
||||
|
||||
expect(page).to have_content task_request.created_at.try(:strftime, '%D')
|
||||
expect(page).to have_content task_request.deadline.try(:strftime, '%D')
|
||||
expect(page).to have_content task_request.time_allowed
|
||||
expect(page).to have_content task_request.status.capitalize
|
||||
end
|
||||
|
||||
scenario "full description is shown if description text is not truncated" do
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
task_request = create(:task_request, project: project, description: 'Short Desc')
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
expect(page).to have_content task_request.description
|
||||
end
|
||||
|
||||
scenario "truncated description is shown if description text is too long" do
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
task_request = create(:task_request,
|
||||
project: project,
|
||||
description: long_description_text)
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
expect(page).not_to have_content task_request.description
|
||||
truncated_text = "#{task_request.description[0..26]}...read more"
|
||||
expect(page).to have_content truncated_text
|
||||
end
|
||||
|
||||
scenario "full description is shown when user hovers over read more link in description colum", js: true do
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
task_request = create(:task_request,
|
||||
project: project,
|
||||
description: long_description_text)
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
page.execute_script '$("a[data-toggle=popover]").trigger("mouseover")'
|
||||
expect(page).to have_content task_request.description
|
||||
end
|
||||
|
||||
scenario "user does not see open deliverable action in manage dropdown if task status is not completed" do
|
||||
task_request = create(:task_request, project: project)
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
click_on manage_button
|
||||
expect(page).not_to have_content open_deliverable_action_label
|
||||
end
|
||||
|
||||
scenario "user can click deliverable action in manage dropdown if task status is completed", js: true do
|
||||
create(:task_request, project: project, status: "completed", deliverable_url: "/")
|
||||
visit project_task_requests_path(project)
|
||||
|
||||
click_on manage_button
|
||||
expect(page).to have_content open_deliverable_action_label
|
||||
click_link open_deliverable_action_label
|
||||
switch_to_window(windows.last)
|
||||
expect(page).to have_content add_new_project_label
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def no_task_requests_label
|
||||
"Task requests will appear here"
|
||||
end
|
||||
|
||||
def manage_button
|
||||
t "task_requests.task_request.actions.manage"
|
||||
end
|
||||
|
||||
def open_deliverable_action_label
|
||||
t "task_requests.task_request.actions.open_deliverable"
|
||||
end
|
||||
|
||||
def add_new_project_label
|
||||
t "projects.index.actions.new"
|
||||
end
|
||||
|
||||
def description_column
|
||||
t 'task_requests.index.table_headers.task_request_description'
|
||||
end
|
||||
|
||||
def long_description_text
|
||||
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
|
||||
end
|
||||
end
|
||||
@@ -11,10 +11,12 @@ RSpec.describe SubmitHubspotFormJob, type: :job do
|
||||
allow(Hubspot::Form).to receive(:new).and_return(form)
|
||||
allow(form).to receive(:submit).and_return(true)
|
||||
|
||||
SubmitHubspotFormJob.perform_now("email@test.com", "My Account")
|
||||
SubmitHubspotFormJob.perform_now("John", "Doe", "email@test.com", "My Account")
|
||||
|
||||
expect(Hubspot::Form).to have_received(:new).with("guid" => "hubspot_form_guid")
|
||||
expect(form).to have_received(:submit).with(
|
||||
first_name: "John",
|
||||
last_name: "Doe",
|
||||
email: "email@test.com",
|
||||
company: "My Account"
|
||||
)
|
||||
@@ -25,9 +27,11 @@ RSpec.describe SubmitHubspotFormJob, type: :job do
|
||||
allow(Hubspot::Form).to receive(:new).and_return(form)
|
||||
allow(form).to receive(:submit).and_return(true)
|
||||
|
||||
SubmitHubspotFormJob.perform_now("email@test.com", "My Account", additional_param_one: "Foo", additional_param_two: "Bar")
|
||||
SubmitHubspotFormJob.perform_now("John", "Doe", "email@test.com", "My Account", additional_param_one: "Foo", additional_param_two: "Bar")
|
||||
|
||||
expect(form).to have_received(:submit).with(
|
||||
first_name: "John",
|
||||
last_name: "Doe",
|
||||
email: "email@test.com",
|
||||
company: "My Account",
|
||||
additional_param_one: "Foo",
|
||||
@@ -42,7 +46,7 @@ RSpec.describe SubmitHubspotFormJob, type: :job do
|
||||
allow(Hubspot::Form).to receive(:new).and_return(form)
|
||||
allow(form).to receive(:submit)
|
||||
|
||||
SubmitHubspotFormJob.perform_now("email@test.com", "My Account")
|
||||
SubmitHubspotFormJob.perform_now("John", "Doe", "email@test.com", "My Account")
|
||||
|
||||
expect(form).not_to have_received(:submit)
|
||||
end
|
||||
|
||||
36
spec/jobs/submit_hubspot_task_request_form_job_spec.rb
Normal file
36
spec/jobs/submit_hubspot_task_request_form_job_spec.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe SubmitHubspotTaskRequestFormJob, type: :job do
|
||||
describe '#perform_now' do
|
||||
before do
|
||||
ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"] = "hubspot_task_request_form_guid"
|
||||
end
|
||||
|
||||
it 'submits to the Hubspot API with the right params' do
|
||||
form = double(:form)
|
||||
allow(Hubspot::Form).to receive(:new).and_return(form)
|
||||
allow(form).to receive(:submit).and_return(true)
|
||||
|
||||
SubmitHubspotTaskRequestFormJob.perform_now("email@test.com", "https://example.com/admin/task_requests/1")
|
||||
|
||||
expect(Hubspot::Form).to have_received(:new).with("guid" => "hubspot_task_request_form_guid")
|
||||
expect(form).to have_received(:submit).with(
|
||||
email: "email@test.com",
|
||||
taskme_url: "https://example.com/admin/task_requests/1"
|
||||
)
|
||||
end
|
||||
|
||||
context 'when HUBSPOT_TASK_REQUEST_FORM_GUID is not available' do
|
||||
it 'does not submit to the API' do
|
||||
ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"] = nil
|
||||
form = double(:form)
|
||||
allow(Hubspot::Form).to receive(:new).and_return(form)
|
||||
allow(form).to receive(:submit)
|
||||
|
||||
SubmitHubspotTaskRequestFormJob.perform_now("email@test.com", "https://example.com/admin/task_requests/1")
|
||||
|
||||
expect(form).not_to have_received(:submit)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -129,6 +129,7 @@ RSpec.describe Account do
|
||||
Download,
|
||||
User,
|
||||
Broadcast,
|
||||
TaskRequest,
|
||||
Account,
|
||||
ZoomMeeting,
|
||||
MedicalRelease,
|
||||
|
||||
20
spec/models/task_request_spec.rb
Normal file
20
spec/models/task_request_spec.rb
Normal file
@@ -0,0 +1,20 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe TaskRequest, type: :model do
|
||||
describe "associations" do
|
||||
it { is_expected.to belong_to(:project) }
|
||||
end
|
||||
|
||||
describe "enums" do
|
||||
it { is_expected.to define_enum_for(:status).with_values([:pending, :completed, :cancelled]) }
|
||||
end
|
||||
|
||||
describe "#order_by_recent" do
|
||||
subject { described_class }
|
||||
it { is_expected.to respond_to(:order_by_recent) }
|
||||
end
|
||||
|
||||
describe "#validations" do
|
||||
it { should validate_numericality_of(:time_allowed).only_integer.is_greater_than_or_equal_to(2) }
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user