From 72ba7dce5c5a5667d6273407db69b39535add6d9 Mon Sep 17 00:00:00 2001 From: takeshi yamashita <220619+takecy@users.noreply.github.com> Date: Wed, 21 Jan 2026 20:44:40 +0900 Subject: [PATCH 1/2] chore: upgrade actions in unit test workflow --- .github/workflows/unit_test.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml index 91b5933..c0fe912 100644 --- a/.github/workflows/unit_test.yml +++ b/.github/workflows/unit_test.yml @@ -11,13 +11,15 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go: [ '1.22', '1.23', '1.24' ] + go: [ '1.24', '1.25' ] name: Go ${{ matrix.go }} test steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 + - name: Setup go - uses: actions/setup-go@v4 + uses: actions/setup-go@v6 with: go-version: ${{ matrix.go }} + - name: test run: go test -v -race ./... From 48a239265ff13f76dda8a5614470309befc454c1 Mon Sep 17 00:00:00 2001 From: takeshi yamashita <220619+takecy@users.noreply.github.com> Date: Wed, 21 Jan 2026 20:44:50 +0900 Subject: [PATCH 2/2] feat(appstore): update ConsumptionRequest to use pointer for ConsumptionPercentage and add JSON serialization tests --- appstore/api/model.go | 2 +- appstore/api/model_test.go | 77 ++++++++++++++++++++++++++++++++++++++ appstore/mocks/store.go | 61 ++++++++++++++++++++++++++---- 3 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 appstore/api/model_test.go diff --git a/appstore/api/model.go b/appstore/api/model.go index b3a8dd0..441d44c 100644 --- a/appstore/api/model.go +++ b/appstore/api/model.go @@ -93,7 +93,7 @@ const ( // ConsumptionRequestBody https://developer.apple.com/documentation/appstoreserverapi/consumptionrequest type ConsumptionRequest struct { CustomerConsented bool `json:"customerConsented"` - ConsumptionPercentage int32 `json:"consumptionPercentage"` + ConsumptionPercentage *int32 `json:"consumptionPercentage,omitempty"` DeliveryStatus DeliveryStatus `json:"deliveryStatus"` RefundPreference RefundPreference `json:"refundPreference"` SampleContentProvided bool `json:"sampleContentProvided"` diff --git a/appstore/api/model_test.go b/appstore/api/model_test.go new file mode 100644 index 0000000..30cb62e --- /dev/null +++ b/appstore/api/model_test.go @@ -0,0 +1,77 @@ +package api + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestConsumptionRequest_JSONSerialization(t *testing.T) { + t.Run("should omit ConsumptionPercentage when nil", func(t *testing.T) { + t.Parallel() + req := ConsumptionRequest{ + CustomerConsented: true, + ConsumptionPercentage: nil, + DeliveryStatus: DELIVERED, + RefundPreference: DECLINE, + SampleContentProvided: false, + } + + data, err := json.Marshal(req) + assert.NoError(t, err) + + var result map[string]interface{} + err = json.Unmarshal(data, &result) + assert.NoError(t, err) + + _, exists := result["consumptionPercentage"] + assert.False(t, exists, "consumptionPercentage should be omitted") + }) + + t.Run("should include ConsumptionPercentage when set to 0", func(t *testing.T) { + t.Parallel() + zero := int32(0) + req := ConsumptionRequest{ + CustomerConsented: true, + ConsumptionPercentage: &zero, + DeliveryStatus: DELIVERED, + RefundPreference: GRANT_FULL, + SampleContentProvided: true, + } + + data, err := json.Marshal(req) + assert.NoError(t, err) + + var result map[string]interface{} + err = json.Unmarshal(data, &result) + assert.NoError(t, err) + + val, exists := result["consumptionPercentage"] + assert.True(t, exists) + assert.Equal(t, float64(0), val) + }) + + t.Run("should include ConsumptionPercentage when set to non-zero value", func(t *testing.T) { + t.Parallel() + fifty := int32(50) + req := ConsumptionRequest{ + CustomerConsented: true, + ConsumptionPercentage: &fifty, + DeliveryStatus: DELIVERED, + RefundPreference: GRANT_PRORATED, + SampleContentProvided: true, + } + + data, err := json.Marshal(req) + assert.NoError(t, err) + + var result map[string]interface{} + err = json.Unmarshal(data, &result) + assert.NoError(t, err) + + val, exists := result["consumptionPercentage"] + assert.True(t, exists) + assert.Equal(t, float64(50), val) + }) +} diff --git a/appstore/mocks/store.go b/appstore/mocks/store.go index 727160d..01c4526 100644 --- a/appstore/mocks/store.go +++ b/appstore/mocks/store.go @@ -45,9 +45,9 @@ func (m *MockStoreAPIClient) EXPECT() *MockStoreAPIClientMockRecorder { } // Do mocks base method. -func (m *MockStoreAPIClient) Do(ctx context.Context, method, url string, body io.Reader) (int, []byte, error) { +func (m *MockStoreAPIClient) Do(ctx context.Context, method, arg2 string, body io.Reader) (int, []byte, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Do", ctx, method, url, body) + ret := m.ctrl.Call(m, "Do", ctx, method, arg2, body) ret0, _ := ret[0].(int) ret1, _ := ret[1].([]byte) ret2, _ := ret[2].(error) @@ -55,9 +55,9 @@ func (m *MockStoreAPIClient) Do(ctx context.Context, method, url string, body io } // Do indicates an expected call of Do. -func (mr *MockStoreAPIClientMockRecorder) Do(ctx, method, url, body any) *gomock.Call { +func (mr *MockStoreAPIClientMockRecorder) Do(ctx, method, arg2, body any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Do", reflect.TypeOf((*MockStoreAPIClient)(nil).Do), ctx, method, url, body) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Do", reflect.TypeOf((*MockStoreAPIClient)(nil).Do), ctx, method, arg2, body) } // ExtendSubscriptionRenewalDate mocks base method. @@ -120,6 +120,21 @@ func (mr *MockStoreAPIClientMockRecorder) GetAllNotificationHistory(ctx, body, d return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllNotificationHistory", reflect.TypeOf((*MockStoreAPIClient)(nil).GetAllNotificationHistory), ctx, body, duration) } +// GetAppTransactionInfo mocks base method. +func (m *MockStoreAPIClient) GetAppTransactionInfo(ctx context.Context, transactionId string) (*api.AppTransactionInfoResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAppTransactionInfo", ctx, transactionId) + ret0, _ := ret[0].(*api.AppTransactionInfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAppTransactionInfo indicates an expected call of GetAppTransactionInfo. +func (mr *MockStoreAPIClientMockRecorder) GetAppTransactionInfo(ctx, transactionId any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAppTransactionInfo", reflect.TypeOf((*MockStoreAPIClient)(nil).GetAppTransactionInfo), ctx, transactionId) +} + // GetNotificationHistory mocks base method. func (m *MockStoreAPIClient) GetNotificationHistory(ctx context.Context, body api.NotificationHistoryRequest, paginationToken string) (*api.NotificationHistoryResponses, error) { m.ctrl.T.Helper() @@ -183,18 +198,18 @@ func (mr *MockStoreAPIClientMockRecorder) GetTestNotificationStatus(ctx, testNot } // GetTransactionHistory mocks base method. -func (m *MockStoreAPIClient) GetTransactionHistory(ctx context.Context, originalTransactionId string, query *url.Values) ([]*api.HistoryResponse, error) { +func (m *MockStoreAPIClient) GetTransactionHistory(ctx context.Context, transactionId string, query *url.Values) ([]*api.HistoryResponse, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetTransactionHistory", ctx, originalTransactionId, query) + ret := m.ctrl.Call(m, "GetTransactionHistory", ctx, transactionId, query) ret0, _ := ret[0].([]*api.HistoryResponse) ret1, _ := ret[1].(error) return ret0, ret1 } // GetTransactionHistory indicates an expected call of GetTransactionHistory. -func (mr *MockStoreAPIClientMockRecorder) GetTransactionHistory(ctx, originalTransactionId, query any) *gomock.Call { +func (mr *MockStoreAPIClientMockRecorder) GetTransactionHistory(ctx, transactionId, query any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTransactionHistory", reflect.TypeOf((*MockStoreAPIClient)(nil).GetTransactionHistory), ctx, originalTransactionId, query) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTransactionHistory", reflect.TypeOf((*MockStoreAPIClient)(nil).GetTransactionHistory), ctx, transactionId, query) } // GetTransactionInfo mocks base method. @@ -287,6 +302,21 @@ func (mr *MockStoreAPIClientMockRecorder) SendConsumptionInfo(ctx, originalTrans return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendConsumptionInfo", reflect.TypeOf((*MockStoreAPIClient)(nil).SendConsumptionInfo), ctx, originalTransactionId, body) } +// SendConsumptionInfoV2 mocks base method. +func (m *MockStoreAPIClient) SendConsumptionInfoV2(ctx context.Context, transactionId string, body api.ConsumptionRequest) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendConsumptionInfoV2", ctx, transactionId, body) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SendConsumptionInfoV2 indicates an expected call of SendConsumptionInfoV2. +func (mr *MockStoreAPIClientMockRecorder) SendConsumptionInfoV2(ctx, transactionId, body any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendConsumptionInfoV2", reflect.TypeOf((*MockStoreAPIClient)(nil).SendConsumptionInfoV2), ctx, transactionId, body) +} + // SendRequestTestNotification mocks base method. func (m *MockStoreAPIClient) SendRequestTestNotification(ctx context.Context) (int, []byte, error) { m.ctrl.T.Helper() @@ -302,3 +332,18 @@ func (mr *MockStoreAPIClientMockRecorder) SendRequestTestNotification(ctx any) * mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendRequestTestNotification", reflect.TypeOf((*MockStoreAPIClient)(nil).SendRequestTestNotification), ctx) } + +// SetAppAccountToken mocks base method. +func (m *MockStoreAPIClient) SetAppAccountToken(ctx context.Context, originalTransactionId string, body api.UpdateAppAccountTokenRequest) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAppAccountToken", ctx, originalTransactionId, body) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetAppAccountToken indicates an expected call of SetAppAccountToken. +func (mr *MockStoreAPIClientMockRecorder) SetAppAccountToken(ctx, originalTransactionId, body any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAppAccountToken", reflect.TypeOf((*MockStoreAPIClient)(nil).SetAppAccountToken), ctx, originalTransactionId, body) +}