hako/internal/server/handlers/archives_test.go

159 lines
5.9 KiB
Go

package handlers
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
archivalDomain "git.nakama.town/fmartingr/hako/internal/archival/domain"
authDomain "git.nakama.town/fmartingr/hako/internal/auth/domain"
"git.nakama.town/fmartingr/hako/internal/model"
"git.nakama.town/fmartingr/hako/internal/server/middleware"
"git.nakama.town/fmartingr/hako/internal/testutil"
"github.com/stretchr/testify/require"
)
func TestArchiveHandler_GetArchiveHistory(t *testing.T) {
ctx := context.Background()
deps := testutil.GetTestConfigurationAndDependencies(t, ctx)
// Initialize domains
deps.Dependencies.Domains().SetLinks(archivalDomain.NewLinkDomain(deps.Dependencies))
deps.Dependencies.Domains().SetArchives(archivalDomain.NewArchiveDomain(deps.Dependencies))
deps.Dependencies.Domains().SetCategories(archivalDomain.NewCategoryDomain(deps.Dependencies))
deps.Dependencies.Domains().SetAuth(authDomain.NewAuthDomain(deps.Dependencies))
// Create a test user
user, token, err := testutil.NewTestUser(t, deps.Dependencies, "test@example.com", "testpassword123")
require.NoError(t, err)
// Create a link
link, err := deps.Dependencies.Domains().Links().CreateLink(ctx, "https://example.com/history", user.ID.String())
require.NoError(t, err)
// Create archive handler
archiveHandler := NewArchiveHandler(deps.Dependencies)
// Create handler with auth middleware
globalAuthMiddleware := middleware.AuthMiddleware(deps.Dependencies.GetJWTService(), deps.Dependencies.UserStore)
requireAuthMiddleware := middleware.RequireAuthMiddleware()
mux := http.NewServeMux()
mux.HandleFunc("GET /links/{linkId}/archives", archiveHandler.HandleGetArchiveHistory)
handler := globalAuthMiddleware(requireAuthMiddleware(mux))
// Test request
req := httptest.NewRequest(http.MethodGet, "/links/"+link.ID+"/archives", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.SetPathValue("linkId", link.ID)
w := httptest.NewRecorder()
handler.ServeHTTP(w, req)
// Assert response
resp := testutil.NewTestResponse(w)
resp.AssertStatus(t, http.StatusOK)
// Check response structure
var archives []ArchiveResponse
err = json.Unmarshal(resp.GetBody(), &archives)
require.NoError(t, err)
require.NotEmpty(t, archives)
}
func TestArchiveHandler_ReArchiveLink(t *testing.T) {
ctx := context.Background()
deps := testutil.GetTestConfigurationAndDependencies(t, ctx)
// Initialize domains
deps.Dependencies.Domains().SetLinks(archivalDomain.NewLinkDomain(deps.Dependencies))
deps.Dependencies.Domains().SetArchives(archivalDomain.NewArchiveDomain(deps.Dependencies))
deps.Dependencies.Domains().SetCategories(archivalDomain.NewCategoryDomain(deps.Dependencies))
deps.Dependencies.Domains().SetAuth(authDomain.NewAuthDomain(deps.Dependencies))
// Create a test user
user, token, err := testutil.NewTestUser(t, deps.Dependencies, "test@example.com", "testpassword123")
require.NoError(t, err)
// Create a link
link, err := deps.Dependencies.Domains().Links().CreateLink(ctx, "https://example.com/rearchive", user.ID.String())
require.NoError(t, err)
// Create archive handler
archiveHandler := NewArchiveHandler(deps.Dependencies)
// Create handler with auth middleware
globalAuthMiddleware := middleware.AuthMiddleware(deps.Dependencies.GetJWTService(), deps.Dependencies.UserStore)
requireAuthMiddleware := middleware.RequireAuthMiddleware()
mux := http.NewServeMux()
mux.HandleFunc("POST /links/{linkId}/archives", archiveHandler.HandleReArchiveLink)
handler := globalAuthMiddleware(requireAuthMiddleware(mux))
// Test request
req := httptest.NewRequest(http.MethodPost, "/links/"+link.ID+"/archives", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.SetPathValue("linkId", link.ID)
w := httptest.NewRecorder()
handler.ServeHTTP(w, req)
// Assert response
resp := testutil.NewTestResponse(w)
resp.AssertStatus(t, http.StatusAccepted)
}
func TestArchiveHandler_GetArchiveFiles(t *testing.T) {
ctx := context.Background()
deps := testutil.GetTestConfigurationAndDependencies(t, ctx)
// Initialize domains
deps.Dependencies.Domains().SetLinks(archivalDomain.NewLinkDomain(deps.Dependencies))
deps.Dependencies.Domains().SetArchives(archivalDomain.NewArchiveDomain(deps.Dependencies))
deps.Dependencies.Domains().SetCategories(archivalDomain.NewCategoryDomain(deps.Dependencies))
deps.Dependencies.Domains().SetAuth(authDomain.NewAuthDomain(deps.Dependencies))
// Create a test user
user, token, err := testutil.NewTestUser(t, deps.Dependencies, "test@example.com", "testpassword123")
require.NoError(t, err)
// Create a link (which creates an archive)
link, err := deps.Dependencies.Domains().Links().CreateLink(ctx, "https://example.com/files", user.ID.String())
require.NoError(t, err)
// Get archives for the link
archives, err := deps.Dependencies.Domains().Archives().GetArchiveHistory(ctx, link.ID)
require.NoError(t, err)
require.NotEmpty(t, archives)
// Create archive handler
archiveHandler := NewArchiveHandler(deps.Dependencies)
// Create handler with auth middleware
globalAuthMiddleware := middleware.AuthMiddleware(deps.Dependencies.GetJWTService(), deps.Dependencies.UserStore)
requireAuthMiddleware := middleware.RequireAuthMiddleware()
mux := http.NewServeMux()
mux.HandleFunc("GET /archives/{archiveId}/files", archiveHandler.HandleGetArchiveFiles)
handler := globalAuthMiddleware(requireAuthMiddleware(mux))
// Test request
req := httptest.NewRequest(http.MethodGet, "/archives/"+archives[0].ID+"/files", nil)
req.Header.Set("Authorization", "Bearer "+token)
req.SetPathValue("archiveId", archives[0].ID)
w := httptest.NewRecorder()
handler.ServeHTTP(w, req)
// Assert response
resp := testutil.NewTestResponse(w)
resp.AssertStatus(t, http.StatusOK)
// Check response structure
var files []model.ArchiveFileResponse
err = json.Unmarshal(resp.GetBody(), &files)
require.NoError(t, err)
// Files may be empty if archive hasn't been processed yet
}