test_utils.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from datetime import timedelta
  2. from flexmeasures import Asset, AssetType, Account, Sensor
  3. from flexmeasures.data.models.generic_assets import GenericAsset
  4. from flexmeasures.ui.utils.breadcrumb_utils import get_ancestry
  5. from timely_beliefs.sensors.func_store.knowledge_horizons import x_days_ago_at_y_oclock
  6. def test_get_ancestry(app, db):
  7. account = Account(name="Test Account")
  8. asset_type = AssetType(name="TestAssetType")
  9. parent_asset = Asset(name="Parent", generic_asset_type=asset_type, owner=account)
  10. assets = [parent_asset]
  11. for i in range(4):
  12. child_asset = Asset(
  13. name=f"Child {i}",
  14. generic_asset_type=asset_type,
  15. owner=account,
  16. parent_asset=parent_asset,
  17. )
  18. assets.append(child_asset)
  19. parent_asset = child_asset
  20. sensor = Sensor(name="Test Sensor", generic_asset=child_asset)
  21. db.session.add_all([account, asset_type, sensor] + assets)
  22. db.session.commit()
  23. # ancestry of a public account
  24. assert get_ancestry(None) == [{"url": None, "name": "PUBLIC", "type": "Account"}]
  25. # ancestry of an account
  26. account_id = account.id
  27. assert get_ancestry(account) == [
  28. {"url": f"/accounts/{account_id}", "name": "Test Account", "type": "Account"}
  29. ]
  30. # ancestry of a parentless asset
  31. assert get_ancestry(assets[0]) == [
  32. {"url": f"/accounts/{account_id}", "name": "Test Account", "type": "Account"},
  33. {"url": f"/assets/{assets[0].id}", "name": "Parent", "type": "Asset"},
  34. ]
  35. # check that the number of elements of the ancestry of each assets corresponds to 2 + levels
  36. for i, asset in enumerate(assets):
  37. assert len(get_ancestry(asset)) == i + 2
  38. # ancestry of the sensor
  39. sensor_ancestry = get_ancestry(sensor)
  40. assert sensor_ancestry[-1]["type"] == "Sensor"
  41. assert sensor_ancestry[0]["type"] == "Account"
  42. assert all(b["type"] == "Asset" for b in sensor_ancestry[1:-1])
  43. class NewAsset:
  44. def __init__(self, db, setup_generic_asset_types, setup_accounts, new_asset_data):
  45. self.db = db
  46. self.setup_generic_asset_types = setup_generic_asset_types
  47. self.setup_accounts = setup_accounts
  48. self.new_asset_data = new_asset_data
  49. self.test_battery = None
  50. self.price_sensor = None
  51. def __enter__(self):
  52. if not self.new_asset_data:
  53. return self
  54. owner = (
  55. self.setup_accounts["Prosumer"]
  56. if self.new_asset_data.get("set_account")
  57. else None
  58. )
  59. self.test_battery = GenericAsset(
  60. name=self.new_asset_data["asset_name"],
  61. generic_asset_type=self.setup_generic_asset_types["battery"],
  62. owner=owner,
  63. attributes={"some-attribute": "some-value", "sensors_to_show": [1, 2]},
  64. )
  65. self.db.session.add(self.test_battery)
  66. self.db.session.flush()
  67. unit = self.new_asset_data.get("sensor_unit", "EUR/MWh")
  68. self.price_sensor = Sensor(
  69. name=self.new_asset_data["sensor_name"],
  70. generic_asset=self.test_battery,
  71. event_resolution=timedelta(hours=1),
  72. unit=unit,
  73. knowledge_horizon=(
  74. x_days_ago_at_y_oclock,
  75. {"x": 1, "y": 12, "z": "Europe/Paris"},
  76. ),
  77. attributes=dict(
  78. daily_seasonality=True,
  79. weekly_seasonality=True,
  80. yearly_seasonality=True,
  81. ),
  82. )
  83. self.db.session.add(self.price_sensor)
  84. self.db.session.flush()
  85. self.db.session.commit()
  86. return self
  87. def __exit__(self, exc_type, exc_val, exc_tb):
  88. if not self.new_asset_data:
  89. return
  90. # Delete price_sensor and test_battery
  91. self.db.session.delete(self.price_sensor)
  92. self.db.session.delete(self.test_battery)
  93. self.db.session.commit()