package server import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "path/filepath" "testing" "task/internal/sqlite" ) func TestAPIAuthAndTickets(t *testing.T) { db, err := sqlite.Open(filepath.Join(t.TempDir(), "t.db"), []byte("secret")) if err != nil { t.Fatal(err) } defer db.Close() if _, err := db.CreateUser("admin", "pass", true); err != nil { t.Fatal(err) } srv := New(db) handler := srv.Handler() loginBody, _ := json.Marshal(map[string]string{"username": "admin", "password": "pass"}) req := httptest.NewRequest(http.MethodPost, "/api/v1/auth/login", bytes.NewReader(loginBody)) req.Header.Set("Content-Type", "application/json") rec := httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("login %d %s", rec.Code, rec.Body.String()) } cookie := rec.Result().Cookies() if len(cookie) == 0 { t.Fatal("no session cookie") } createBody, _ := json.Marshal(map[string]string{"name": "Demo"}) req = httptest.NewRequest(http.MethodPost, "/api/v1/projects", bytes.NewReader(createBody)) req.Header.Set("Content-Type", "application/json") req.AddCookie(cookie[0]) rec = httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusCreated { t.Fatalf("create project %d %s", rec.Code, rec.Body.String()) } var proj map[string]any _ = json.Unmarshal(rec.Body.Bytes(), &proj) pid, _ := proj["id"].(string) if pid == "" { t.Fatal("expected auto project id") } ticketBody, _ := json.Marshal(map[string]string{"title": "First", "description": "hi"}) req = httptest.NewRequest(http.MethodPost, "/api/v1/projects/"+pid+"/tickets", bytes.NewReader(ticketBody)) req.Header.Set("Content-Type", "application/json") req.AddCookie(cookie[0]) rec = httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusCreated { t.Fatalf("create ticket %d %s", rec.Code, rec.Body.String()) } var ticket map[string]any _ = json.Unmarshal(rec.Body.Bytes(), &ticket) tid, _ := ticket["id"].(string) if tid == "" { t.Fatal("no ticket id") } req = httptest.NewRequest(http.MethodGet, "/api/v1/projects/"+pid+"/tickets/"+tid+"/revisions", nil) req.AddCookie(cookie[0]) rec = httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("revisions %d", rec.Code) } var revs []any _ = json.Unmarshal(rec.Body.Bytes(), &revs) if len(revs) < 1 { t.Fatal("expected revision") } req = httptest.NewRequest(http.MethodGet, "/api/v1/health", nil) rec = httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("health %d", rec.Code) } }