mirror of
				https://github.com/Akkudoktor-EOS/EOS.git
				synced 2025-10-30 22:36:21 +00:00 
			
		
		
		
	
		
			
	
	
		
			211 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			211 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import json | ||
|  | import os | ||
|  | import signal | ||
|  | import time | ||
|  | from http import HTTPStatus | ||
|  | from pathlib import Path | ||
|  | 
 | ||
|  | import pytest | ||
|  | import requests | ||
|  | 
 | ||
|  | DIR_TESTDATA = Path(__file__).absolute().parent.joinpath("testdata") | ||
|  | 
 | ||
|  | FILE_TESTDATA_EOSSERVER_CONFIG_1 = DIR_TESTDATA.joinpath("eosserver_config_1.json") | ||
|  | 
 | ||
|  | 
 | ||
|  | class TestSystem: | ||
|  |     def test_prediction_brightsky(self, server_setup_for_class, is_system_test): | ||
|  |         """Test weather prediction by BrightSky.""" | ||
|  |         server = server_setup_for_class["server"] | ||
|  |         eos_dir = server_setup_for_class["eos_dir"] | ||
|  | 
 | ||
|  |         result = requests.get(f"{server}/v1/config", timeout=2) | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |         # Get testing config | ||
|  |         config_json = result.json() | ||
|  |         config_folder_path = Path(config_json["general"]["config_folder_path"]) | ||
|  |         # Assure we are working in test environment | ||
|  |         assert str(config_folder_path).startswith(eos_dir) | ||
|  | 
 | ||
|  |         result = requests.put(f"{server}/v1/config/weather/provider", json="BrightSky") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |         # Assure prediction is enabled | ||
|  |         result = requests.get(f"{server}/v1/prediction/providers?enabled=true") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  |         providers = result.json() | ||
|  |         assert "BrightSky" in providers | ||
|  | 
 | ||
|  |         if is_system_test: | ||
|  |             result = requests.post(f"{server}/v1/prediction/update/BrightSky") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             result = requests.get(f"{server}/v1/prediction/series?key=weather_temp_air") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             data = result.json() | ||
|  |             assert len(data["data"]) > 24 | ||
|  | 
 | ||
|  |         else: | ||
|  |             pass | ||
|  | 
 | ||
|  |     def test_prediction_clearoutside(self, server_setup_for_class, is_system_test): | ||
|  |         """Test weather prediction by ClearOutside.""" | ||
|  |         server = server_setup_for_class["server"] | ||
|  |         eos_dir = server_setup_for_class["eos_dir"] | ||
|  | 
 | ||
|  |         result = requests.put(f"{server}/v1/config/weather/provider", json="ClearOutside") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |         # Assure prediction is enabled | ||
|  |         result = requests.get(f"{server}/v1/prediction/providers?enabled=true") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  |         providers = result.json() | ||
|  |         assert "ClearOutside" in providers | ||
|  | 
 | ||
|  |         if is_system_test: | ||
|  |             result = requests.post(f"{server}/v1/prediction/update/ClearOutside") | ||
|  |             assert result.status_code == HTTPStatus.OK, f"Failed: {result.headers} {result.text}" | ||
|  | 
 | ||
|  |             result = requests.get(f"{server}/v1/prediction/series?key=weather_temp_air") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             data = result.json() | ||
|  |             assert len(data["data"]) > 24 | ||
|  | 
 | ||
|  |         else: | ||
|  |             pass | ||
|  | 
 | ||
|  |     def test_prediction_pvforecastakkudoktor(self, server_setup_for_class, is_system_test): | ||
|  |         """Test PV prediction by PVForecastAkkudoktor.""" | ||
|  |         server = server_setup_for_class["server"] | ||
|  |         eos_dir = server_setup_for_class["eos_dir"] | ||
|  | 
 | ||
|  |         # Reset config | ||
|  |         with FILE_TESTDATA_EOSSERVER_CONFIG_1.open("r", encoding="utf-8", newline=None) as fd: | ||
|  |             config = json.load(fd) | ||
|  |         config["pvforecast"]["provider"] = "PVForecastAkkudoktor" | ||
|  |         result = requests.put(f"{server}/v1/config", json=config) | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |         # Assure prediction is enabled | ||
|  |         result = requests.get(f"{server}/v1/prediction/providers?enabled=true") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  |         providers = result.json() | ||
|  |         assert "PVForecastAkkudoktor" in providers | ||
|  | 
 | ||
|  |         if is_system_test: | ||
|  |             result = requests.post(f"{server}/v1/prediction/update/PVForecastAkkudoktor") | ||
|  |             assert result.status_code == HTTPStatus.OK, f"Failed: {result.headers} {result.text}" | ||
|  | 
 | ||
|  |             result = requests.get(f"{server}/v1/prediction/series?key=pvforecast_ac_power") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             data = result.json() | ||
|  |             assert len(data["data"]) > 24 | ||
|  | 
 | ||
|  |         else: | ||
|  |             pass | ||
|  | 
 | ||
|  |     def test_prediction_elecpriceakkudoktor(self, server_setup_for_class, is_system_test): | ||
|  |         """Test electricity price prediction by ElecPriceImport.""" | ||
|  |         server = server_setup_for_class["server"] | ||
|  |         eos_dir = server_setup_for_class["eos_dir"] | ||
|  | 
 | ||
|  |         # Reset config | ||
|  |         with FILE_TESTDATA_EOSSERVER_CONFIG_1.open("r", encoding="utf-8", newline=None) as fd: | ||
|  |             config = json.load(fd) | ||
|  |         config["elecprice"]["provider"] = "ElecPriceAkkudoktor" | ||
|  |         result = requests.put(f"{server}/v1/config", json=config) | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |         # Assure prediction is enabled | ||
|  |         result = requests.get(f"{server}/v1/prediction/providers?enabled=true") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  |         providers = result.json() | ||
|  |         assert "ElecPriceAkkudoktor" in providers | ||
|  | 
 | ||
|  |         if is_system_test: | ||
|  |             result = requests.post(f"{server}/v1/prediction/update/ElecPriceAkkudoktor") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             result = requests.get(f"{server}/v1/prediction/series?key=elecprice_marketprice_wh") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             data = result.json() | ||
|  |             assert len(data["data"]) > 24 | ||
|  | 
 | ||
|  |         else: | ||
|  |             pass | ||
|  | 
 | ||
|  |     def test_prediction_loadakkudoktor(self, server_setup_for_class, is_system_test): | ||
|  |         """Test load prediction by LoadAkkudoktor.""" | ||
|  |         server = server_setup_for_class["server"] | ||
|  |         eos_dir = server_setup_for_class["eos_dir"] | ||
|  | 
 | ||
|  |         result = requests.put(f"{server}/v1/config/load/provider", json="LoadAkkudoktor") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |         # Assure prediction is enabled | ||
|  |         result = requests.get(f"{server}/v1/prediction/providers?enabled=true") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  |         providers = result.json() | ||
|  |         assert "LoadAkkudoktor" in providers | ||
|  | 
 | ||
|  |         if is_system_test: | ||
|  |             result = requests.post(f"{server}/v1/prediction/update/LoadAkkudoktor") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             result = requests.get(f"{server}/v1/prediction/series?key=load_mean") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  | 
 | ||
|  |             data = result.json() | ||
|  |             assert len(data["data"]) > 24 | ||
|  | 
 | ||
|  |         else: | ||
|  |             pass | ||
|  | 
 | ||
|  |     def test_admin_cache(self, server_setup_for_class, is_system_test): | ||
|  |         """Test whether cache is reconstructed from cached files.""" | ||
|  |         server = server_setup_for_class["server"] | ||
|  |         eos_dir = server_setup_for_class["eos_dir"] | ||
|  | 
 | ||
|  |         result = requests.get(f"{server}/v1/admin/cache") | ||
|  |         assert result.status_code == HTTPStatus.OK | ||
|  |         cache = result.json() | ||
|  | 
 | ||
|  |         if is_system_test: | ||
|  |             # There should be some cache data | ||
|  |             assert cache != {} | ||
|  | 
 | ||
|  |             # Save cache | ||
|  |             result = requests.post(f"{server}/v1/admin/cache/save") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  |             cache_saved = result.json() | ||
|  |             assert cache_saved == cache | ||
|  | 
 | ||
|  |             # Clear expired cache - should clear nothing as all cache files expire in the future | ||
|  |             result = requests.post(f"{server}/v1/admin/cache/clear-expired") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  |             cache_cleared = result.json() | ||
|  |             assert cache_cleared == cache | ||
|  | 
 | ||
|  |             # Force clear cache | ||
|  |             result = requests.post(f"{server}/v1/admin/cache/clear") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  |             cache_cleared = result.json() | ||
|  |             assert cache_cleared == {} | ||
|  | 
 | ||
|  |             # Try to load already deleted cache entries | ||
|  |             result = requests.post(f"{server}/v1/admin/cache/load") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  |             cache_loaded = result.json() | ||
|  |             assert cache_loaded == {} | ||
|  | 
 | ||
|  |             # Cache should still be empty | ||
|  |             result = requests.get(f"{server}/v1/admin/cache") | ||
|  |             assert result.status_code == HTTPStatus.OK | ||
|  |             cache = result.json() | ||
|  |             assert cache == {} |