-
Notifications
You must be signed in to change notification settings - Fork 23
HYPERFLEET-1280 - refactor: rename pagination and ordering query params #253
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,68 +8,68 @@ import ( | |
| . "github.com/onsi/gomega" | ||
| ) | ||
|
|
||
| func TestNewListArguments_OrderBy(t *testing.T) { | ||
| func TestNewListArguments_Order(t *testing.T) { | ||
| RegisterTestingT(t) | ||
|
|
||
| tests := []struct { | ||
| name string | ||
| queryParams url.Values | ||
| expectedOrderBy []string | ||
| name string | ||
| queryParams url.Values | ||
| expectedOrder []string | ||
| }{ | ||
| { | ||
| name: "no orderBy - should use default created_time desc", | ||
| queryParams: url.Values{}, | ||
| expectedOrderBy: []string{"created_time desc"}, | ||
| name: "no order - should use default created_time desc", | ||
| queryParams: url.Values{}, | ||
| expectedOrder: []string{"created_time desc"}, | ||
| }, | ||
| { | ||
| name: "orderBy with asc direction", | ||
| queryParams: url.Values{"orderBy": []string{"name asc"}}, | ||
| expectedOrderBy: []string{"name asc"}, | ||
| name: "order with asc direction", | ||
| queryParams: url.Values{"order": []string{"name asc"}}, | ||
| expectedOrder: []string{"name asc"}, | ||
| }, | ||
| { | ||
| name: "orderBy with desc direction", | ||
| queryParams: url.Values{"orderBy": []string{"name desc"}}, | ||
| expectedOrderBy: []string{"name desc"}, | ||
| name: "order with desc direction", | ||
| queryParams: url.Values{"order": []string{"name desc"}}, | ||
| expectedOrder: []string{"name desc"}, | ||
| }, | ||
| { | ||
| name: "orderBy without direction", | ||
| queryParams: url.Values{"orderBy": []string{"name"}}, | ||
| expectedOrderBy: []string{"name"}, | ||
| name: "order without direction", | ||
| queryParams: url.Values{"order": []string{"name"}}, | ||
| expectedOrder: []string{"name"}, | ||
| }, | ||
| { | ||
| name: "multiple orderBy fields", | ||
| queryParams: url.Values{"orderBy": []string{"name asc,created_time desc"}}, | ||
| expectedOrderBy: []string{"name asc", "created_time desc"}, | ||
| name: "multiple order fields", | ||
| queryParams: url.Values{"order": []string{"name asc,created_time desc"}}, | ||
| expectedOrder: []string{"name asc", "created_time desc"}, | ||
| }, | ||
| { | ||
| name: "orderBy with spaces should be trimmed", | ||
| queryParams: url.Values{"orderBy": []string{" name asc "}}, | ||
| expectedOrderBy: []string{"name asc"}, | ||
| name: "order with spaces should be trimmed", | ||
| queryParams: url.Values{"order": []string{" name asc "}}, | ||
| expectedOrder: []string{"name asc"}, | ||
| }, | ||
| { | ||
| name: "empty orderBy string - should use default", | ||
| queryParams: url.Values{"orderBy": []string{""}}, | ||
| expectedOrderBy: []string{"created_time desc"}, | ||
| name: "empty order string - should use default", | ||
| queryParams: url.Values{"order": []string{""}}, | ||
| expectedOrder: []string{"created_time desc"}, | ||
| }, | ||
| { | ||
| name: "orderBy with whitespace only - should use default", | ||
| queryParams: url.Values{"orderBy": []string{" "}}, | ||
| expectedOrderBy: []string{"created_time desc"}, | ||
| name: "order with whitespace only - should use default", | ||
| queryParams: url.Values{"order": []string{" "}}, | ||
| expectedOrder: []string{"created_time desc"}, | ||
| }, | ||
| { | ||
| name: "orderBy with empty tokens - should filter out", | ||
| queryParams: url.Values{"orderBy": []string{"name,,created_time"}}, | ||
| expectedOrderBy: []string{"name", "created_time"}, | ||
| name: "order with empty tokens - should filter out", | ||
| queryParams: url.Values{"order": []string{"name,,created_time"}}, | ||
| expectedOrder: []string{"name", "created_time"}, | ||
| }, | ||
| } | ||
|
|
||
| for _, tt := range tests { | ||
| t.Run(tt.name, func(t *testing.T) { | ||
| RegisterTestingT(t) | ||
| listArgs, err := NewListArguments(tt.queryParams) | ||
| Expect(err).To(BeNil(), "Should not return error for valid orderBy parameters") | ||
| Expect(listArgs.OrderBy).To(Equal(tt.expectedOrderBy), | ||
| "OrderBy mismatch for test case: %s", tt.name) | ||
| Expect(err).To(BeNil(), "Should not return error for valid order parameters") | ||
| Expect(listArgs.Order).To(Equal(tt.expectedOrder), | ||
| "Order mismatch for test case: %s", tt.name) | ||
| }) | ||
| } | ||
| } | ||
|
|
@@ -83,10 +83,10 @@ func TestNewListArguments_DefaultValues(t *testing.T) { | |
| Expect(listArgs.Page).To(Equal(1), "Default page should be 1") | ||
| Expect(listArgs.Size).To(Equal(int64(20)), "Default size should be 20") | ||
| Expect(listArgs.Search).To(Equal(""), "Default search should be empty") | ||
| Expect(listArgs.OrderBy).To(Equal([]string{"created_time desc"}), "Default orderBy should be created_time desc") | ||
| Expect(listArgs.Order).To(Equal([]string{"created_time desc"}), "Default order should be created_time desc") | ||
| } | ||
|
|
||
| func TestNewListArguments_PageSize(t *testing.T) { | ||
| func TestNewListArguments_Size(t *testing.T) { | ||
| RegisterTestingT(t) | ||
|
|
||
| tests := []struct { | ||
|
|
@@ -96,23 +96,17 @@ func TestNewListArguments_PageSize(t *testing.T) { | |
| expectedSize int64 | ||
| }{ | ||
| { | ||
| name: "custom page and pageSize", | ||
| queryParams: url.Values{"page": []string{"2"}, "pageSize": []string{"50"}}, | ||
| name: "custom page and size", | ||
| queryParams: url.Values{"page": []string{"2"}, "size": []string{"50"}}, | ||
| expectedPage: 2, | ||
| expectedSize: 50, | ||
| }, | ||
| { | ||
| name: "custom page and size (legacy)", | ||
| name: "custom page and size (different values)", | ||
| queryParams: url.Values{"page": []string{"3"}, "size": []string{"25"}}, | ||
| expectedPage: 3, | ||
| expectedSize: 25, | ||
| }, | ||
| { | ||
| name: "pageSize takes precedence over size", | ||
| queryParams: url.Values{"pageSize": []string{"30"}, "size": []string{"60"}}, | ||
| expectedPage: 1, | ||
| expectedSize: 30, | ||
| }, | ||
| } | ||
|
|
||
| for _, tt := range tests { | ||
|
|
@@ -278,36 +272,25 @@ func TestNewListArguments_Validation(t *testing.T) { | |
| errorCode: "HYPERFLEET-VAL-003", | ||
| }, | ||
|
|
||
| // PageSize validation tests (OpenAPI spec parameter) | ||
| // PageSize boundary checks — VAL-004 (CodeValidationRange) for values outside valid range (1-100) | ||
| { | ||
| name: "negative pageSize returns error", | ||
| queryParams: url.Values{"pageSize": []string{"-1"}}, | ||
| expectError: true, | ||
| errorContains: "Invalid pageSize parameter", | ||
| errorCode: "HYPERFLEET-VAL-004", | ||
| }, | ||
| // Additional size edge cases | ||
| { | ||
| name: "zero pageSize returns error", | ||
| queryParams: url.Values{"pageSize": []string{"0"}}, | ||
| name: "size with special characters returns error", | ||
| queryParams: url.Values{"size": []string{"<script>"}}, | ||
| expectError: true, | ||
| errorContains: "Invalid pageSize parameter", | ||
| errorCode: "HYPERFLEET-VAL-004", | ||
| errorContains: "Invalid size parameter", | ||
| errorCode: "HYPERFLEET-VAL-003", | ||
| }, | ||
| { | ||
| name: "pageSize exceeding MaxPageSize returns error", | ||
| queryParams: url.Values{"pageSize": []string{"101"}}, | ||
| name: "very large size returns error", | ||
| queryParams: url.Values{"size": []string{"999999"}}, | ||
| expectError: true, | ||
| errorContains: "exceeds maximum allowed value", | ||
| errorCode: "HYPERFLEET-VAL-004", | ||
| }, | ||
| // PageSize parse errors — VAL-003 (CodeValidationFormat) for non-numeric input | ||
| { | ||
| name: "non-numeric pageSize returns error", | ||
| queryParams: url.Values{"pageSize": []string{"xyz"}}, | ||
| expectError: true, | ||
| errorContains: "Invalid pageSize parameter", | ||
| errorCode: "HYPERFLEET-VAL-003", | ||
| name: "pageSize is ignored (no longer a valid parameter)", | ||
| queryParams: url.Values{"pageSize": []string{"50"}}, | ||
| expectError: false, | ||
|
Comment on lines
290
to
+293
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win Blocking contract break: This test locks in silent fallback to the default page size for callers that still use the old parameter. The linked 🤖 Prompt for AI AgentsSource: Linked repositories |
||
| }, | ||
|
|
||
| // Valid cases | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we change the name to buildOrder?
Then you would also subsequently need to change https://github.com/openshift-hyperfleet/hyperfleet-api/blob/main/pkg/services/generic.go#L100C5-L100C17
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As this is an non-exported function, I don't think matters that much, let's move on with the PR