예제 #1
0
파일: test_market.py 프로젝트: xg86/d3a
    def accept_offer(self,
                     offer_or_id,
                     buyer,
                     *,
                     energy=None,
                     time=None,
                     already_tracked=False,
                     trade_rate: float = None,
                     trade_bid_info=None,
                     buyer_origin=None):

        if isinstance(offer_or_id, Offer):
            offer_or_id = offer_or_id.id
        offer = self.offers.pop(offer_or_id, None)
        if offer is None:
            assert False

        self.calls_energy.append(energy)
        self.calls_offers.append(offer)

        if energy < offer.energy:
            residual_energy = offer.energy - energy
            residual = Offer('res', offer.price, residual_energy, offer.seller)
            traded = Offer(offer.id, offer.price, energy, offer.seller)
            return Trade('trade_id', time, traded, traded.seller, buyer,
                         residual)
        else:
            return Trade('trade_id', time, offer, offer.seller, buyer)
예제 #2
0
    def test_matching_list_affects_only_matches_after_start_index(self):
        matchings = [
            BidOfferMatch(offer=Offer('offer_id', 1, 1, 'S'),
                          offer_energy=1,
                          bid=Bid('bid_id', 1, 1, 'B', 'S'),
                          bid_energy=1),
            BidOfferMatch(offer=Offer('offer_id2', 2, 2, 'S'),
                          offer_energy=2,
                          bid=Bid('bid_id2', 2, 2, 'B', 'S'),
                          bid_energy=2),
            BidOfferMatch(offer=Offer('offer_id', 1, 1, 'S'),
                          offer_energy=1,
                          bid=Bid('bid_id', 1, 1, 'B', 'S'),
                          bid_energy=1)
        ]

        offer_trade = Trade('trade',
                            1,
                            Offer('offer_id', 1, 1, 'S'),
                            'S',
                            'B',
                            residual=Offer('residual_offer', 0.5, 0.5, 'S'))
        bid_trade = Trade('bid_trade',
                          1,
                          Bid('bid_id2', 1, 1, 'S', 'B'),
                          'S',
                          'B',
                          residual=Bid('residual_bid_2', 1, 1, 'S', 'B'))

        matchings = TwoSidedPayAsClear._replace_offers_bids_with_residual_in_matching_list(
            matchings, 1, offer_trade, bid_trade)
        assert len(matchings) == 3
        assert matchings[0].offer.id == 'offer_id'
        assert matchings[1].bid.id == 'residual_bid_2'
        assert matchings[2].offer.id == 'residual_offer'
예제 #3
0
    def test_matching_list_gets_updated_with_residual_offers(self):
        matchings = [
            BidOfferMatch(offer=Offer('offer_id', pendulum.now(), 1, 1, 'S'),
                          offer_energy=1,
                          bid=Bid('bid_id', pendulum.now(), 1, 1, 'B', 'S'),
                          bid_energy=1),
            BidOfferMatch(offer=Offer('offer_id2', pendulum.now(), 2, 2, 'S'),
                          offer_energy=2,
                          bid=Bid('bid_id2', pendulum.now(), 2, 2, 'B', 'S'),
                          bid_energy=2)
        ]

        offer_trade = Trade('trade',
                            1,
                            Offer('offer_id', pendulum.now(), 1, 1, 'S'),
                            'S',
                            'B',
                            residual=Offer('residual_offer', pendulum.now(),
                                           0.5, 0.5, 'S'))
        bid_trade = Trade('bid_trade',
                          1,
                          Bid('bid_id2', pendulum.now(), 1, 1, 'S', 'B'),
                          'S',
                          'B',
                          residual=Bid('residual_bid_2', pendulum.now(), 1, 1,
                                       'S', 'B'))

        matchings = TwoSidedPayAsClear._replace_offers_bids_with_residual_in_matching_list(
            matchings, 0, offer_trade, bid_trade)
        assert len(matchings) == 2
        assert matchings[0].offer.id == 'residual_offer'
        assert matchings[1].bid.id == 'residual_bid_2'
예제 #4
0
def test_energy_origin(storage_strategy_test15, market_test15):
    storage_strategy_test15.event_activate()
    assert len(storage_strategy_test15.state.get_used_storage_share) == 1
    assert storage_strategy_test15.state.get_used_storage_share[0] == EnergyOrigin(
        ESSEnergyOrigin.EXTERNAL, 15)
    storage_strategy_test15.area.current_market.trade = \
        Trade('id', 'time', Offer('id', 20, 1.0, 'ChildArea'), 'ChildArea', 'FakeArea')
    storage_strategy_test15.event_trade(market_id=market_test15.id,
                                        trade=storage_strategy_test15.area.current_market.trade)
    assert len(storage_strategy_test15.state.get_used_storage_share) == 2
    assert storage_strategy_test15.state.get_used_storage_share == [EnergyOrigin(
        ESSEnergyOrigin.EXTERNAL, 15), EnergyOrigin(ESSEnergyOrigin.LOCAL, 1)]

    storage_strategy_test15.area.current_market.trade = \
        Trade('id', 'time', Offer('id', 20, 2.0, 'FakeArea'), 'FakeArea', 'A')
    storage_strategy_test15.event_trade(market_id=market_test15.id,
                                        trade=storage_strategy_test15.area.current_market.trade)
    assert len(storage_strategy_test15.state.get_used_storage_share) == 2
    assert storage_strategy_test15.state.get_used_storage_share == [EnergyOrigin(
        ESSEnergyOrigin.EXTERNAL, 13), EnergyOrigin(ESSEnergyOrigin.LOCAL, 1)]

    storage_strategy_test15.area.current_market.trade = \
        Trade('id', 'time', Offer('id', 20, 1.0, 'ParentArea'), 'FakeArea', 'FakeArea')
    storage_strategy_test15.event_trade(market_id=market_test15.id,
                                        trade=storage_strategy_test15.area.current_market.trade)
    assert len(storage_strategy_test15.state.get_used_storage_share) == 3
    assert storage_strategy_test15.state.get_used_storage_share == [EnergyOrigin(
        ESSEnergyOrigin.EXTERNAL, 13), EnergyOrigin(ESSEnergyOrigin.LOCAL, 1),
        EnergyOrigin(ESSEnergyOrigin.EXTERNAL, 1)]
예제 #5
0
파일: test_market.py 프로젝트: xg86/d3a
    def accept_bid(self,
                   bid: Bid,
                   energy: float = None,
                   seller: str = None,
                   buyer: str = None,
                   already_tracked: bool = False,
                   trade_rate: float = None,
                   trade_offer_info=None,
                   time=None,
                   seller_origin=None):
        self.calls_energy_bids.append(energy)
        self.calls_bids.append(bid)
        self.calls_bids_price.append(bid.price)
        if trade_rate is None:
            trade_rate = bid.price / bid.energy
        else:
            assert trade_rate <= (bid.price / bid.energy)

        market_bid = [b for b in self.bids.values() if b.id == bid.id][0]
        if energy < market_bid.energy:
            residual_energy = bid.energy - energy
            residual = Bid('res', bid.price, residual_energy, bid.buyer,
                           seller)
            traded = Bid(bid.id, (trade_rate * energy), energy, bid.buyer,
                         seller)
            return Trade('trade_id', time, traded, traded.seller, bid.buyer,
                         residual)
        else:
            traded = Bid(bid.id, (trade_rate * energy), energy, bid.buyer,
                         seller)
            return Trade('trade_id', time, traded, traded.seller, bid.buyer)
예제 #6
0
    def accept_bid(self,
                   bid,
                   energy,
                   seller,
                   buyer=None,
                   *,
                   time=None,
                   trade_rate: float = None,
                   trade_offer_info=None,
                   already_tracked=False,
                   seller_origin=None,
                   seller_origin_id=None,
                   seller_id=None):
        self.calls_energy_bids.append(energy)
        self.calls_bids.append(bid)
        self.calls_bids_price.append(bid.price)
        if trade_rate is None:
            trade_rate = bid.energy_rate
        else:
            assert trade_rate <= bid.energy_rate

        market_bid = [b for b in self._bids if b.id == bid.id][0]
        if energy < market_bid.energy:
            residual_energy = bid.energy - energy
            residual = Bid('res',
                           bid.time,
                           bid.price,
                           residual_energy,
                           bid.buyer,
                           buyer_origin='res')
            traded = Bid(bid.id,
                         bid.time, (trade_rate * energy),
                         energy,
                         bid.buyer,
                         buyer_origin='res')
            return Trade('trade_id',
                         time,
                         traded,
                         seller,
                         bid.buyer,
                         residual,
                         buyer_origin=bid.buyer_origin,
                         seller_origin=seller_origin,
                         seller_id=seller_id)
        else:
            traded = Bid(bid.id,
                         bid.time, (trade_rate * energy),
                         energy,
                         bid.buyer,
                         buyer_origin=bid.id)
            return Trade('trade_id',
                         time,
                         traded,
                         seller,
                         bid.buyer,
                         buyer_origin=bid.buyer_origin,
                         seller_origin=seller_origin,
                         seller_id=seller_id)
예제 #7
0
 def accept_offer(self, offer, buyer, *, energy=None, time=None, price_drop=False):
     self.calls_energy.append(energy)
     self.calls_offers.append(offer)
     if energy < offer.energy:
         residual_energy = offer.energy - energy
         residual = Offer('res', offer.price, residual_energy, offer.seller, offer.market)
         traded = Offer(offer.id, offer.price, energy, offer.seller, offer.market)
         return Trade('trade_id', time, traded, traded.seller, buyer, residual)
     else:
         return Trade('trade_id', time, offer, offer.seller, buyer)
예제 #8
0
 def accept_bid(self, bid, energy, seller, buyer=None, already_tracked=True, *,
                time=None, price_drop=True):
     self.calls_energy_bids.append(energy)
     self.calls_bids.append(bid)
     self.calls_bids_price.append(bid.price)
     if energy < bid.energy:
         residual_energy = bid.energy - energy
         residual = Bid('res', bid.price, residual_energy, bid.buyer, seller, bid.market)
         traded = Bid(bid.id, bid.price, energy, bid.buyer, seller, bid.market)
         return Trade('trade_id', time, traded, traded.seller, bid.buyer, residual)
     else:
         return Trade('trade_id', time, bid, bid.seller, bid.buyer)
예제 #9
0
 def accept_offer(self, offer, buyer, *, energy=None, time=None, already_tracked=False,
                  trade_rate: float = None, trade_bid_info=None, buyer_origin=None):
     self.calls_energy.append(energy)
     self.calls_offers.append(offer)
     if energy < offer.energy:
         residual_energy = offer.energy - energy
         residual = Offer('res', offer.price, residual_energy, offer.seller,
                          seller_origin='res')
         traded = Offer(offer.id, offer.price, energy, offer.seller, seller_origin='res')
         return Trade('trade_id', time, traded, traded.seller, buyer, residual,
                      seller_origin=offer.seller_origin, buyer_origin=buyer_origin)
     else:
         return Trade('trade_id', time, offer, offer.seller, buyer,
                      seller_origin=offer.seller_origin, buyer_origin=buyer_origin)
def test_event_trade_after_offer_changed_partial_offer(area_test2, commercial_test2):
    original_offer = Offer(id="old_id", time=pendulum.now(),
                           price=20, energy=1, seller="FakeArea")
    accepted_offer = Offer(id="old_id", time=pendulum.now(),
                           price=15, energy=0.75, seller="FakeArea")
    residual_offer = Offer(id="res_id", time=pendulum.now(),
                           price=5, energy=0.25, seller="FakeArea")
    commercial_test2.offers.post(original_offer, area_test2.test_market.id)
    commercial_test2.event_offer_split(market_id=area_test2.test_market.id,
                                       original_offer=original_offer,
                                       accepted_offer=accepted_offer,
                                       residual_offer=residual_offer)
    assert original_offer.id in commercial_test2.offers.split
    assert commercial_test2.offers.split[original_offer.id] == accepted_offer
    commercial_test2.event_trade(market_id=area_test2.test_market.id,
                                 trade=Trade(id="id",
                                             time="time",
                                             offer_bid=original_offer,
                                             seller="FakeArea",
                                             buyer="buyer")
                                 )

    assert residual_offer in commercial_test2.offers.posted
    assert commercial_test2.offers.posted[residual_offer] == area_test2.test_market.id
    assert len(commercial_test2.offers.posted) == 1
    assert len(commercial_test2.offers.split) == 1
    assert len(commercial_test2.offers.sold) == 1
    assert original_offer in commercial_test2.offers.sold_in_market(area_test2.test_market.id)
예제 #11
0
def test_iaa_event_trade_bid_updates_forwarded_bids_on_partial(iaa_bid, called, partial):
    iaa_bid.lower_market.delete_bid = called
    low_to_high_engine = iaa_bid.engines[0]
    iaa_bid._get_market_from_market_id = lambda x: low_to_high_engine.markets.target
    if partial:
        accepted_bid = Bid(*low_to_high_engine.markets.target._bids[0])
        accepted_bid = \
            accepted_bid._replace(price=(accepted_bid.energy-0.2) *
                                        (accepted_bid.price/accepted_bid.energy),
                                  energy=accepted_bid.energy-0.2)
        partial_bid = Bid('1234', 12, 0.2, 'owner', 'someone_else')
        low_to_high_engine.event_bid_changed(market_id=low_to_high_engine.markets.target,
                                             existing_bid=accepted_bid,
                                             new_bid=partial_bid)
    else:
        accepted_bid = low_to_high_engine.markets.target._bids[0]
        partial_bid = False
    source_bid = list(low_to_high_engine.markets.source.bids.values())[0]
    target_bid = list(low_to_high_engine.markets.target.bids.values())[0]
    bidinfo = BidInfo(source_bid=source_bid, target_bid=target_bid)
    low_to_high_engine.forwarded_bids[source_bid.id] = bidinfo
    low_to_high_engine.forwarded_bids[target_bid.id] = bidinfo

    low_to_high_engine.event_bid_traded(
        bid_trade=Trade('trade_id',
                        pendulum.now(tz=TIME_ZONE),
                        accepted_bid,
                        seller='someone_else',
                        buyer='owner',
                        residual=partial_bid))

    assert source_bid.id not in low_to_high_engine.forwarded_bids
    assert target_bid.id not in low_to_high_engine.forwarded_bids
    if partial:
        assert partial_bid.id in low_to_high_engine.forwarded_bids
예제 #12
0
def test_iaa_event_trade_deletes_forwarded_offer_when_sold(iaa, called):
    iaa.lower_market.delete_offer = called
    iaa.event_trade(trade=Trade('trade_id', pendulum.now(tz=TIME_ZONE),
                                iaa.higher_market.offers['id3'], 'owner',
                                'someone_else'),
                    market_id=iaa.higher_market.id)
    assert len(iaa.lower_market.delete_offer.calls) == 1
    def test_publish_event_subscribes_to_response_and_publishes(self):
        offer = Offer("1", now(), 2, 3, "A")
        trade = Trade("2", now(), Offer("accepted", now(), 7, 8, "Z"), "B",
                      "C")
        new_offer = Offer("3", now(), 4, 5, "D")
        existing_offer = Offer("4", now(), 5, 6, "E")
        kwargs = {
            "offer": offer,
            "trade": trade,
            "new_offer": new_offer,
            "existing_offer": existing_offer
        }

        self.publisher.publish_event(MarketEvent.OFFER, **kwargs)
        self.publisher.redis.sub_to_channel.assert_called_once_with(
            "market/test_id/notify_event/response",
            self.publisher.response_callback)

        expected_result = {k: v.to_JSON_string() for k, v in kwargs.items()}
        self.publisher.redis.publish.assert_called_once()
        assert self.publisher.redis.publish.call_args_list[0][0][0] == \
            "market/test_id/notify_event"
        publish_call_args = json.loads(
            self.publisher.redis.publish.call_args_list[0][0][1])
        assert publish_call_args["event_type"] == MarketEvent.OFFER.value
        assert len(DeepDiff(publish_call_args["kwargs"], expected_result)) == 0
 def test_accept_bid_calls_market_method_and_publishes_response(self):
     bid = Bid("b_id", now(), 12, 13, "b_buyer", "b_seller")
     payload = {
         "data":
         json.dumps({
             "seller": "mykonos",
             "energy": 12,
             "bid": bid.to_JSON_string(),
             "transaction_uuid": "trans_id"
         })
     }
     trade = Trade(id="trade_id",
                   time=now(),
                   offer=bid,
                   seller="trade_seller",
                   buyer="trade_buyer")
     self.market.accept_bid = MagicMock(return_value=trade)
     self.subscriber._accept_bid(payload)
     self.subscriber.market.accept_bid.assert_called_once()
     self.subscriber.redis_db.publish.assert_called_once_with(
         "id/ACCEPT_BID/RESPONSE",
         json.dumps({
             "status": "ready",
             "trade": trade.to_JSON_string(),
             "transaction_uuid": "trans_id"
         }))
 def test_accept_offer_calls_market_method_and_publishes_response(self):
     offer = Offer("o_id", now(), 12, 13, "o_seller")
     payload = {
         "data":
         json.dumps({
             "buyer": "mykonos",
             "energy": 12,
             "offer_or_id": offer.to_JSON_string(),
             "transaction_uuid": "trans_id"
         })
     }
     trade = Trade(id="trade_id",
                   time=now(),
                   offer=offer,
                   seller="trade_seller",
                   buyer="trade_buyer")
     self.market.accept_offer = MagicMock(return_value=trade)
     self.subscriber._accept_offer(payload)
     sleep(0.01)
     self.subscriber.market.accept_offer.assert_called_once_with(
         offer_or_id=offer, buyer="mykonos", energy=12)
     self.subscriber.redis_db.publish.assert_called_once_with(
         "id/ACCEPT_OFFER/RESPONSE",
         json.dumps({
             "status": "ready",
             "trade": trade.to_JSON_string(),
             "transaction_uuid": "trans_id"
         }))
예제 #16
0
 def accept_offer(self, offer_or_id, buyer, *, energy=None, time=None, already_tracked=False,
                  trade_rate: float = None, trade_bid_info=None, buyer_origin=None):
     offer = offer_or_id
     trade = Trade('trade_id', time, offer, offer.seller, buyer,
                   seller_origin=offer.seller_origin, buyer_origin=buyer_origin)
     self.traded_offers.append(trade)
     return trade
예제 #17
0
def test_event_trade_after_offer_changed_partial_offer(area_test2, bus_test2):
    original_offer = Offer(id='old_id', price=20, energy=1, seller='FakeArea')
    accepted_offer = Offer(id='old_id',
                           price=15,
                           energy=0.75,
                           seller='FakeArea')
    residual_offer = Offer(id='res_id',
                           price=5,
                           energy=0.25,
                           seller='FakeArea')
    bus_test2.offers.post(original_offer, area_test2.test_market.id)
    bus_test2.event_offer_split(market_id=area_test2.test_market.id,
                                original_offer=original_offer,
                                accepted_offer=accepted_offer,
                                residual_offer=residual_offer)
    assert original_offer.id in bus_test2.offers.split
    assert bus_test2.offers.split[original_offer.id] == accepted_offer
    bus_test2.event_trade(market_id=area_test2.test_market.id,
                          trade=Trade(id='id',
                                      time='time',
                                      offer=original_offer,
                                      seller='FakeArea',
                                      buyer='buyer'))

    assert residual_offer in bus_test2.offers.posted
    assert bus_test2.offers.posted[residual_offer] == area_test2.test_market.id
    assert len(bus_test2.offers.posted) == 1
    assert len(bus_test2.offers.split) == 1
    assert len(bus_test2.offers.sold) == 1
    assert original_offer.id in bus_test2.offers.sold_in_market(
        area_test2.test_market.id)
def test_event_bid_traded_removes_bid_from_pending_if_energy_req_0(
        load_hours_strategy_test5, market_test2, called):
    ConstSettings.IAASettings.MARKET_TYPE = 2

    trade_market = load_hours_strategy_test5.area.next_market
    load_hours_strategy_test5.remove_bid_from_pending = called
    load_hours_strategy_test5.event_activate()
    load_hours_strategy_test5.area.markets = {TIME: trade_market}
    load_hours_strategy_test5.event_market_cycle()
    load_hours_strategy_test5.event_tick()
    bid = list(load_hours_strategy_test5._bids.values())[0][0]
    # Increase energy requirement to cover the energy from the bid + threshold
    load_hours_strategy_test5.energy_requirement_Wh[
        TIME] = bid.energy * 1000 + 0.000009
    trade = Trade('idt',
                  None,
                  bid,
                  'B',
                  load_hours_strategy_test5.owner.name,
                  residual=True)
    load_hours_strategy_test5.event_bid_traded(market_id=trade_market.id,
                                               bid_trade=trade)

    assert len(load_hours_strategy_test5.remove_bid_from_pending.calls) == 1
    assert load_hours_strategy_test5.remove_bid_from_pending.calls[0][0][
        0] == repr(bid.id)
    assert load_hours_strategy_test5.remove_bid_from_pending.calls[0][0][1] == \
        repr(trade_market.id)
예제 #19
0
 def test_publish_event_converts_python_objects_to_json(self):
     offer = Offer("1", now(), 2, 3, "A")
     trade = Trade("2", now(), Offer("accepted", now(), 7, 8, "Z"), "B",
                   "C")
     new_offer = Offer("3", now(), 4, 5, "D")
     existing_offer = Offer("4", now(), 5, 6, "E")
     kwargs = {
         "offer": offer,
         "trade": trade,
         "new_offer": new_offer,
         "existing_offer": existing_offer
     }
     for dispatcher in [
             self.area.dispatcher.market_event_dispatcher,
             self.device1.dispatcher.market_event_dispatcher,
             self.device2.dispatcher.market_event_dispatcher
     ]:
         dispatcher.publish_event(dispatcher.area.uuid, MarketEvent.OFFER,
                                  **kwargs)
         assert dispatcher.redis.publish.call_count == 1
         payload = json.loads(
             dispatcher.redis.publish.call_args_list[0][0][1])
         assert isinstance(payload["kwargs"]["offer"], str)
         assert offer_from_JSON_string(payload["kwargs"]["offer"],
                                       offer.time) == offer
         assert isinstance(payload["kwargs"]["trade"], str)
         assert trade_from_JSON_string(payload["kwargs"]["trade"],
                                       trade.time) == trade
         assert isinstance(payload["kwargs"]["new_offer"], str)
         assert offer_from_JSON_string(payload["kwargs"]["new_offer"],
                                       new_offer.time) == new_offer
         assert isinstance(payload["kwargs"]["existing_offer"], str)
         assert offer_from_JSON_string(payload["kwargs"]["existing_offer"],
                                       existing_offer.time) == \
             existing_offer
예제 #20
0
 def accept_offer(self,
                  offer_or_id,
                  *,
                  buyer="",
                  energy=None,
                  time=None,
                  already_tracked=False,
                  trade_rate: float = None,
                  trade_bid_info=None,
                  buyer_origin=None,
                  buyer_origin_id=None,
                  buyer_id=None):
     offer = offer_or_id
     if self.raises:
         raise MarketException
     else:
         if energy is None:
             energy = offer.energy
         offer.energy = energy
         return Trade('trade',
                      0,
                      offer,
                      offer.seller,
                      'FakeOwner',
                      seller_origin=offer.seller_origin,
                      buyer_origin=buyer_origin,
                      buyer_origin_id=buyer_origin_id,
                      buyer_id=buyer_id)
예제 #21
0
def test_balancing_offers_are_created_if_device_in_registry(
        balancing_fixture, area_test2):
    DeviceRegistry.REGISTRY = {'FakeArea': (30, 40)}
    balancing_fixture.event_activate()
    balancing_fixture.event_market_cycle()
    balancing_fixture.event_balancing_market_cycle()
    expected_balancing_demand_energy = \
        balancing_fixture.balancing_energy_ratio.demand * \
        balancing_fixture.energy_per_slot_Wh
    actual_balancing_demand_energy = \
        area_test2.test_balancing_market.created_balancing_offers[0].energy
    assert len(area_test2.test_balancing_market.created_balancing_offers) == 1
    assert actual_balancing_demand_energy == -expected_balancing_demand_energy
    actual_balancing_demand_price = \
        area_test2.test_balancing_market.created_balancing_offers[0].price

    assert actual_balancing_demand_price == expected_balancing_demand_energy * 30
    selected_offer = area_test2.current_market.sorted_offers[0]
    balancing_fixture.event_trade(market_id=area_test2.current_market.id,
                                  trade=Trade(id='id',
                                              time=area_test2.now,
                                              offer=selected_offer,
                                              seller='B',
                                              buyer='FakeArea'))
    assert len(area_test2.test_balancing_market.created_balancing_offers) == 2
    actual_balancing_supply_energy = \
        area_test2.test_balancing_market.created_balancing_offers[1].energy
    expected_balancing_supply_energy = \
        selected_offer.energy * balancing_fixture.balancing_energy_ratio.supply
    assert actual_balancing_supply_energy == expected_balancing_supply_energy
    actual_balancing_supply_price = \
        area_test2.test_balancing_market.created_balancing_offers[1].price
    assert actual_balancing_supply_price == expected_balancing_supply_energy * 40
    DeviceRegistry.REGISTRY = {}
def test_event_trade_after_offer_changed_partial_offer(area_test2,
                                                       commercial_test2):
    existing_offer = Offer(id='old_id', price=20, energy=1, seller='FakeArea')
    new_offer = Offer(id='new_id', price=15, energy=0.75, seller='FakeArea')

    commercial_test2.offers.post(existing_offer, area_test2.test_market)
    commercial_test2.offers.post(new_offer, area_test2.test_market)
    commercial_test2.event_offer_changed(market_id=area_test2.test_market.id,
                                         existing_offer=existing_offer,
                                         new_offer=new_offer)
    assert existing_offer.id in commercial_test2.offers.changed
    assert commercial_test2.offers.changed[existing_offer.id] == new_offer
    commercial_test2.event_trade(market_id=area_test2.test_market.id,
                                 trade=Trade(id='id',
                                             time='time',
                                             offer=existing_offer,
                                             seller='FakeArea',
                                             buyer='buyer'))

    assert len(commercial_test2.offers.posted) == 2
    assert new_offer in commercial_test2.offers.posted
    assert commercial_test2.offers.posted[new_offer] == area_test2.test_market
    assert len(commercial_test2.offers.changed) == 0
    assert len(commercial_test2.offers.sold) == 1
    assert existing_offer.id in commercial_test2.offers.sold[
        area_test2.test_market]
예제 #23
0
def test_event_bid_traded_does_not_remove_bid_for_partial_trade(load_hours_strategy_test5,
                                                                called,
                                                                partial):
    ConstSettings.IAASettings.MARKET_TYPE = 2

    trade_market = load_hours_strategy_test5.area.next_market
    load_hours_strategy_test5.remove_bid_from_pending = called
    load_hours_strategy_test5.event_activate()
    load_hours_strategy_test5.area.markets = {TIME: trade_market}
    load_hours_strategy_test5.event_market_cycle()
    load_hours_strategy_test5.event_tick(area=area_test2)
    # Get the bid that was posted on event_market_cycle
    bid = list(load_hours_strategy_test5._bids.values())[0][0]

    # Increase energy requirement to cover the energy from the bid
    load_hours_strategy_test5.energy_requirement_Wh[TIME] = 1000
    trade = Trade('idt', None, bid, 'B', load_hours_strategy_test5.owner.name, residual=partial)
    load_hours_strategy_test5.event_bid_traded(market_id=trade_market.id, bid_trade=trade)

    if not partial:
        assert len(load_hours_strategy_test5.remove_bid_from_pending.calls) == 1
        assert load_hours_strategy_test5.remove_bid_from_pending.calls[0][0][0] == repr(bid.id)
        assert load_hours_strategy_test5.remove_bid_from_pending.calls[0][0][1] == \
            repr(trade_market)
    else:
        assert len(load_hours_strategy_test5.remove_bid_from_pending.calls) == 0
        assert load_hours_strategy_test5.get_posted_bids(trade_market) == [bid]

    ConstSettings.IAASettings.MARKET_TYPE = 1
예제 #24
0
 def test_dispatch_event_trade_to_external_agent(self, strategy):
     strategy._track_energy_sell_type = lambda _: None
     self._create_and_activate_strategy_area(strategy)
     market = self.area.get_future_market_from_id(1)
     self.area._markets.markets = {1: market}
     strategy.state.available_energy_kWh = {market.time_slot: 1000.0}
     strategy.state.pledged_sell_kWh = {market.time_slot: 0.0}
     strategy.state.offered_sell_kWh = {market.time_slot: 0.0}
     current_time = now()
     trade = Trade('id',
                   current_time,
                   Offer('offer_id', now(), 20, 1.0, 'test_area'),
                   'test_area',
                   'parent_area',
                   fee_price=0.23)
     strategy.event_trade(market_id="test_market", trade=trade)
     assert strategy.redis.publish_json.call_args_list[0][0][
         0] == "test_area/events/trade"
     call_args = strategy.redis.publish_json.call_args_list[0][0][1]
     assert call_args['trade_id'] == trade.id
     assert call_args['event'] == "trade"
     assert call_args['price'] == 20
     assert call_args['energy'] == 1.0
     assert call_args['fee_price'] == 0.23
     assert call_args['offer_id'] == trade.offer.id
     assert call_args['residual_id'] == "None"
     assert call_args['time'] == current_time.isoformat()
     assert call_args['seller'] == trade.seller
     assert call_args['buyer'] == "anonymous"
     assert call_args['device_info'] == strategy._device_info_dict
예제 #25
0
def test_baa_event_trade(baa):
    trade = Trade('trade_id', baa.lower_market.time_slot,
                  Offer('A', 2, 2, 'B'), 'someone_else', 'IAA owner')
    fake_spot_market = FakeMarket(15)
    fake_spot_market.set_time_slot(baa.lower_market.time_slot)
    baa.event_trade(trade=trade, market_id=fake_spot_market.id)
    assert baa.lower_market.unmatched_energy_upward == 0
    assert baa.lower_market.unmatched_energy_downward == 0
예제 #26
0
def testing_event_trade(area_test3, pv_test4):
    pv_test4.event_trade(market_id=area_test3.test_market.id,
                         trade=Trade(id='id', time='time',
                                     offer=Offer(id='id', price=20, energy=1, seller='FakeArea'),
                                     seller=area_test3, buyer='buyer'
                                     )
                         )
    assert len(pv_test4.offers.open) == 0
예제 #27
0
def test_iaa_event_trade_bid_deletes_forwarded_bid_when_sold(iaa_bid, called):
    iaa_bid.lower_market.delete_bid = called
    iaa_bid.event_bid_traded(bid_trade=Trade('trade_id',
                                             pendulum.now(tz=TIME_ZONE),
                                             iaa_bid.higher_market.bids['id3'],
                                             'someone_else', 'owner'),
                             market_id=iaa_bid.higher_market.id)
    assert len(iaa_bid.lower_market.delete_bid.calls) == 1
예제 #28
0
def test_assert_if_trade_rate_is_lower_than_offer_rate(pv_test11):
    market_id = "market_id"
    pv_test11.offers.sold[market_id] = [Offer("offer_id", pendulum.now(), 30, 1, "FakeArea")]
    to_cheap_offer = Offer("offer_id", pendulum.now(), 29, 1, "FakeArea")
    trade = Trade("trade_id", "time", to_cheap_offer, pv_test11, "buyer")

    with pytest.raises(AssertionError):
        pv_test11.event_trade(market_id=market_id, trade=trade)
예제 #29
0
def _trade(price, buyer, energy=1, seller=None, fee_price=None):
    return Trade('id',
                 0,
                 FakeOffer(price, energy, seller),
                 seller,
                 buyer,
                 None,
                 fee_price=fee_price)
예제 #30
0
def test_iaa_event_trade_buys_accepted_offer(iaa2):
    iaa2.event_trade(trade=Trade('trade_id',
                                 pendulum.now(tz=TIME_ZONE),
                                 iaa2.higher_market.forwarded_offer,
                                 'owner',
                                 'someone_else'),
                     market_id=iaa2.higher_market.id)
    assert len(iaa2.lower_market.calls_energy) == 1