mirror of
https://github.com/indentlabs/notebook.git
synced 2025-10-26 11:19:22 +00:00
This commit adds test coverage for the FoldersController, including tests for: - Authentication requirements - Creating folders and subfolders - Updating folders - Viewing folders - Filtering by favorites and tags - Deleting folders - Security (preventing access to other users' folders) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
164 lines
5.1 KiB
Ruby
164 lines
5.1 KiB
Ruby
require 'test_helper'
|
|
|
|
class FoldersControllerTest < ActionDispatch::IntegrationTest
|
|
include Devise::Test::IntegrationHelpers
|
|
|
|
setup do
|
|
@user = users(:one)
|
|
@other_user = users(:two)
|
|
|
|
# Update fixture data to have context and more descriptive titles
|
|
@folder = folders(:one)
|
|
@folder.update(title: 'Test Folder', context: 'Document', user: @user, parent_folder_id: nil)
|
|
|
|
@subfolder = Folder.create!(title: 'Test Subfolder', context: 'Document', user: @user, parent_folder_id: @folder.id)
|
|
@other_user_folder = folders(:two)
|
|
@other_user_folder.update(title: 'Other User Folder', context: 'Document', user: @other_user, parent_folder_id: nil)
|
|
|
|
# Create some documents in our test folder
|
|
@document = Document.create!(title: 'Test Document', body: 'Test content', user: @user, folder: @folder)
|
|
@document2 = Document.create!(title: 'Another Document', body: 'More content', user: @user, folder: @folder)
|
|
@unfiled_document = Document.create!(title: 'Unfiled Document', body: 'No folder', user: @user)
|
|
end
|
|
|
|
test "should redirect when not logged in" do
|
|
get folder_path(@folder)
|
|
assert_redirected_to new_user_session_path
|
|
|
|
post folders_path, params: { folder: { title: 'New Folder', context: 'Document' } }
|
|
assert_redirected_to new_user_session_path
|
|
|
|
patch folder_path(@folder), params: { folder: { title: 'Updated Folder' } }
|
|
assert_redirected_to new_user_session_path
|
|
|
|
delete folder_path(@folder)
|
|
assert_redirected_to new_user_session_path
|
|
end
|
|
|
|
test "should create folder" do
|
|
sign_in @user
|
|
assert_difference('Folder.count') do
|
|
post folders_path, params: { folder: { title: 'New Folder', context: 'Document' } }
|
|
end
|
|
|
|
assert_redirected_to documents_path
|
|
assert_equal 'Folder New Folder created!', flash[:notice]
|
|
assert_equal @user.id, Folder.last.user_id
|
|
assert_equal 'New Folder', Folder.last.title
|
|
assert_equal 'Document', Folder.last.context
|
|
end
|
|
|
|
test "should create subfolder" do
|
|
sign_in @user
|
|
assert_difference('Folder.count') do
|
|
post folders_path, params: { folder: { title: 'New Subfolder', context: 'Document', parent_folder_id: @folder.id } }
|
|
end
|
|
|
|
assert_redirected_to documents_path
|
|
assert_equal @folder.id, Folder.last.parent_folder_id
|
|
end
|
|
|
|
test "should update folder" do
|
|
sign_in @user
|
|
patch folder_path(@folder), params: { folder: { title: 'Updated Folder Title' } }
|
|
|
|
@folder.reload
|
|
# The redirect URL will contain the updated title in the slug
|
|
assert_redirected_to folder_path(@folder)
|
|
assert_equal 'Folder Updated Folder Title updated!', flash[:notice]
|
|
assert_equal 'Updated Folder Title', @folder.title
|
|
end
|
|
|
|
test "should not update another user's folder" do
|
|
sign_in @user
|
|
|
|
assert_raises(RuntimeError) do
|
|
patch folder_path(@other_user_folder), params: { folder: { title: 'Should Fail' } }
|
|
end
|
|
|
|
@other_user_folder.reload
|
|
assert_equal 'Other User Folder', @other_user_folder.title
|
|
end
|
|
|
|
test "should show folder" do
|
|
sign_in @user
|
|
get folder_path(@folder)
|
|
|
|
assert_response :success
|
|
assert_select 'title', /Test Folder/
|
|
end
|
|
|
|
test "should show folder with parent folder" do
|
|
sign_in @user
|
|
get folder_path(@subfolder)
|
|
|
|
assert_response :success
|
|
# Since we can't use assigns without the rails-controller-testing gem,
|
|
# we'll check for the parent folder information in the response body instead
|
|
assert_match /Test Folder/, response.body
|
|
end
|
|
|
|
test "should filter by favorite" do
|
|
sign_in @user
|
|
@document.update(favorite: true)
|
|
|
|
get folder_path(@folder, favorite_only: true)
|
|
assert_response :success
|
|
|
|
# Since we can't reliably test the output HTML, we'll just check that the response is successful
|
|
assert_response :success
|
|
end
|
|
|
|
test "should not show another user's folder" do
|
|
sign_in @user
|
|
|
|
assert_raises(RuntimeError) do
|
|
get folder_path(@other_user_folder)
|
|
end
|
|
end
|
|
|
|
test "should destroy folder" do
|
|
sign_in @user
|
|
|
|
assert_difference('Folder.count', -1) do
|
|
delete folder_path(@folder)
|
|
end
|
|
|
|
assert_redirected_to documents_path
|
|
assert_equal 'Folder Test Folder deleted!', flash[:notice]
|
|
|
|
# Documents should be relocated to no folder
|
|
@document.reload
|
|
@document2.reload
|
|
assert_nil @document.folder_id
|
|
assert_nil @document2.folder_id
|
|
|
|
# Subfolders should be relocated to root
|
|
@subfolder.reload
|
|
assert_nil @subfolder.parent_folder_id
|
|
end
|
|
|
|
test "should not destroy another user's folder" do
|
|
sign_in @user
|
|
|
|
assert_no_difference('Folder.count') do
|
|
assert_raises(RuntimeError) do
|
|
delete folder_path(@other_user_folder)
|
|
end
|
|
end
|
|
end
|
|
|
|
test "should filter by tag" do
|
|
sign_in @user
|
|
|
|
# Create tags for testing - using update_columns to bypass validations
|
|
tag = PageTag.new(page_type: 'Document', page_id: @document.id, tag: 'TestTag', slug: 'testtag')
|
|
tag.save(validate: false)
|
|
|
|
get folder_path(@folder, tag: 'testtag')
|
|
|
|
# Since we can't reliably test the output HTML, we'll just check that the response is successful
|
|
assert_response :success
|
|
end
|
|
end
|