diff --git a/src/main/java/dev/sorn/fmp4j/exceptions/FmpInvalidSectorException.java b/src/main/java/dev/sorn/fmp4j/exceptions/FmpInvalidSectorException.java new file mode 100644 index 00000000..06b21e39 --- /dev/null +++ b/src/main/java/dev/sorn/fmp4j/exceptions/FmpInvalidSectorException.java @@ -0,0 +1,7 @@ +package dev.sorn.fmp4j.exceptions; + +public class FmpInvalidSectorException extends FmpException { + public FmpInvalidSectorException(String message, Object... args) { + super(message, args); + } +} diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java b/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java index 3813b1e0..95c90fcb 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java @@ -4,6 +4,7 @@ import dev.sorn.fmp4j.types.FmpCurrency; import dev.sorn.fmp4j.types.FmpCusip; import dev.sorn.fmp4j.types.FmpIsin; +import dev.sorn.fmp4j.types.FmpSector; import dev.sorn.fmp4j.types.FmpSymbol; import java.io.Serial; import java.time.LocalDate; @@ -30,7 +31,7 @@ public record FmpCompany( String website, String description, String ceo, - String sector, + FmpSector sector, String country, String fullTimeEmployees, String phone, @@ -47,5 +48,5 @@ public record FmpCompany( Boolean isFund) implements FmpModel { @Serial - private static final long serialVersionUID = 5L; + private static final long serialVersionUID = 6L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpEtfSectorWeighting.java b/src/main/java/dev/sorn/fmp4j/models/FmpEtfSectorWeighting.java index 23bbdff4..4323e581 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpEtfSectorWeighting.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpEtfSectorWeighting.java @@ -1,9 +1,10 @@ package dev.sorn.fmp4j.models; +import dev.sorn.fmp4j.types.FmpSector; import dev.sorn.fmp4j.types.FmpSymbol; import java.io.Serial; -public record FmpEtfSectorWeighting(FmpSymbol symbol, String sector, Double weightPercentage) implements FmpModel { +public record FmpEtfSectorWeighting(FmpSymbol symbol, FmpSector sector, Double weightPercentage) implements FmpModel { @Serial - private static final long serialVersionUID = 2L; + private static final long serialVersionUID = 3L; } diff --git a/src/main/java/dev/sorn/fmp4j/types/FmpSector.java b/src/main/java/dev/sorn/fmp4j/types/FmpSector.java new file mode 100644 index 00000000..3e61ee03 --- /dev/null +++ b/src/main/java/dev/sorn/fmp4j/types/FmpSector.java @@ -0,0 +1,45 @@ +package dev.sorn.fmp4j.types; + +import static java.util.Arrays.stream; + +import com.fasterxml.jackson.annotation.JsonCreator; +import dev.sorn.fmp4j.exceptions.FmpInvalidSectorException; +import java.util.Objects; + +public enum FmpSector implements FmpValueObject { + BASIC_MATERIALS("Basic Materials"), + COMMUNICATION_SERVICES("Communication Services"), + CONSUMER_CYCLICAL("Consumer Cyclical"), + CONSUMER_DEFENSIVE("Consumer Defensive"), + ENERGY("Energy"), + FINANCIAL_SERVICES("Financial Services"), + HEALTHCARE("Healthcare"), + INDUSTRIALS("Industrials"), + REAL_ESTATE("Real Estate"), + TECHNOLOGY("Technology"), + UTILITIES("Utilities"); + + private final String value; + + FmpSector(String value) { + this.value = value; + } + + @JsonCreator + public static FmpSector sector(String value) { + return stream(values()) + .filter(sector -> Objects.equals(sector.value, value)) + .findFirst() + .orElseThrow(() -> new FmpInvalidSectorException("[%s] is not a valid sector", value)); + } + + @Override + public String value() { + return value; + } + + @Override + public String toString() { + return value(); + } +} diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpSectorTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpSectorTest.java new file mode 100644 index 00000000..7c9a6224 --- /dev/null +++ b/src/test/java/dev/sorn/fmp4j/types/FmpSectorTest.java @@ -0,0 +1,46 @@ +package dev.sorn.fmp4j.types; + +import static dev.sorn.fmp4j.types.FmpSector.sector; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import dev.sorn.fmp4j.exceptions.FmpInvalidSectorException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class FmpSectorTest { + @ParameterizedTest + @ValueSource( + strings = { + "Basic Materials", + "Communication Services", + "Consumer Cyclical", + "Consumer Defensive", + "Energy", + "Financial Services", + "Healthcare", + "Industrials", + "Real Estate", + "Technology", + "Utilities", + }) + void valid_sectors(String readable) { + // given // when + var sector = sector(readable); + + // then + assertEquals(readable, sector.value()); + assertEquals(readable, sector.toString()); + } + + @Test + void invalid_sector() { + // given + var invalid = "Invalid Sector"; + + // when // then + var e = assertThrows(FmpInvalidSectorException.class, () -> sector(invalid)); + assertEquals("[Invalid Sector] is not a valid sector", e.getMessage()); + } +} diff --git a/src/testFixtures/java/dev/sorn/fmp4j/CompanyTestData.java b/src/testFixtures/java/dev/sorn/fmp4j/CompanyTestData.java index ea114bf8..e17b2d4c 100644 --- a/src/testFixtures/java/dev/sorn/fmp4j/CompanyTestData.java +++ b/src/testFixtures/java/dev/sorn/fmp4j/CompanyTestData.java @@ -4,6 +4,7 @@ import static dev.sorn.fmp4j.types.FmpCurrency.USD; import static dev.sorn.fmp4j.types.FmpCusip.cusip; import static dev.sorn.fmp4j.types.FmpIsin.isin; +import static dev.sorn.fmp4j.types.FmpSector.sector; import static dev.sorn.fmp4j.types.FmpSymbol.symbol; import dev.sorn.fmp4j.models.FmpCompany; @@ -33,7 +34,7 @@ default FmpCompany aCompany() { "https://www.apple.com", "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide. The company offers iPhone, a line of smartphones; Mac, a line of personal computers; iPad, a line of multi-purpose tablets; and wearables, home, and accessories comprising AirPods, Apple TV, Apple Watch, Beats products, and HomePod. It also provides AppleCare support and cloud services; and operates various platforms, including the App Store that allow customers to discov...", "Mr. Timothy D. Cook", - "Technology", + sector("Technology"), "US", "164000", "(408) 996-1010", diff --git a/src/testFixtures/java/dev/sorn/fmp4j/EtfSectorWeightingTestData.java b/src/testFixtures/java/dev/sorn/fmp4j/EtfSectorWeightingTestData.java index 7b7bb05b..dd488733 100644 --- a/src/testFixtures/java/dev/sorn/fmp4j/EtfSectorWeightingTestData.java +++ b/src/testFixtures/java/dev/sorn/fmp4j/EtfSectorWeightingTestData.java @@ -1,11 +1,12 @@ package dev.sorn.fmp4j; +import static dev.sorn.fmp4j.types.FmpSector.sector; import static dev.sorn.fmp4j.types.FmpSymbol.symbol; import dev.sorn.fmp4j.models.FmpEtfSectorWeighting; public interface EtfSectorWeightingTestData { default FmpEtfSectorWeighting anEtfSectorWeighting() { - return new FmpEtfSectorWeighting(symbol("SPY"), "Utilities", 2.45); + return new FmpEtfSectorWeighting(symbol("SPY"), sector("Utilities"), 2.45); } } diff --git a/src/testFixtures/resources/models/serialization/FmpCompany.snapshot b/src/testFixtures/resources/models/serialization/FmpCompany.snapshot index 1ac1f37c..b65d3556 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCompany.snapshot and b/src/testFixtures/resources/models/serialization/FmpCompany.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpCompany.version b/src/testFixtures/resources/models/serialization/FmpCompany.version index 62f3e6ff..fa902fa8 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCompany.version and b/src/testFixtures/resources/models/serialization/FmpCompany.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.snapshot b/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.snapshot index c846e989..88e5a4a9 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.snapshot and b/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.version b/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.version index ccfcbf41..29ce11cc 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.version and b/src/testFixtures/resources/models/serialization/FmpEtfSectorWeighting.version differ