mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 05:21:57 +00:00
127 lines
3.3 KiB
Go
127 lines
3.3 KiB
Go
package exportprogress
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/xuri/excelize/v2"
|
|
)
|
|
|
|
func TestParseQuery(t *testing.T) {
|
|
app := fiber.New()
|
|
app.Get("/", func(c *fiber.Ctx) error {
|
|
query, err := ParseQuery(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.JSON(fiber.Map{
|
|
"start": query.StartDateRaw,
|
|
"end": query.EndDateRaw,
|
|
})
|
|
})
|
|
|
|
resp, err := app.Test(httptest.NewRequest(http.MethodGet, "/?export=excel&type=progress&start_date=2026-06-01&end_date=2026-07-15", nil))
|
|
if err != nil {
|
|
t.Fatalf("request failed: %v", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
t.Fatalf("expected 200, got %d", resp.StatusCode)
|
|
}
|
|
|
|
var payload map[string]string
|
|
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
|
|
t.Fatalf("failed decoding payload: %v", err)
|
|
}
|
|
if payload["start"] != "2026-06-01" || payload["end"] != "2026-07-15" {
|
|
t.Fatalf("unexpected payload: %+v", payload)
|
|
}
|
|
}
|
|
|
|
func TestParseQueryInvalid(t *testing.T) {
|
|
app := fiber.New()
|
|
app.Get("/", func(c *fiber.Ctx) error {
|
|
_, err := ParseQuery(c)
|
|
return err
|
|
})
|
|
|
|
cases := []string{
|
|
"/?export=excel&type=progress",
|
|
"/?export=excel&type=progress&start_date=2026-06-01&end_date=bad",
|
|
"/?export=excel&type=progress&start_date=2026-07-01&end_date=2026-06-01",
|
|
}
|
|
for _, target := range cases {
|
|
resp, err := app.Test(httptest.NewRequest(http.MethodGet, target, nil))
|
|
if err != nil {
|
|
t.Fatalf("request failed for %s: %v", target, err)
|
|
}
|
|
resp.Body.Close()
|
|
if resp.StatusCode != http.StatusBadRequest {
|
|
t.Fatalf("expected 400 for %s, got %d", target, resp.StatusCode)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBuildWorkbook(t *testing.T) {
|
|
location, err := time.LoadLocation(jakartaTZ)
|
|
if err != nil {
|
|
t.Fatalf("failed loading location: %v", err)
|
|
}
|
|
|
|
query := &Query{
|
|
StartDate: time.Date(2026, 6, 1, 0, 0, 0, 0, location),
|
|
EndDate: time.Date(2026, 7, 31, 0, 0, 0, 0, location),
|
|
StartDateRaw: "2026-06-01",
|
|
EndDateRaw: "2026-07-31",
|
|
}
|
|
rows := []Row{
|
|
{Module: "Expenses", FarmName: "Farm A", KandangName: "Kandang 1", ActivityDate: time.Date(2026, 6, 1, 0, 0, 0, 0, location), Count: 3},
|
|
{Module: "Expenses", FarmName: "Farm A", KandangName: "Kandang 1", ActivityDate: time.Date(2026, 7, 15, 0, 0, 0, 0, location), Count: 2},
|
|
}
|
|
|
|
content, err := BuildWorkbook("Expenses", query, rows)
|
|
if err != nil {
|
|
t.Fatalf("BuildWorkbook failed: %v", err)
|
|
}
|
|
|
|
file, err := excelize.OpenReader(bytes.NewReader(content))
|
|
if err != nil {
|
|
t.Fatalf("failed opening workbook: %v", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
if got := file.GetSheetName(file.GetActiveSheetIndex()); got != "Expenses" {
|
|
t.Fatalf("unexpected sheet name: %s", got)
|
|
}
|
|
|
|
title, err := file.GetCellValue("Expenses", "A1")
|
|
if err != nil {
|
|
t.Fatalf("failed reading title: %v", err)
|
|
}
|
|
if title != "Expenses" {
|
|
t.Fatalf("unexpected title: %s", title)
|
|
}
|
|
|
|
monthTitle, err := file.GetCellValue("Expenses", "A4")
|
|
if err != nil {
|
|
t.Fatalf("failed reading first month title: %v", err)
|
|
}
|
|
if monthTitle != "June 2026" {
|
|
t.Fatalf("unexpected first month title: %s", monthTitle)
|
|
}
|
|
|
|
firstCount, err := file.GetCellValue("Expenses", "B9")
|
|
if err != nil {
|
|
t.Fatalf("failed reading representative count cell: %v", err)
|
|
}
|
|
if firstCount != "3" {
|
|
t.Fatalf("unexpected representative count: %s", firstCount)
|
|
}
|
|
}
|