// Copyright 2026 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package services import ( "context" "encoding/json" "io" "net/http" "testing" gitea "gitea.dev/sdk" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestOrganizationLabelArchivingUsesRawRequests(t *testing.T) { var requests []string client := newTestClient(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, _ := io.ReadAll(r.Body) requests = append(requests, r.Method+" "+r.URL.Path+" "+string(body)) _, _ = w.Write([]byte(`{"id":5,"name":"bug","color":"ee0701","is_archived":true}`)) })) service := Labels{Client: client, Organization: "company"} name, color, archived, active := "bug", "ee0701", true, false label, err := service.Create(context.Background(), LabelOptions{Name: &name, Color: &color, Archived: &archived}) require.NoError(t, err) require.Equal(t, Label{ID: 5, Name: "bug", Color: "ee0701", Archived: true}, label) _, err = service.Create(context.Background(), LabelOptions{Name: &name, Color: &color, Archived: &active}) require.NoError(t, err) _, err = service.Edit(context.Background(), 5, LabelOptions{Archived: &active}) require.NoError(t, err) _, err = service.Edit(context.Background(), 5, LabelOptions{Name: &name}) require.NoError(t, err) require.Len(t, requests, 4) assert.Equal(t, `POST /api/v1/orgs/company/labels {"name":"bug","color":"ee0701","is_archived":true}`, requests[0]) assert.NotContains(t, requests[1], "is_archived") assert.Equal(t, `PATCH /api/v1/orgs/company/labels/5 {"is_archived":false}`, requests[2]) assert.NotContains(t, requests[3], "is_archived") assert.Contains(t, requests[3], `"name":"bug"`) } func TestRepositoryLabelEditSendsOnlySuppliedFields(t *testing.T) { client := newTestClient(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, "PATCH /api/v1/repos/alice/project/labels/5", r.Method+" "+r.URL.Path) var body gitea.EditLabelOption assert.NoError(t, json.NewDecoder(r.Body).Decode(&body)) archived := true assert.Equal(t, gitea.EditLabelOption{IsArchived: &archived}, body) _, _ = w.Write([]byte(`{"id":5,"name":"bug","is_archived":true}`)) })) archived := true label, err := (Labels{Client: client, Repository: "alice/project"}).Edit(context.Background(), 5, LabelOptions{Archived: &archived}) require.NoError(t, err) require.True(t, label.Archived) } func TestMilestoneFromMapsServerFields(t *testing.T) { deadline := "2028-01-15T23:59:59-08:00" require.Equal(t, Milestone{ID: 1, Title: "v1", Description: "First", State: "closed", Deadline: &deadline, OpenIssues: 2, ClosedIssues: 3}, milestoneFrom(decode[gitea.Milestone](t, `{"id":1,"title":"v1","description":"First","state":"closed","due_on":"2028-01-15T23:59:59-08:00","open_issues":2,"closed_issues":3}`))) } func TestMilestoneRejectsInvalidDeadlineBeforeRequests(t *testing.T) { client := newTestClient(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { t.Errorf("unexpected request %s %s", r.Method, r.URL.Path) })) service := Milestones{Client: client, Repository: "alice/project"} invalid := "tomorrow" _, err := service.Create(context.Background(), MilestoneOptions{Deadline: &invalid}) require.ErrorContains(t, err, "invalid milestone deadline") _, err = service.Edit(context.Background(), 1, MilestoneOptions{Deadline: &invalid}) require.ErrorContains(t, err, "invalid milestone deadline") }