195 lines
6.3 KiB
Ruby
195 lines
6.3 KiB
Ruby
|
|
require 'rails_helper'
|
||
|
|
|
||
|
|
RSpec.describe DirectoriesController, type: :controller do
|
||
|
|
render_views
|
||
|
|
|
||
|
|
let(:user) { create(:user) }
|
||
|
|
let(:account) { user.primary_account }
|
||
|
|
let(:project) { create(:project, account: user.primary_account) }
|
||
|
|
let(:directory) { create(:directory, project: project) }
|
||
|
|
let(:directory_with_files) { create(:directory, :with_files, project: project) }
|
||
|
|
let(:directory_with_many_files) { create(:directory, :many_files, project: project) }
|
||
|
|
|
||
|
|
before do
|
||
|
|
sign_in user
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "#new" do
|
||
|
|
it "responds successfully" do
|
||
|
|
get :new, params: { project_id: project }
|
||
|
|
|
||
|
|
expect(response).to be_successful
|
||
|
|
expect(assigns(:directory)).to be_a_new(Directory)
|
||
|
|
expect(response).to render_template(:new)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "#create" do
|
||
|
|
it "responds with a redirect" do
|
||
|
|
post :create, params: { project_id: project.id, directory: directory_params }
|
||
|
|
|
||
|
|
expect(response).to be_redirect
|
||
|
|
expect(flash.notice).not_to be_nil
|
||
|
|
end
|
||
|
|
|
||
|
|
it "does create a new record" do
|
||
|
|
expect {
|
||
|
|
post :create, params: { project_id: project.id, directory: directory_params }
|
||
|
|
}.to change(Directory, :count)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "logs an event" do
|
||
|
|
expect {
|
||
|
|
post :create, params: { project_id: project.id, directory: directory_params }
|
||
|
|
}.to have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_custom_folder, user_agent: "Rails Testing", user_ip: "0.0.0.0")
|
||
|
|
end
|
||
|
|
|
||
|
|
context "with invalid data" do
|
||
|
|
it "does not create a new record" do
|
||
|
|
expect {
|
||
|
|
post :create, params: { project_id: project.id, directory: { name: "", category: "Other" } }
|
||
|
|
}.not_to change(Directory, :count)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "with permissions" do
|
||
|
|
it "assigns selected permission to directory" do
|
||
|
|
post :create, params: { project_id: project.id, directory: directory_params_with_permissions }
|
||
|
|
|
||
|
|
expect(Directory.last.permissions).to eq("Account Managers & Project Managers")
|
||
|
|
end
|
||
|
|
|
||
|
|
it "sets permissions to everyone when no permission is selected by user" do
|
||
|
|
post :create, params: { project_id: project.id, directory: directory_params }
|
||
|
|
|
||
|
|
expect(Directory.last.permissions).to eq("Everyone")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "#show" do
|
||
|
|
it "responds successfully" do
|
||
|
|
get :show, params: { project_id: project.id, id: directory_with_files.id }
|
||
|
|
|
||
|
|
expect(response).to be_successful
|
||
|
|
end
|
||
|
|
|
||
|
|
it "renders files" do
|
||
|
|
get :show, params: { project_id: project.id, id: directory_with_files.id }
|
||
|
|
|
||
|
|
expect(response.body).to have_content "location_photo.png"
|
||
|
|
expect(response.body).to have_link "Add File"
|
||
|
|
expect(response.body).to have_content "Manage"
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when there are no files" do
|
||
|
|
it "renders an empty message" do
|
||
|
|
get :show, params: { project_id: project.id, id: directory.id }
|
||
|
|
|
||
|
|
expect(response.body).to have_content("Uploaded files will appear here")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "when there are many files" do
|
||
|
|
it "paginates the table" do
|
||
|
|
get :show, params: { project_id: project.id, id: directory_with_many_files.id }
|
||
|
|
|
||
|
|
expect(response.body).to have_link("2", href: project_directory_path(project, directory_with_many_files.id, page: 2))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
context "for xhr request" do
|
||
|
|
it "filters the files by a query param" do
|
||
|
|
get :show, params: { project_id: project.id, id: directory_with_many_files.id, query: "loc" }, xhr: true
|
||
|
|
|
||
|
|
expect(response.body).to have_content("location_photo.png")
|
||
|
|
expect(response.body).not_to have_content("material_photo.png")
|
||
|
|
expect(response.body).not_to have_content("person_photo.png")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "#edit" do
|
||
|
|
it "sets directory" do
|
||
|
|
get :edit, params: { project_id: project.id, id: directory.id }
|
||
|
|
|
||
|
|
expect(response).to be_successful
|
||
|
|
expect(assigns(:directory)).to eq directory
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "#update" do
|
||
|
|
it "responds with redirect" do
|
||
|
|
patch :update, params: { project_id: project.id, id: directory.id, directory: directory_params }
|
||
|
|
|
||
|
|
expect(response).to be_redirect
|
||
|
|
expect(flash.notice).not_to be_nil
|
||
|
|
end
|
||
|
|
|
||
|
|
it "updates directory with files and redirects" do
|
||
|
|
patch :update, params: { project_id: project.id, id: directory.id, directory: directory_params_with_files }
|
||
|
|
|
||
|
|
expect(directory.files.count).to eq(2)
|
||
|
|
expect(directory.files.first.filename).to eq("location_photo.png")
|
||
|
|
expect(response).to be_redirect
|
||
|
|
expect(flash.notice).not_to be_nil
|
||
|
|
end
|
||
|
|
|
||
|
|
context "with permissions" do
|
||
|
|
let(:directory) { create(:directory, project: project) }
|
||
|
|
|
||
|
|
it "updates directory with permissions" do
|
||
|
|
expect {
|
||
|
|
patch :update, params: { project_id: project.id, id: directory.id, directory: directory_params_with_permissions }
|
||
|
|
directory.reload
|
||
|
|
}.to change(directory, :permissions).from("Everyone").to("Account Managers & Project Managers")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "#destroy_file" do
|
||
|
|
it "responds with redirect after deleting file" do
|
||
|
|
delete :destroy_file, params: { project_id: project.id, id: directory_with_files.id, file_id: directory_with_files.files.first.id }
|
||
|
|
|
||
|
|
expect(directory_with_files.files.count).to eq(0)
|
||
|
|
expect(response).to be_redirect
|
||
|
|
expect(response).to redirect_to(project_directory_path(project, directory_with_files))
|
||
|
|
expect(flash.alert).not_to be_nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "#destroy" do
|
||
|
|
let!(:directory_2) { create(:directory, project: project, name: "Stories") }
|
||
|
|
|
||
|
|
it "responds with redirect" do
|
||
|
|
delete :destroy, params: { project_id: project.id, id: directory.id }
|
||
|
|
|
||
|
|
expect(response).to be_redirect
|
||
|
|
expect(response).to redirect_to(project_path(project))
|
||
|
|
expect(flash.alert).not_to be_nil
|
||
|
|
end
|
||
|
|
|
||
|
|
it "destroys the record" do
|
||
|
|
expect {
|
||
|
|
delete :destroy, params: { project_id: project.id, id: directory_2.id }
|
||
|
|
}.to change(Directory, :count).by(-1)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
def directory_params
|
||
|
|
attributes_for(:directory)
|
||
|
|
end
|
||
|
|
|
||
|
|
def directory_params_with_files
|
||
|
|
files = 2.times.map { Rack::Test::UploadedFile.new(file_fixture("location_photo.png"), "image/png") }
|
||
|
|
|
||
|
|
directory_params.merge({ files: files })
|
||
|
|
end
|
||
|
|
|
||
|
|
def directory_params_with_permissions
|
||
|
|
directory_params.merge({ permissions: "Account Managers & Project Managers" })
|
||
|
|
end
|
||
|
|
end
|