// Copyright (c) 2019-2026 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module s3
// Captured from a real ListObjectsV2 response (S3-compatible endpoint),
// trimmed to the fields we parse.
const list_response_xml = '
test-bucket
foo/
2
1000
false
foo/a.txt
10
"d41d8cd98f00b204e9800998ecf8427e"
2024-01-15T00:00:00.000Z
STANDARD
foo/b.txt
20
"9b8b80d22b1d56a3f9b2c25d6e3e74c5"
2024-01-16T00:00:00.000Z
'
fn test_parse_list_response_basic() {
r := parse_list_response(list_response_xml) or { panic(err) }
assert r.name == 'test-bucket'
assert r.prefix == 'foo/'
assert r.key_count == 2
assert !r.is_truncated
assert r.objects.len == 2
assert r.objects[0].key == 'foo/a.txt'
assert r.objects[0].size == 10
assert r.objects[0].etag == 'd41d8cd98f00b204e9800998ecf8427e'
assert r.objects[1].key == 'foo/b.txt'
}
fn test_parse_list_response_truncated() {
body := 'btrueopaqueToken==1only.txt1"abc"'
r := parse_list_response(body) or { panic(err) }
assert r.is_truncated
assert r.next_continuation_token == 'opaqueToken=='
}
fn test_parse_list_response_common_prefixes() {
body := 'b/folder1/folder2/0'
r := parse_list_response(body) or { panic(err) }
assert r.delimiter == '/'
assert r.common_prefixes.len == 2
assert r.common_prefixes[0].prefix == 'folder1/'
assert r.common_prefixes[1].prefix == 'folder2/'
}