// 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/' }