diff --git a/src/main/java/com/marketdataapi/fmp4j/clients/FmpBulkClient.java b/src/main/java/com/marketdataapi/fmp4j/clients/FmpBulkClient.java index 1528417..e8224df 100644 --- a/src/main/java/com/marketdataapi/fmp4j/clients/FmpBulkClient.java +++ b/src/main/java/com/marketdataapi/fmp4j/clients/FmpBulkClient.java @@ -10,11 +10,13 @@ import com.marketdataapi.fmp4j.models.FmpCashFlowStatementGrowth; import com.marketdataapi.fmp4j.models.FmpCompanies; import com.marketdataapi.fmp4j.models.FmpKeyMetricTtm; +import com.marketdataapi.fmp4j.models.FmpRatioTtm; import com.marketdataapi.fmp4j.services.FmpBulkBalanceSheetStatementService; import com.marketdataapi.fmp4j.services.FmpBulkCashFlowStatementGrowthService; import com.marketdataapi.fmp4j.services.FmpBulkCashFlowStatementService; import com.marketdataapi.fmp4j.services.FmpBulkCompaniesService; import com.marketdataapi.fmp4j.services.FmpBulkKeyMetricTtmService; +import com.marketdataapi.fmp4j.services.FmpBulkRatioTtmService; import com.marketdataapi.fmp4j.services.FmpService; import com.marketdataapi.fmp4j.types.FmpPart; import com.marketdataapi.fmp4j.types.FmpPeriod; @@ -29,6 +31,7 @@ public class FmpBulkClient { protected final FmpService fmpBulkCashFlowService; protected final FmpService fmpBulkCashFlowStatementGrowthService; protected final FmpService fmpBulkKeyMetricTtmService; + protected final FmpService fmpBulkRatioTtmService; public FmpBulkClient(FmpConfig fmpConfig, FmpHttpClient fmpHttpClient) { this.fmpBulkCompaniesService = new FmpBulkCompaniesService(fmpConfig, fmpHttpClient); @@ -37,6 +40,7 @@ public FmpBulkClient(FmpConfig fmpConfig, FmpHttpClient fmpHttpClient) { this.fmpBulkCashFlowStatementGrowthService = new FmpBulkCashFlowStatementGrowthService(fmpConfig, fmpHttpClient); this.fmpBulkKeyMetricTtmService = new FmpBulkKeyMetricTtmService(fmpConfig, fmpHttpClient); + this.fmpBulkRatioTtmService = new FmpBulkRatioTtmService(fmpConfig, fmpHttpClient); } public synchronized List companies(FmpPart part) { @@ -65,4 +69,8 @@ public synchronized List cashFlowStatementGrowth(Fmp public synchronized List keyMetricsTtm() { return fmpBulkKeyMetricTtmService.download(); } + + public synchronized List ratiosTtm() { + return fmpBulkRatioTtmService.download(); + } } diff --git a/src/main/java/com/marketdataapi/fmp4j/services/FmpBulkRatioTtmService.java b/src/main/java/com/marketdataapi/fmp4j/services/FmpBulkRatioTtmService.java new file mode 100644 index 0000000..a0b494c --- /dev/null +++ b/src/main/java/com/marketdataapi/fmp4j/services/FmpBulkRatioTtmService.java @@ -0,0 +1,32 @@ +package com.marketdataapi.fmp4j.services; + +import com.marketdataapi.fmp4j.cfg.FmpConfig; +import com.marketdataapi.fmp4j.http.FmpHttpClient; +import com.marketdataapi.fmp4j.models.FmpRatioTtm; +import java.util.Map; + +public class FmpBulkRatioTtmService extends FmpService { + public FmpBulkRatioTtmService(FmpConfig cfg, FmpHttpClient http) { + super(cfg, http, FmpRatioTtm.class); + } + + @Override + protected String relativeUrl() { + return "/ratios-ttm-bulk"; + } + + @Override + protected Map> requiredParams() { + return Map.of(); + } + + @Override + protected Map> optionalParams() { + return Map.of(); + } + + @Override + protected Map headers() { + return Map.of("Content-Type", "text/csv"); + } +} diff --git a/src/test/java/com/marketdataapi/fmp4j/services/FmpBulkRatioTtmServiceTest.java b/src/test/java/com/marketdataapi/fmp4j/services/FmpBulkRatioTtmServiceTest.java new file mode 100644 index 0000000..22620cc --- /dev/null +++ b/src/test/java/com/marketdataapi/fmp4j/services/FmpBulkRatioTtmServiceTest.java @@ -0,0 +1,63 @@ +package com.marketdataapi.fmp4j.services; + +import static com.marketdataapi.fmp4j.TestUtils.assertAllFieldsNonNull; +import static com.marketdataapi.fmp4j.TestUtils.testResource; +import static java.util.stream.IntStream.range; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.marketdataapi.fmp4j.models.FmpRatioTtm; +import java.util.Map; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class FmpBulkRatioTtmServiceTest extends HttpTest { + private FmpService service; + + @BeforeEach + void setup() { + service = new FmpBulkRatioTtmService(config, client); + } + + @Test + void relative_url() { + // given // when + var relativeUrl = service.relativeUrl(); + + // then + assertEquals("/ratios-ttm-bulk", relativeUrl); + } + + @Test + void required_params() { + // given // when + var params = service.requiredParams(); + + // then + assertEquals(Map.of(), params); + } + + @Test + void optional_params() { + // given // when + var params = service.optionalParams(); + + // then + assertEquals(Map.of(), params); + } + + @Test + void successful_download() { + // given + httpStub.configureResponse() + .body(testResource("stable/ratios-ttm-bulk/excerpt.csv")) + .statusCode(200) + .apply(); + + // when + var result = service.download(); + + // then + assertEquals(2, result.size()); + range(0, result.size()).forEach(i -> assertAllFieldsNonNull(result.get(i))); + } +} diff --git a/src/testFixtures/resources/stable/ratios-ttm-bulk/excerpt.csv b/src/testFixtures/resources/stable/ratios-ttm-bulk/excerpt.csv new file mode 100644 index 0000000..8153128 --- /dev/null +++ b/src/testFixtures/resources/stable/ratios-ttm-bulk/excerpt.csv @@ -0,0 +1,3 @@ +"symbol","grossProfitMarginTTM","ebitMarginTTM","ebitdaMarginTTM","operatingProfitMarginTTM","pretaxProfitMarginTTM","continuousOperationsProfitMarginTTM","netProfitMarginTTM","bottomLineProfitMarginTTM","receivablesTurnoverTTM","payablesTurnoverTTM","inventoryTurnoverTTM","fixedAssetTurnoverTTM","assetTurnoverTTM","currentRatioTTM","quickRatioTTM","solvencyRatioTTM","cashRatioTTM","priceToEarningsRatioTTM","priceToEarningsGrowthRatioTTM","forwardPriceToEarningsGrowthRatioTTM","priceToBookRatioTTM","priceToSalesRatioTTM","priceToFreeCashFlowRatioTTM","priceToOperatingCashFlowRatioTTM","debtToAssetsRatioTTM","debtToEquityRatioTTM","debtToCapitalRatioTTM","longTermDebtToCapitalRatioTTM","financialLeverageRatioTTM","workingCapitalTurnoverRatioTTM","operatingCashFlowRatioTTM","operatingCashFlowSalesRatioTTM","freeCashFlowOperatingCashFlowRatioTTM","debtServiceCoverageRatioTTM","interestCoverageRatioTTM","shortTermOperatingCashFlowCoverageRatioTTM","operatingCashFlowCoverageRatioTTM","capitalExpenditureCoverageRatioTTM","dividendPaidAndCapexCoverageRatioTTM","dividendPayoutRatioTTM","dividendYieldTTM","enterpriseValueTTM","revenuePerShareTTM","netIncomePerShareTTM","interestDebtPerShareTTM","cashPerShareTTM","bookValuePerShareTTM","tangibleBookValuePerShareTTM","shareholdersEquityPerShareTTM","operatingCashFlowPerShareTTM","capexPerShareTTM","freeCashFlowPerShareTTM","netIncomePerEBTTTM","ebtPerEbitTTM","priceToFairValueTTM","debtToMarketCapTTM","effectiveTaxRateTTM","enterpriseValueMultipleTTM","dividendPerShareTTM" +"AAPL",0.41,0.35,0.30,0.30,0.28,0.28,0.26,0.26,5.2,4.1,8.3,1.5,1.8,1.2,1.1,0.9,0.8,28.5,1.2,1.1,42.3,7.5,18.2,12.5,0.18,1.3,0.22,0.15,2.5,1.8,0.35,0.32,0.85,2.1,18.5,2.8,3.2,1.5,1.8,0.25,0.01,2800000000000,5.2,6.8,0.5,3.2,18.5,16.2,22.5,7.2,1.5,8.2,0.95,0.95,0.95,0.05,0.15,18.5,0.95 +"GOOGL",0.38,0.32,0.28,0.28,0.26,0.26,0.22,0.22,4.8,3.9,6.5,1.3,1.6,1.3,1.2,0.8,0.7,25.5,1.0,0.9,38.2,6.8,16.5,11.2,0.20,1.5,0.25,0.18,2.8,1.9,0.38,0.35,0.82,2.3,20.2,2.9,3.5,1.6,1.9,0.22,0.008,2000000000000,4.8,6.2,0.4,2.8,16.5,14.5,20.2,6.8,1.2,7.5,0.92,0.92,0.92,0.06,0.18,16.5,0.88