test(registry): add Content-Range validation test for PATCH uploads
Verify the Range header in PATCH responses matches the OCI spec, serving as a safety net for chunked upload compliance.
- commit
- 887cae15147134ea720be37fe64c1a8a944b7893
- author
- brice · · 2026-02-06 13:03 UTC
- parent
- 00586f3
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +19 -0
M internal/adapters/in/http/registry/handler_test.go +19 -0
| @@ -446,3 +446,22 @@ func TestMaxBlobChunkSize_Under100MB(t *testing.T) { | |||
| 446 | 446 | assert.Less(t, int64(MaxBlobChunkSize), int64(100*1024*1024)) | |
| 447 | 447 | assert.Greater(t, int64(MaxBlobChunkSize), int64(90*1024*1024)) | |
| 448 | 448 | } | |
| 449 | + | ||
| 450 | + | func TestHandler_BlobUpload_PATCH_ReturnsContentRange(t *testing.T) { | |
| 451 | + | registrySvc := inmocks.NewMockRegistryService(t) | |
| 452 | + | handler := NewHandler(registrySvc, testLogger()) | |
| 453 | + | ||
| 454 | + | chunkData := []byte("chunk content") | |
| 455 | + | registrySvc.EXPECT().AppendBlobChunk(mock.Anything, "myapp", "550e8400-e29b-41d4-a716-446655440000", chunkData).Return(int64(len(chunkData)), nil) | |
| 456 | + | ||
| 457 | + | req := httptest.NewRequest("PATCH", "/v2/myapp/blobs/uploads/550e8400-e29b-41d4-a716-446655440000", bytes.NewReader(chunkData)) | |
| 458 | + | req.Header.Set("Content-Range", "0-12") | |
| 459 | + | req.Header.Set("Content-Length", "13") | |
| 460 | + | rec := httptest.NewRecorder() | |
| 461 | + | ||
| 462 | + | handler.ServeHTTP(rec, req) | |
| 463 | + | ||
| 464 | + | assert.Equal(t, http.StatusAccepted, rec.Code) | |
| 465 | + | // OCI spec: Range header should reflect total received bytes | |
| 466 | + | assert.Equal(t, "0-12", rec.Header().Get("Range")) | |
| 467 | + | } | |
| @@ -446,3 +446,22 @@ func TestMaxBlobChunkSize_Under100MB(t *testing.T) { | |||||
| 446 | assert.Less(t, int64(MaxBlobChunkSize), int64(100*1024*1024)) | 446 | assert.Less(t, int64(MaxBlobChunkSize), int64(100*1024*1024)) | ||
| 447 | assert.Greater(t, int64(MaxBlobChunkSize), int64(90*1024*1024)) | 447 | assert.Greater(t, int64(MaxBlobChunkSize), int64(90*1024*1024)) | ||
| 448 | } | 448 | } | ||
| 449 | + | ||||
| 450 | + | func TestHandler_BlobUpload_PATCH_ReturnsContentRange(t *testing.T) { | |||
| 451 | + | registrySvc := inmocks.NewMockRegistryService(t) | |||
| 452 | + | handler := NewHandler(registrySvc, testLogger()) | |||
| 453 | + | ||||
| 454 | + | chunkData := []byte("chunk content") | |||
| 455 | + | registrySvc.EXPECT().AppendBlobChunk(mock.Anything, "myapp", "550e8400-e29b-41d4-a716-446655440000", chunkData).Return(int64(len(chunkData)), nil) | |||
| 456 | + | ||||
| 457 | + | req := httptest.NewRequest("PATCH", "/v2/myapp/blobs/uploads/550e8400-e29b-41d4-a716-446655440000", bytes.NewReader(chunkData)) | |||
| 458 | + | req.Header.Set("Content-Range", "0-12") | |||
| 459 | + | req.Header.Set("Content-Length", "13") | |||
| 460 | + | rec := httptest.NewRecorder() | |||
| 461 | + | ||||
| 462 | + | handler.ServeHTTP(rec, req) | |||
| 463 | + | ||||
| 464 | + | assert.Equal(t, http.StatusAccepted, rec.Code) | |||
| 465 | + | // OCI spec: Range header should reflect total received bytes | |||
| 466 | + | assert.Equal(t, "0-12", rec.Header().Get("Range")) | |||
| 467 | + | } | |||