gogcli/internal/cmd/sheets_range_resolve_test.go
2026-04-20 13:06:44 +01:00

147 lines
3.7 KiB
Go

package cmd
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"google.golang.org/api/option"
"google.golang.org/api/sheets/v4"
)
func TestResolveGridRangeWithCatalog_DoesNotMutateNamedRangeForceSendFields(t *testing.T) {
origFS := make([]string, 1, 2)
origFS[0] = "ExistingField"
nr := &sheets.NamedRange{
Name: "MyNamedRange",
Range: &sheets.GridRange{
SheetId: 0,
StartRowIndex: 1,
EndRowIndex: 2,
ForceSendFields: origFS,
},
}
catalog := &spreadsheetRangeCatalog{
NamedRanges: []*sheets.NamedRange{nr},
}
gr, err := resolveGridRangeWithCatalog("MyNamedRange", catalog, "format")
if err != nil {
t.Fatalf("resolveGridRangeWithCatalog: %v", err)
}
if gr == nil {
t.Fatalf("expected non-nil grid range")
return
}
// Returned range includes SheetId force-send.
if !containsStringValue(gr.ForceSendFields, "SheetId") {
t.Fatalf("expected SheetId in returned ForceSendFields: %#v", gr.ForceSendFields)
}
// Original named range remains untouched.
if len(nr.Range.ForceSendFields) != 1 || nr.Range.ForceSendFields[0] != "ExistingField" {
t.Fatalf("expected original ForceSendFields unchanged, got %#v", nr.Range.ForceSendFields)
}
}
func TestResolveGridRangeWithCatalog_DedupsSheetIDForceSendField(t *testing.T) {
nr := &sheets.NamedRange{
Name: "MyNamedRange",
Range: &sheets.GridRange{
SheetId: 7,
StartRowIndex: 1,
EndRowIndex: 2,
ForceSendFields: []string{"SheetId"},
},
}
catalog := &spreadsheetRangeCatalog{
NamedRanges: []*sheets.NamedRange{nr},
}
gr, err := resolveGridRangeWithCatalog("MyNamedRange", catalog, "format")
if err != nil {
t.Fatalf("resolveGridRangeWithCatalog: %v", err)
}
if gr == nil {
t.Fatalf("expected non-nil grid range")
return
}
if countStringValue(gr.ForceSendFields, "SheetId") != 1 {
t.Fatalf("expected SheetId once, got %#v", gr.ForceSendFields)
}
}
func TestFetchSpreadsheetRangeCatalog_PreservesSpacedSheetTitle(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]any{
"spreadsheetId": "s1",
"sheets": []map[string]any{
{"properties": map[string]any{"sheetId": 42, "title": " Sheet With Spaces "}},
},
})
}))
defer srv.Close()
svc, err := sheets.NewService(context.Background(),
option.WithoutAuthentication(),
option.WithHTTPClient(srv.Client()),
option.WithEndpoint(srv.URL+"/"),
)
if err != nil {
t.Fatalf("NewService: %v", err)
}
catalog, err := fetchSpreadsheetRangeCatalog(context.Background(), svc, "s1")
if err != nil {
t.Fatalf("fetchSpreadsheetRangeCatalog: %v", err)
}
if catalog == nil {
t.Fatalf("expected catalog")
return
}
title := " Sheet With Spaces "
if catalog.SheetIDsByTitle[title] != 42 {
t.Fatalf("expected exact title key %q mapped to 42, got map=%#v", title, catalog.SheetIDsByTitle)
}
if _, ok := catalog.SheetIDsByTitle["Sheet With Spaces"]; ok {
t.Fatalf("did not expect trimmed title key, map=%#v", catalog.SheetIDsByTitle)
}
// And ensure quoted A1 names with spaces still resolve against the map.
r, err := parseSheetRange("' Sheet With Spaces '!A1:B2", "format")
if err != nil {
t.Fatalf("parseSheetRange: %v", err)
}
gr, err := gridRangeFromMap(r, catalog.SheetIDsByTitle, "format")
if err != nil {
t.Fatalf("gridRangeFromMap: %v", err)
}
if gr.SheetId != 42 {
t.Fatalf("unexpected sheet id: %d", gr.SheetId)
}
}
func containsStringValue(in []string, want string) bool {
for _, s := range in {
if s == want {
return true
}
}
return false
}
func countStringValue(in []string, want string) int {
n := 0
for _, s := range in {
if s == want {
n++
}
}
return n
}