import Foundation import Testing @testable import PediFoods @Test("ImageSourceResolver returns nil for nil, empty, or whitespace-only input") func imageSourceResolverNilOnEmptyInput() { #expect(ImageSourceResolver.resolve(nil) == nil) #expect(ImageSourceResolver.resolve("") == nil) #expect(ImageSourceResolver.resolve(" ") == nil) } @Test("ImageSourceResolver passes absolute http/https URLs through unchanged") func imageSourceResolverPassesAbsoluteURLsThrough() { #expect(ImageSourceResolver.resolve("https://cdn.example.com/img.png") == "https://cdn.example.com/img.png") #expect(ImageSourceResolver.resolve("http://cdn.example.com/img.png") == "http://cdn.example.com/img.png") } @Test("ImageSourceResolver treats the http/https scheme check case-insensitively") func imageSourceResolverSchemeCheckIsCaseInsensitive() { let resolved = ImageSourceResolver.resolve("HTTPS://cdn.example.com/img.png") #expect(resolved == "HTTPS://cdn.example.com/img.png") } @Test("ImageSourceResolver passes data:image URLs through unchanged") func imageSourceResolverPassesDataImageURLsThrough() { let dataURL = "data:image/png;base64,iVBORw0KGgo=" #expect(ImageSourceResolver.resolve(dataURL) == dataURL) } @Test("ImageSourceResolver normalizes JSON-escaped backslash-slashes before checking the scheme") func imageSourceResolverNormalizesEscapedSlashes() { let escaped = "https:\\/\\/cdn.example.com\\/img.png" #expect(ImageSourceResolver.resolve(escaped) == "https://cdn.example.com/img.png") } @Test("ImageSourceResolver prefixes a relative path with the API base URL") func imageSourceResolverPrefixesRelativePathWithBaseURL() { let resolved = ImageSourceResolver.resolve("uploads/img.png") #expect(resolved == "\(ApiConfig.baseURL.absoluteString)/uploads/img.png") } @Test("ImageSourceResolver doesn't double the leading slash for an already-rooted relative path") func imageSourceResolverDoesNotDoubleLeadingSlash() { let resolved = ImageSourceResolver.resolve("/uploads/img.png") #expect(resolved == "\(ApiConfig.baseURL.absoluteString)/uploads/img.png") }