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 }