conftest.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. import pytest
  2. from datetime import datetime, timedelta
  3. from pytz import utc
  4. from flexmeasures import Account
  5. from flexmeasures.data.models.data_sources import DataSource
  6. from flexmeasures.data.models.generic_assets import GenericAsset, GenericAssetType
  7. from flexmeasures.data.models.time_series import Sensor, TimedBelief
  8. @pytest.fixture(scope="function")
  9. @pytest.mark.skip_github
  10. def setup_dummy_asset(fresh_db, app):
  11. """
  12. Create an Asset to add sensors to and return the id.
  13. """
  14. db = fresh_db
  15. dummy_asset_type = GenericAssetType(name="DummyGenericAssetType")
  16. db.session.add(dummy_asset_type)
  17. dummy_asset = GenericAsset(
  18. name="DummyGenericAsset", generic_asset_type=dummy_asset_type
  19. )
  20. db.session.add(dummy_asset)
  21. db.session.commit()
  22. return dummy_asset.id
  23. @pytest.fixture(scope="function")
  24. @pytest.mark.skip_github
  25. def setup_dummy_data(fresh_db, app, setup_dummy_asset):
  26. """
  27. Create an asset with two sensors (1 and 2), and add the same set of 200 beliefs with an hourly resolution to each of them.
  28. Return the two sensors and a result sensor (which has no data).
  29. """
  30. db = fresh_db
  31. report_asset_type = GenericAssetType(name="ReportAssetType")
  32. db.session.add(report_asset_type)
  33. pandas_report = GenericAsset(
  34. name="PandasReport", generic_asset_type=report_asset_type
  35. )
  36. db.session.add(pandas_report)
  37. dummy_asset = db.session.get(GenericAsset, setup_dummy_asset)
  38. sensor1 = Sensor(
  39. "sensor 1", generic_asset=dummy_asset, event_resolution=timedelta(hours=1)
  40. )
  41. db.session.add(sensor1)
  42. sensor2 = Sensor(
  43. "sensor 2", generic_asset=dummy_asset, event_resolution=timedelta(hours=1)
  44. )
  45. db.session.add(sensor2)
  46. report_sensor = Sensor(
  47. "report sensor",
  48. generic_asset=pandas_report,
  49. event_resolution=timedelta(hours=2),
  50. )
  51. db.session.add(report_sensor)
  52. report_sensor_2 = Sensor(
  53. "report sensor 2",
  54. generic_asset=pandas_report,
  55. event_resolution=timedelta(hours=2),
  56. )
  57. db.session.add(report_sensor_2)
  58. # Create 1 DataSources
  59. source = DataSource("source1")
  60. # Create TimedBeliefs
  61. beliefs = []
  62. for sensor in [sensor1, sensor2]:
  63. for t in range(200):
  64. beliefs.append(
  65. TimedBelief(
  66. event_start=datetime(2023, 4, 10, tzinfo=utc) + timedelta(hours=t),
  67. belief_time=datetime(2023, 4, 9, tzinfo=utc),
  68. event_value=t,
  69. sensor=sensor,
  70. source=source,
  71. )
  72. )
  73. db.session.add_all(beliefs)
  74. db.session.commit()
  75. yield sensor1.id, sensor2.id, report_sensor.id, report_sensor_2.id
  76. @pytest.mark.skip_github
  77. @pytest.fixture(scope="function")
  78. def process_power_sensor(
  79. fresh_db,
  80. app,
  81. ):
  82. """
  83. Create an asset of type "process", power sensor to hold the result of
  84. the scheduler and price data consisting of 8 expensive hours, 8 cheap hours, and again 8 expensive hours-
  85. """
  86. db = fresh_db
  87. process_asset_type = GenericAssetType(name="process")
  88. db.session.add(process_asset_type)
  89. process_asset = GenericAsset(
  90. name="Test Process Asset", generic_asset_type=process_asset_type
  91. )
  92. db.session.add(process_asset)
  93. power_sensor = Sensor(
  94. "power",
  95. generic_asset=process_asset,
  96. event_resolution=timedelta(hours=1),
  97. unit="MW",
  98. )
  99. db.session.add(power_sensor)
  100. db.session.commit()
  101. yield power_sensor.id
  102. @pytest.mark.skip_github
  103. @pytest.fixture(scope="function")
  104. def storage_schedule_sensors(
  105. fresh_db,
  106. app,
  107. ):
  108. """
  109. Fixture to set up sensors for storage schedule testing, including power limit and efficiency sensors.
  110. """
  111. start = datetime(2014, 12, 31, 23, 0, 0, tzinfo=utc)
  112. db = fresh_db
  113. data_storage_type = GenericAssetType(name="data storage")
  114. db.session.add(data_storage_type)
  115. data_storage = GenericAsset(
  116. name="Data Storage", generic_asset_type=data_storage_type
  117. )
  118. db.session.add(data_storage)
  119. beliefs = []
  120. # generic power sensor to store power limit
  121. power_capacity = Sensor(
  122. "power",
  123. generic_asset=data_storage,
  124. event_resolution=timedelta(hours=1),
  125. unit="MW",
  126. )
  127. db.session.add(power_capacity)
  128. source = DataSource("source1")
  129. for h in range(24):
  130. beliefs.append(
  131. TimedBelief(
  132. event_start=start + timedelta(hours=h),
  133. belief_time=start,
  134. event_value=0.6,
  135. sensor=power_capacity,
  136. source=source,
  137. )
  138. )
  139. # efficiency sensor
  140. storage_efficiency = Sensor(
  141. "storage_efficiency",
  142. generic_asset=data_storage,
  143. event_resolution=timedelta(minutes=15),
  144. unit="%",
  145. )
  146. db.session.add(storage_efficiency)
  147. for h in range(24 * 4):
  148. beliefs.append(
  149. TimedBelief(
  150. event_start=start + timedelta(hours=h),
  151. belief_time=start,
  152. event_value=90,
  153. sensor=storage_efficiency,
  154. source=source,
  155. )
  156. )
  157. db.session.add_all(beliefs)
  158. db.session.commit()
  159. db.session.commit()
  160. yield power_capacity.id, storage_efficiency.id
  161. @pytest.fixture(scope="module")
  162. def add_asset_with_children(db, setup_accounts):
  163. assets_dict = {}
  164. parent_type = GenericAssetType(
  165. name="parent",
  166. )
  167. child_type = GenericAssetType(name="child")
  168. for account_name in ["Supplier", "Dummy"]:
  169. account_id = setup_accounts[account_name].id
  170. db.session.add_all([parent_type, child_type])
  171. parent = GenericAsset(
  172. name="parent",
  173. generic_asset_type=parent_type,
  174. account_id=account_id,
  175. )
  176. db.session.add(parent)
  177. db.session.flush() # assign parent asset id
  178. assets = [
  179. GenericAsset(
  180. name=f"child_{i}",
  181. generic_asset_type=child_type,
  182. parent_asset_id=parent.id,
  183. account_id=account_id,
  184. )
  185. for i in range(1, 3)
  186. ]
  187. db.session.add_all(assets)
  188. db.session.flush() # assign children asset ids
  189. assets.append(parent)
  190. # add a sensor with the same name to the parent and children
  191. for asset in assets:
  192. sensor = Sensor(name="power", generic_asset=asset)
  193. db.session.add(sensor)
  194. db.session.flush()
  195. assets_dict[account_name] = {a.name: a for a in assets}
  196. return assets_dict
  197. @pytest.fixture(scope="module")
  198. def add_alternative_account(app, db):
  199. alternative_account = Account(name="Alternative Account")
  200. db.session.add(alternative_account)
  201. return alternative_account