From fb522f1149f67bf5c6359360ae1892006b600f5b Mon Sep 17 00:00:00 2001 From: Markus Spann Date: Thu, 25 Jun 2026 09:00:00 +0100 Subject: [PATCH] fix: migrate Country.flag() from deprecated flags.fmcdn.net to flagcdn.com - add ImageFormat enum (PNG, WEBP, SVG, JPG) - add flag(String size, ImageFormat format) overload for full control over image size and format (fixed-width, fixed-height, icon, SVG) - replace instance field flagUrl with static final FLAG_BASE_URL - existing flag() behaviour unchanged (PNG, w580) --- .../net/datafaker/providers/base/Country.java | 51 +++++++++++++++++-- .../datafaker/providers/base/CountryTest.java | 24 +++++++-- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/datafaker/providers/base/Country.java b/src/main/java/net/datafaker/providers/base/Country.java index 20d0a23ca..02dcb9863 100644 --- a/src/main/java/net/datafaker/providers/base/Country.java +++ b/src/main/java/net/datafaker/providers/base/Country.java @@ -1,27 +1,50 @@ package net.datafaker.providers.base; +import java.util.Locale; + /** * Provides methods for generating country-related data such as names, codes, capitals, and flags. *

* This provider is backed by the data defined in {@code country.yml}. + *

+ * Flag images are served by flagcdn.com + * (see Flagpedia API). * * @since 0.8.0 */ public class Country extends AbstractProvider { - private final String flagUrl; + + private static final String FLAG_BASE_URL = "https://flagcdn.com/"; protected Country(BaseProviders faker) { super(faker); - this.flagUrl = "https://flags.fmcdn.net/data/flags/w580/"; } /** - * Generates a URL pointing to the flag image of a random country. + * Generates a PNG flag URL for a random country at size ({@code w580}). * * @return a flag image URL string */ public String flag() { - return flagUrl + resolve("country.code2") + ".png"; + return flag("w580", ImageFormat.PNG); + } + + /** + * Generates a flag URL for a random country. + *

+ * For {@link ImageFormat#SVG} the {@code size} argument is ignored.
+ * See the Flagpedia API for valid size strings. + * + * @param size a {@code flagcdn.com} size string, e.g. {@code "w320"}, {@code "h80"}, {@code "32x24"} + * @param format the desired image format + * @return a flag image URL string + */ + public String flag(String size, ImageFormat format) { + String url = FLAG_BASE_URL; + if (ImageFormat.SVG != format) { + url += size + '/'; + } + return url + countryCode2() + '.' + format.getExtension(); } /** @@ -76,4 +99,24 @@ public String name() { return resolve("country.name"); } + /** + * Image format for flag URLs. + */ + public enum ImageFormat { + JPG, + PNG, + SVG, + WEBP; + + private final String extension; + + ImageFormat() { + this.extension = name().toLowerCase(Locale.ROOT); + } + + public String getExtension() { + return extension; + } + } + } diff --git a/src/test/java/net/datafaker/providers/base/CountryTest.java b/src/test/java/net/datafaker/providers/base/CountryTest.java index 0cf885360..4c659808d 100644 --- a/src/test/java/net/datafaker/providers/base/CountryTest.java +++ b/src/test/java/net/datafaker/providers/base/CountryTest.java @@ -1,21 +1,37 @@ package net.datafaker.providers.base; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; + import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.ValueSource; +import java.net.URL; import java.util.Collection; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; - class CountryTest extends BaseFakerTest { private final Country country = faker.country(); @RepeatedTest(10) void testFlag() { - String flag = country.flag(); - assertThat(flag).matches("^https://flags.fmcdn\\.net/data/flags/w580/[a-zA-Z0-9_]+\\.png$"); + assertThat(country.flag()).matches("^https://flagcdn\\.com/w580/[a-z]{2}+\\.png$"); + } + + @ParameterizedTest + @ValueSource(strings = {"w580", "w320", "h80", "32x24"}) + void testFlagWithSizeProducesValidUrl(String size) { + assertThatNoException().isThrownBy(() -> new URL(country.flag(size, Country.ImageFormat.PNG))); + } + + @ParameterizedTest + @EnumSource(Country.ImageFormat.class) + void testFlagWithFormatProducesValidUrl(Country.ImageFormat format) { + assertThatNoException().isThrownBy(() -> new URL(country.flag("w320", format))); } @Test