package test import ( "encoding/json" "errors" "fmt" "net/http" "testing" "github.com/gofiber/fiber/v2" "gorm.io/gorm" "gitlab.com/mbugroup/lti-api.git/internal/entities" ) func TestBankIntegration(t *testing.T) { app, db := setupIntegrationApp(t) const bankAlias = "BNI" const bankName = "Bank Negara Indonesia" const bankOwner = "John Doe" const bankAccountNumber = "1234567890" var bankID uint t.Run("creating bank succeeds", func(t *testing.T) { bankID = createBank(t, app, bankName, bankAlias, bankAccountNumber, bankOwner) bank := fetchBank(t, db, bankID) if bank.Alias != bankAlias { t.Fatalf("expected alias %q, got %q", bankAlias, bank.Alias) } if bank.AccountNumber != bankAccountNumber { t.Fatalf("expected account number %q, got %q", bankAccountNumber, bank.AccountNumber) } }) t.Run("creating bank with duplicate name fails", func(t *testing.T) { resp, body := doJSONRequest(t, app, http.MethodPost, "/api/master-data/banks", map[string]any{ "name": bankName, "alias": "NEWALIAS", "owner": "Owner Name", "account_number": "1122334455", }) if resp.StatusCode != fiber.StatusConflict { t.Fatalf("expected 409 when creating duplicate bank name, got %d: %s", resp.StatusCode, string(body)) } }) t.Run("getting existing bank succeeds", func(t *testing.T) { resp, body := doJSONRequest(t, app, http.MethodGet, fmt.Sprintf("/api/master-data/banks/%d", bankID), nil) if resp.StatusCode != fiber.StatusOK { t.Fatalf("expected 200 when fetching bank, got %d: %s", resp.StatusCode, string(body)) } var payload struct { Data struct { Id uint `json:"id"` Name string `json:"name"` Alias string `json:"alias"` AccountNumber string `json:"account_number"` } `json:"data"` } if err := json.Unmarshal(body, &payload); err != nil { t.Fatalf("failed to parse response: %v", err) } if payload.Data.Id != bankID { t.Fatalf("expected id %d, got %d", bankID, payload.Data.Id) } if payload.Data.Alias != bankAlias { t.Fatalf("expected alias %q, got %q", bankAlias, payload.Data.Alias) } if payload.Data.AccountNumber != bankAccountNumber { t.Fatalf("expected account number %q, got %q", bankAccountNumber, payload.Data.AccountNumber) } }) const updatedName = "BNI Updated" t.Run("updating bank name succeeds", func(t *testing.T) { resp, body := doJSONRequest(t, app, http.MethodPatch, fmt.Sprintf("/api/master-data/banks/%d", bankID), map[string]any{ "name": updatedName, }) if resp.StatusCode != fiber.StatusOK { t.Fatalf("expected 200 when updating bank, got %d: %s", resp.StatusCode, string(body)) } var payload struct { Data struct { Name string `json:"name"` } `json:"data"` } if err := json.Unmarshal(body, &payload); err != nil { t.Fatalf("failed to parse response: %v", err) } if payload.Data.Name != updatedName { t.Fatalf("expected updated name %q, got %q", updatedName, payload.Data.Name) } bank := fetchBank(t, db, bankID) if bank.Name != updatedName { t.Fatalf("expected persisted name %q, got %q", updatedName, bank.Name) } }) t.Run("updating non existent bank returns 404", func(t *testing.T) { resp, body := doJSONRequest(t, app, http.MethodPatch, "/api/master-data/banks/9999", map[string]any{ "name": "Does Not Matter", }) if resp.StatusCode != fiber.StatusNotFound { t.Fatalf("expected 404 when updating missing bank, got %d: %s", resp.StatusCode, string(body)) } }) t.Run("deleting bank succeeds", func(t *testing.T) { resp, body := doJSONRequest(t, app, http.MethodDelete, fmt.Sprintf("/api/master-data/banks/%d", bankID), nil) if resp.StatusCode != fiber.StatusOK { t.Fatalf("expected 200 when deleting bank, got %d: %s", resp.StatusCode, string(body)) } var bank entities.Bank if err := db.First(&bank, bankID).Error; !errors.Is(err, gorm.ErrRecordNotFound) { t.Fatalf("expected bank to be deleted, got error %v", err) } }) t.Run("deleting non existent bank returns 404", func(t *testing.T) { resp, body := doJSONRequest(t, app, http.MethodDelete, fmt.Sprintf("/api/master-data/banks/%d", bankID), nil) if resp.StatusCode != fiber.StatusNotFound { t.Fatalf("expected 404 when deleting missing bank, got %d: %s", resp.StatusCode, string(body)) } }) }