private static void sell(final PowerTenant tenant, final SellStrategy strategy) { final Select sellable = new Select() .equalsPlain("onSmp", "CAN_BE_OFFERED_ONLY") .equals("status", "ACTIVE"); // this is how Zonky queries for this final Set<Investment> marketplace = tenant.call(zonky -> zonky.getInvestments(sellable)) .parallel() .collect(Collectors.toSet()); final SessionState<Investment> sold = new SessionState<>(tenant, marketplace, Investment::getLoanId, "soldInvestments"); final Set<InvestmentDescriptor> eligible = marketplace.stream() .filter(i -> !sold.contains(i)) // to make dry run function properly .map(i -> getDescriptor(i, tenant)) .collect(Collectors.toSet()); final PortfolioOverview overview = tenant.getPortfolio().getOverview(); tenant.fire(sellingStartedLazy(() -> EventFactory.sellingStarted(eligible, overview))); final Collection<Investment> investmentsSold = strategy.recommend(eligible, overview) .peek(r -> tenant.fire(EventFactory.saleRecommended(r))) .map(r -> processSale(tenant, r, sold)) .flatMap(o -> o.map(Stream::of).orElse(Stream.empty())) .collect(Collectors.toSet()); tenant.fire(sellingCompletedLazy(() -> EventFactory.sellingCompleted(investmentsSold, tenant.getPortfolio().getOverview()))); }
@Test void noLoansApplicable() { final ParsedStrategy p = spy(new ParsedStrategy(DefaultPortfolio.PROGRESSIVE)); doReturn(Stream.empty()).when(p).getApplicableInvestments(any()); final SellStrategy s = new NaturalLanguageSellStrategy(p); final PortfolioOverview portfolio = mock(PortfolioOverview.class); final Stream<RecommendedInvestment> result = s.recommend(Collections.singletonList(mockDescriptor()), portfolio); assertThat(result).isEmpty(); }
@Test void someLoansApplicable() { final ParsedStrategy p = spy(new ParsedStrategy(DefaultPortfolio.PROGRESSIVE)); doAnswer(e -> { final Collection<InvestmentDescriptor> i = e.getArgument(0); return i.stream(); }).when(p).getApplicableInvestments(any()); final SellStrategy s = new NaturalLanguageSellStrategy(p); final PortfolioOverview portfolio = mock(PortfolioOverview.class); final Stream<RecommendedInvestment> result = s.recommend(Collections.singletonList(mockDescriptor()), portfolio); assertThat(result).hasSize(1); } }
private static void sell(final PowerTenant tenant, final SellStrategy strategy) { final Select sellable = new Select() .equalsPlain("onSmp", "CAN_BE_OFFERED_ONLY") .equals("status", "ACTIVE"); // this is how Zonky queries for this final Set<Investment> marketplace = tenant.call(zonky -> zonky.getInvestments(sellable)) .parallel() .collect(Collectors.toSet()); final SessionState<Investment> sold = new SessionState<>(tenant, marketplace, Investment::getLoanId, "soldInvestments"); final Set<InvestmentDescriptor> eligible = marketplace.stream() .filter(i -> !sold.contains(i)) // to make dry run function properly .map(i -> getDescriptor(i, tenant)) .collect(Collectors.toSet()); final PortfolioOverview overview = tenant.getPortfolio().getOverview(); tenant.fire(sellingStartedLazy(() -> EventFactory.sellingStarted(eligible, overview))); final Collection<Investment> investmentsSold = strategy.recommend(eligible, overview) .peek(r -> tenant.fire(EventFactory.saleRecommended(r))) .map(r -> processSale(tenant, r, sold)) .flatMap(o -> o.map(Stream::of).orElse(Stream.empty())) .collect(Collectors.toSet()); tenant.fire(sellingCompletedLazy(() -> EventFactory.sellingCompleted(investmentsSold, tenant.getPortfolio().getOverview()))); }