コード例 #1
0
def test_post_an_asset_as_admin(client, setup_api_fresh_test_data, admin_kind):
    """
    Post one extra asset, as an admin user.
    """
    with AccountContext("Test Prosumer Account") as prosumer:
        post_data = get_asset_post_data(
            account_id=prosumer.id,
            asset_type_id=prosumer.generic_assets[0].generic_asset_type.id,
        )
    if admin_kind == "site-admin":
        auth_token = get_auth_token(client, "*****@*****.**",
                                    "testtest")
    else:
        auth_token = get_auth_token(client, "*****@*****.**",
                                    "testtest")
        post_data["name"] = "Test battery 3"
    post_assets_response = client.post(
        url_for("AssetAPI:post"),
        json=post_data,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % post_assets_response.json)
    assert post_assets_response.status_code == 201
    assert post_assets_response.json["latitude"] == 30.1

    asset: GenericAsset = GenericAsset.query.filter(
        GenericAsset.name == post_data["name"]).one_or_none()
    assert asset is not None
    assert asset.latitude == 30.1
コード例 #2
0
def test_invalid_or_no_unit(client, method, message):
    if method == "GET":
        get_meter_data_response = client.get(
            url_for("flexmeasures_api_v1.get_meter_data"),
            query_string=message,
            headers={
                "Authorization": get_auth_token(
                    client, "*****@*****.**", "testtest"
                )
            },
        )
    elif method == "POST":
        get_meter_data_response = client.post(
            url_for("flexmeasures_api_v1.get_meter_data"),
            json=message,
            headers={
                "Authorization": get_auth_token(
                    client, "*****@*****.**", "testtest"
                )
            },
        )
    else:
        get_meter_data_response = []
    assert get_meter_data_response.status_code == 400
    assert get_meter_data_response.json["type"] == "GetMeterDataResponse"
    assert (
        get_meter_data_response.json["status"]
        == invalid_unit("power", ["MW"])[0]["status"]
    )
コード例 #3
0
def test_post_sensor_data(
    client,
    setup_api_fresh_test_data,
    num_values,
    expected_num_values,
    unit,
    expected_value,
):
    post_data = make_sensor_data_request_for_gas_sensor(
        num_values=num_values, unit=unit
    )
    sensor = Sensor.query.filter(Sensor.name == "some gas sensor").one_or_none()
    beliefs_before = TimedBelief.query.filter(TimedBelief.sensor_id == sensor.id).all()
    print(f"BELIEFS BEFORE: {beliefs_before}")
    assert len(beliefs_before) == 0

    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    response = client.post(
        url_for("SensorAPI:post_data"),
        json=post_data,
        headers={"Authorization": auth_token},
    )
    print(response.json)
    assert response.status_code == 200
    beliefs = TimedBelief.query.filter(TimedBelief.sensor_id == sensor.id).all()
    print(f"BELIEFS AFTER: {beliefs}")
    assert len(beliefs) == expected_num_values
    # check that values are scaled to the sensor unit correctly
    assert pytest.approx(beliefs[0].event_value - expected_value) == 0
コード例 #4
0
def test_get_assets(
    client, setup_api_test_data, setup_accounts, account_name, num_assets
):
    """
    Get assets per account.
    Our user here is admin, so is allowed to see all assets.
    """
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")

    query = {"account_id": setup_accounts[account_name].id}

    get_assets_response = client.get(
        url_for("AssetAPI:index"),
        query_string=query,
        headers={"content-type": "application/json", "Authorization": auth_token},
    )
    print("Server responded with:\n%s" % get_assets_response.json)
    assert get_assets_response.status_code == 200
    assert len(get_assets_response.json) == num_assets

    if account_name == "Supplier":  # one deep dive
        turbine = {}
        for asset in get_assets_response.json:
            if asset["name"] == "Test wind turbine":
                turbine = asset
        assert turbine
        assert turbine["account_id"] == setup_accounts["Supplier"].id
コード例 #5
0
def test_post_price_data(db, app, post_message):
    """
    Try to post price data as a logged-in test user with the Supplier role, which should succeed.
    """
    # call with client whose context ends, so that we can test for,
    # after-effects in the database after teardown committed.
    with app.test_client() as client:
        # post price data
        auth_token = get_auth_token(client, "*****@*****.**",
                                    "testtest")
        post_price_data_response = client.post(
            url_for("flexmeasures_api_v1_1.post_price_data"),
            json=post_message,
            headers={"Authorization": auth_token},
        )
        print("Server responded with:\n%s" % post_price_data_response.json)
        assert post_price_data_response.status_code == 200
        assert post_price_data_response.json["type"] == "PostPriceDataResponse"

    verify_prices_in_db(post_message, post_message["values"], db)

    # look for Forecasting jobs in queue
    assert (len(app.queues["forecasting"]) == 2
            )  # only one market is affected, but two horizons
    horizons = [timedelta(hours=24), timedelta(hours=48)]
    jobs = sorted(app.queues["forecasting"].jobs,
                  key=lambda x: x.kwargs["horizon"])
    market = get_market(post_message)
    for job, horizon in zip(jobs, horizons):
        assert job.kwargs["horizon"] == horizon
        assert job.kwargs["start"] == parse_date(
            post_message["start"]) + horizon
        assert job.kwargs["timed_value_type"] == "Price"
        assert job.kwargs["asset_id"] == market.id
コード例 #6
0
def test_get_assets(client, add_charging_station_assets, use_owner_id,
                    num_assets):
    """
    Get assets, either for all users (our user here is admin, so is allowed to see all 7 assets) or for
    a unique one (prosumer user 2 has one asset ― "Test battery").
    """
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    test_prosumer2_id = find_user_by_email("*****@*****.**").id

    query = {}
    if use_owner_id:
        query["owner_id"] = test_prosumer2_id

    get_assets_response = client.get(
        url_for("flexmeasures_api_v2_0.get_assets"),
        query_string=query,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % get_assets_response.json)
    assert get_assets_response.status_code == 200
    assert len(get_assets_response.json) == num_assets

    battery = {}
    for asset in get_assets_response.json:
        if asset["name"] == "Test battery":
            battery = asset
    assert battery
    assert pd.Timestamp(
        battery["soc_datetime"]) == pd.Timestamp("2015-01-01T00:00:00+00:00")
    assert battery["owner_id"] == test_prosumer2_id
    assert battery["capacity_in_mw"] == 2
コード例 #7
0
def test_get_asset_nonaccount_access(client, setup_api_test_data):
    """Without being on the same account, test correct responses when accessing one asset."""
    with UserContext("*****@*****.**") as prosumer1:
        prosumer1_assets = prosumer1.account.generic_assets
    with UserContext("*****@*****.**") as supplieruser4:
        supplieruser4_assets = supplieruser4.account.generic_assets
    headers = {
        "content-type": "application/json",
        "Authorization": get_auth_token(
            client, "*****@*****.**", "testtest"
        ),
    }

    # okay to look at assets in own account
    asset_response = client.get(
        url_for("AssetAPI:fetch_one", id=supplieruser4_assets[0].id),
        headers=headers,
        follow_redirects=True,
    )
    assert asset_response.status_code == 200
    # not okay to see assets owned by other accounts
    asset_response = client.get(
        url_for("AssetAPI:fetch_one", id=prosumer1_assets[0].id),
        headers=headers,
        follow_redirects=True,
    )
    assert asset_response.status_code == 403
    # proper 404 for non-existing asset
    asset_response = client.get(
        url_for("AssetAPI:fetch_one", id=8171766575),
        headers=headers,
        follow_redirects=True,
    )
    assert asset_response.status_code == 404
    assert "not found" in asset_response.json["message"]
コード例 #8
0
def test_post_an_asset(client):
    """
    Post one extra asset, as an admin user.
    TODO: Soon we'll allow creating assets on an account-basis, i.e. for users
          who have the user role "account-admin" or sthg similar. Then we'll
          test that here.
    """
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    post_data = get_asset_post_data()
    post_assets_response = client.post(
        url_for("flexmeasures_api_v2_0.post_assets"),
        json=post_data,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % post_assets_response.json)
    assert post_assets_response.status_code == 201
    assert post_assets_response.json["latitude"] == 30.1

    asset: Asset = Asset.query.filter(
        Asset.name == "Test battery 2").one_or_none()
    assert asset is not None
    assert asset.capacity_in_mw == 3
コード例 #9
0
def test_get_asset_nonadmin_access(client):
    """Without being an admin, test correct responses when accessing one asset."""
    with UserContext("*****@*****.**") as prosumer1:
        prosumer1_assets = prosumer1.assets
    with UserContext("*****@*****.**") as prosumer2:
        prosumer2_assets = prosumer2.assets
    headers = {
        "content-type":
        "application/json",
        "Authorization":
        get_auth_token(client, "*****@*****.**", "testtest"),
    }

    # okay to look at own asset
    asset_response = client.get(
        url_for("flexmeasures_api_v2_0.get_asset", id=prosumer2_assets[0].id),
        headers=headers,
        follow_redirects=True,
    )
    assert asset_response.status_code == 200
    # not okay to see assets owned by others
    asset_response = client.get(
        url_for("flexmeasures_api_v2_0.get_asset", id=prosumer1_assets[0].id),
        headers=headers,
        follow_redirects=True,
    )
    assert asset_response.status_code == 403
    # proper 404 for non-existing asset
    asset_response = client.get(
        url_for("flexmeasures_api_v2_0.get_asset", id=8171766575),
        headers=headers,
        follow_redirects=True,
    )
    assert asset_response.status_code == 404
    assert "not found" in asset_response.json["message"]
コード例 #10
0
def test_post_sensor_data_twice(client, setup_api_test_data):
    auth_token = get_auth_token(client, "*****@*****.**",
                                "testtest")
    post_data = make_sensor_data_request_for_gas_sensor()

    # Check that 1st time posting the data succeeds
    response = client.post(
        url_for("SensorAPI:post_data"),
        json=post_data,
        headers={"Authorization": auth_token},
    )
    print(response.json)
    assert response.status_code == 200

    # Check that 2nd time posting the same data succeeds informatively
    response = client.post(
        url_for("SensorAPI:post_data"),
        json=post_data,
        headers={"Authorization": auth_token},
    )
    print(response.json)
    assert response.status_code == 200
    assert "data has already been received" in response.json["message"]

    # Check that replacing data fails informatively
    post_data["values"][0] = 100
    response = client.post(
        url_for("SensorAPI:post_data"),
        json=post_data,
        headers={"Authorization": auth_token},
    )
    print(response.json)
    assert response.status_code == 403
    assert "data represents a replacement" in response.json["message"]
コード例 #11
0
def test_get_prognosis(client, message):
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    get_prognosis_response = client.get(
        url_for("flexmeasures_api_v1_1.get_prognosis"),
        query_string=message_replace_name_with_ea(message),
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % get_prognosis_response.json)
    assert get_prognosis_response.status_code == 200
    if "groups" in get_prognosis_response.json:
        assert get_prognosis_response.json["groups"][0]["values"] == [
            300,
            301,
            302,
            303,
            304,
            305,
        ]
    else:
        assert get_prognosis_response.json["values"] == [
            300, 301, 302, 303, 304, 305
        ]
コード例 #12
0
def test_post_weather_data(
    setup_fresh_api_v1_1_test_data,
    add_weather_sensors_fresh_db,
    app,
    client,
    post_message,
):
    """
    Try to post wind speed data as a logged-in test user, which should lead to forecasting jobs.
    """
    auth_token = get_auth_token(client, "*****@*****.**",
                                "testtest")
    post_weather_data_response = client.post(
        url_for("flexmeasures_api_v1_1.post_weather_data"),
        json=post_message,
        headers={"Authorization": auth_token},
    )
    print("Server responded with:\n%s" % post_weather_data_response.json)
    assert post_weather_data_response.status_code == 200
    assert post_weather_data_response.json["type"] == "PostWeatherDataResponse"

    forecast_horizons = forecast_horizons_for(timedelta(minutes=5))
    jobs = get_forecasting_jobs(last_n=len(forecast_horizons))
    for job, horizon in zip(sorted(jobs, key=lambda x: x.kwargs["horizon"]),
                            forecast_horizons):
        # check if jobs have expected horizons
        assert job.kwargs["horizon"] == horizon
        # check if jobs' start time (the time to be forecasted)
        # is the weather observation plus the horizon
        assert job.kwargs["start"] == parse_date(
            post_message["start"]) + horizon
コード例 #13
0
def test_get_meter_data(db, app, client, message):
    """Checks Charging Station 5, which has multi-sourced data for the same time interval:
    6 values from a Prosumer, and 6 values from a Supplier.

    All data should be in the database, and currently only the Prosumer data is returned.
    """
    message["connection"] = "CS 5"

    # set up frame with expected values, and filter by source if needed
    expected_values = pd.concat(
        [
            pd.DataFrame.from_dict(
                dict(
                    value=[(100.0 + i) for i in range(6)],
                    datetime=[
                        isodate.parse_datetime("2015-01-01T00:00:00Z")
                        + timedelta(minutes=15 * i)
                        for i in range(6)
                    ],
                    data_source_id=1,
                )
            ),
            pd.DataFrame.from_dict(
                dict(
                    value=[(1000.0 - 10 * i) for i in range(6)],
                    datetime=[
                        isodate.parse_datetime("2015-01-01T00:00:00Z")
                        + timedelta(minutes=15 * i)
                        for i in range(6)
                    ],
                    data_source_id=2,
                )
            ),
        ]
    )
    if "source" in message:
        source_ids = validate_user_sources(message["source"])
        expected_values = expected_values[
            expected_values["data_source_id"].isin(source_ids)
        ]
    expected_values = expected_values.set_index(
        ["datetime", "data_source_id"]
    ).sort_index()

    # check whether conftest.py did its job setting up the database with expected values
    cs_5 = Asset.query.filter(Asset.name == "CS 5").one_or_none()
    verify_power_in_db(message, cs_5, expected_values, db, swapped_sign=True)

    # check whether the API returns the expected values (currently only the Prosumer data is returned)
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    get_meter_data_response = client.get(
        url_for("flexmeasures_api_v1.get_meter_data"),
        query_string=message_replace_name_with_ea(message),
        headers={"content-type": "application/json", "Authorization": auth_token},
    )
    print("Server responded with:\n%s" % get_meter_data_response.json)
    assert get_meter_data_response.status_code == 200
    assert get_meter_data_response.json["values"] == [(100.0 + i) for i in range(6)]
コード例 #14
0
def test_post_udi_event(app, message):
    auth_token = None
    with app.test_client() as client:
        sensor = Sensor.query.filter(
            Sensor.name == "Test battery").one_or_none()
        message["event"] = message["event"] % sensor.id
        auth_token = get_auth_token(client, "*****@*****.**",
                                    "testtest")
        post_udi_event_response = client.post(
            url_for("flexmeasures_api_v1_2.post_udi_event"),
            json=message,
            headers={"Authorization": auth_token},
        )
        print("Server responded with:\n%s" % post_udi_event_response.json)
        assert post_udi_event_response.status_code == 200
        assert post_udi_event_response.json["type"] == "PostUdiEventResponse"

    msg_dt = message["datetime"]

    # test database state
    sensor = Sensor.query.filter(Sensor.name == "Test battery").one_or_none()
    assert sensor.generic_asset.get_attribute("soc_datetime") == msg_dt
    assert sensor.generic_asset.get_attribute(
        "soc_in_mwh") == message["value"] / 1000
    assert sensor.generic_asset.get_attribute("soc_udi_event_id") == 204

    # sending again results in an error, unless we increase the event ID
    with app.test_client() as client:
        next_msg_dt = parse_datetime(msg_dt) + timedelta(minutes=5)
        message["datetime"] = next_msg_dt.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
        post_udi_event_response = client.post(
            url_for("flexmeasures_api_v1_2.post_udi_event"),
            json=message,
            headers={"Authorization": auth_token},
        )
        print("Server responded with:\n%s" % post_udi_event_response.json)
        assert post_udi_event_response.status_code == 400
        assert post_udi_event_response.json["type"] == "PostUdiEventResponse"
        assert post_udi_event_response.json["status"] == "OUTDATED_UDI_EVENT"

        message["event"] = message["event"].replace("204", "205")
        post_udi_event_response = client.post(
            url_for("flexmeasures_api_v1_2.post_udi_event"),
            json=message,
            headers={"Authorization": auth_token},
        )
        print("Server responded with:\n%s" % post_udi_event_response.json)
        assert post_udi_event_response.status_code == 200
        assert post_udi_event_response.json["type"] == "PostUdiEventResponse"

    # test database state
    sensor = Sensor.query.filter(Sensor.name == "Test battery").one_or_none()
    assert parse_datetime(
        sensor.generic_asset.get_attribute("soc_datetime")) == parse_datetime(
            message["datetime"])
    assert sensor.generic_asset.get_attribute(
        "soc_in_mwh") == message["value"] / 1000
    assert sensor.generic_asset.get_attribute("soc_udi_event_id") == 205
コード例 #15
0
def test_invalid_resolution_str(client):
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    query_string = message_for_get_meter_data()
    query_string["resolution"] = "15M"  # invalid
    get_meter_data_response = client.get(
        url_for("flexmeasures_api_v1.get_meter_data"),
        query_string=query_string,
        headers={"Authorization": auth_token},
    )
    print("Server responded with:\n%s" % get_meter_data_response.json)
    assert get_meter_data_response.status_code == 400
    assert get_meter_data_response.json["type"] == "GetMeterDataResponse"
    assert get_meter_data_response.json["status"] == "INVALID_RESOLUTION"
コード例 #16
0
def test_invalid_connection_in_get_request(client):
    get_meter_data_response = client.get(
        url_for("flexmeasures_api_v1.get_meter_data"),
        query_string=message_for_get_meter_data(invalid_connection=True),
        headers={
            "Authorization": get_auth_token(
                client, "*****@*****.**", "testtest"
            )
        },
    )
    print("Server responded with:\n%s" % get_meter_data_response.json)
    assert get_meter_data_response.status_code == 400
    assert get_meter_data_response.json["type"] == "GetMeterDataResponse"
    assert get_meter_data_response.json["status"] == invalid_domain()[0]["status"]
コード例 #17
0
def test_post_invalid_sensor_data(client, setup_api_test_data, request_field,
                                  new_value, error_field, error_text):
    post_data = make_sensor_data_request_for_gas_sensor()
    post_data[request_field] = new_value
    # this guy is allowed to post sensorData
    auth_token = get_auth_token(client, "*****@*****.**",
                                "testtest")
    response = client.post(
        url_for("SensorAPI:post_data"),
        json=post_data,
        headers={"Authorization": auth_token},
    )
    print(response.json)
    assert response.status_code == 422
    assert error_text in response.json["message"]["json"][error_field][0]
コード例 #18
0
def test_get_one_user(client, requesting_user, status_code):
    test_user2_id = find_user_by_email("*****@*****.**").id
    headers = {"content-type": "application/json"}
    if requesting_user:
        headers["Authorization"] = get_auth_token(client, requesting_user,
                                                  "testtest")

    get_user_response = client.get(
        url_for("UserAPI:get", id=test_user2_id),
        headers=headers,
    )
    print("Server responded with:\n%s" % get_user_response.data)
    assert get_user_response.status_code == status_code
    if status_code == 200:
        assert get_user_response.json["username"] == "Test Prosumer User 2"
コード例 #19
0
def test_no_data(client):
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    get_prognosis_response = client.get(
        url_for("flexmeasures_api_v1_1.get_prognosis"),
        query_string=message_replace_name_with_ea(
            message_for_get_prognosis(no_data=True)),
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % get_prognosis_response.json)
    assert get_prognosis_response.status_code == 200
    assert get_prognosis_response.json["type"] == "GetPrognosisResponse"
    assert get_prognosis_response.json["values"] == []
コード例 #20
0
def test_invalid_horizon(client, message):
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    get_prognosis_response = client.get(
        url_for("flexmeasures_api_v1_1.get_prognosis"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % get_prognosis_response.json)
    assert get_prognosis_response.status_code == 400
    assert get_prognosis_response.json["type"] == "GetPrognosisResponse"
    assert get_prognosis_response.json["status"] == invalid_horizon(
    )[0]["status"]
コード例 #21
0
def test_post_weather_data(client, post_message):
    """
    Try to post wind speed data as a logged-in test user with the Supplier role, which should succeed.
    """

    # post weather data
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    post_weather_data_response = client.post(
        url_for("flexmeasures_api_v1_1.post_weather_data"),
        json=post_message,
        headers={"Authorization": auth_token},
    )
    print("Server responded with:\n%s" % post_weather_data_response.json)
    assert post_weather_data_response.status_code == 200
    assert post_weather_data_response.json["type"] == "PostWeatherDataResponse"
コード例 #22
0
def test_delete_an_asset(client, db):
    with UserContext("*****@*****.**") as prosumer:
        existing_asset_id = prosumer.assets[0].id

    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    delete_asset_response = client.delete(
        url_for("flexmeasures_api_v2_0.delete_asset", id=existing_asset_id),
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    assert delete_asset_response.status_code == 204
    deleted_asset = Asset.query.filter_by(id=existing_asset_id).one_or_none()
    assert deleted_asset is None
コード例 #23
0
def test_get_one_user(client):
    test_supplier_id = find_user_by_email("*****@*****.**").id
    headers = {
        "content-type":
        "application/json",
        "Authorization":
        get_auth_token(client, "*****@*****.**", "testtest"),
    }

    get_user_response = client.get(
        url_for("flexmeasures_api_v2_0.get_user", id=test_supplier_id),
        headers=headers,
    )
    print("Server responded with:\n%s" % get_user_response.data)
    assert get_user_response.status_code == 200
    assert get_user_response.json["username"] == "Test Supplier"
コード例 #24
0
def test_get_device_message_wrong_event_id(client, message):
    asset = Asset.query.filter(Asset.name == "Test battery").one_or_none()
    message["event"] = message["event"] % (asset.owner_id, asset.id)
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    get_device_message_response = client.get(
        url_for("flexmeasures_api_v1_3.get_device_message"),
        query_string=message,
        headers={"content-type": "application/json", "Authorization": auth_token},
    )
    print("Server responded with:\n%s" % get_device_message_response.json)
    assert get_device_message_response.status_code == 400
    assert get_device_message_response.json["type"] == "GetDeviceMessageResponse"
    assert (
        get_device_message_response.json["status"]
        == unrecognized_event(9999, "soc")[0]["status"]
    )
コード例 #25
0
def test_delete_an_asset(client, setup_api_fresh_test_data):
    with AccountContext("Test Prosumer Account") as prosumer:
        existing_asset_id = prosumer.generic_assets[0].id

    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    delete_asset_response = client.delete(
        url_for("AssetAPI:delete", id=existing_asset_id),
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    assert delete_asset_response.status_code == 204
    deleted_asset = GenericAsset.query.filter_by(
        id=existing_asset_id).one_or_none()
    assert deleted_asset is None
コード例 #26
0
def test_api_task_run_post_unauthorized_wrong_role(client):
    url = url_for("flexmeasures_api_ops.post_task_run")
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    post_req_params = dict(query_string={"name": "my-task"},
                           headers={"Authorization": auth_token})
    task_run = client.post(url, **post_req_params)
    assert task_run.status_code == FORBIDDEN_STATUS_CODE
    assert bytes(FORBIDDEN_ERROR_CLASS, encoding="utf") in task_run.data
    # While we are on it, test if the unauth handler correctly returns json if we set the content-type
    post_req_params.update(headers={
        "Authorization": auth_token,
        "Content-Type": "application/json"
    })
    task_run = client.post(url, **post_req_params)
    assert task_run.status_code == FORBIDDEN_STATUS_CODE
    assert task_run.json["status"] == FORBIDDEN_ERROR_STATUS
コード例 #27
0
def test_get_device_message(client, message):
    sensor = Sensor.query.filter(Sensor.name == "Test battery").one_or_none()
    message["event"] = message["event"] % sensor.id
    auth_token = get_auth_token(client, "*****@*****.**",
                                "testtest")
    get_device_message_response = client.get(
        url_for("flexmeasures_api_v1_2.get_device_message"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % get_device_message_response.json)
    assert get_device_message_response.status_code == 200
    assert get_device_message_response.json[
        "type"] == "GetDeviceMessageResponse"
    assert len(get_device_message_response.json["values"]) == 192

    # Test that a shorter planning horizon yields a shorter result
    # Note that the scheduler might give a different result, because it doesn't look as far ahead
    message["duration"] = "PT6H"
    get_device_message_response_short = client.get(
        url_for("flexmeasures_api_v1_2.get_device_message"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" %
          get_device_message_response_short.json)
    assert get_device_message_response_short.status_code == 200
    assert len(get_device_message_response_short.json["values"]) == 24

    # Test that a much longer planning horizon yields the same result (when there are only 2 days of prices)
    message["duration"] = "PT1000H"
    get_device_message_response_long = client.get(
        url_for("flexmeasures_api_v1_2.get_device_message"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    assert (get_device_message_response_long.json["values"][0:192] ==
            get_device_message_response.json["values"])
コード例 #28
0
def test_get_device_message(client, message):
    asset = Asset.query.filter(Asset.name == "Test battery").one_or_none()
    message["event"] = message["event"] % (asset.owner_id, asset.id)
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    get_device_message_response = client.get(
        url_for("flexmeasures_api_v1_2.get_device_message"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % get_device_message_response.json)
    assert get_device_message_response.status_code == 200
    assert get_device_message_response.json[
        "type"] == "GetDeviceMessageResponse"
    assert len(get_device_message_response.json["values"]) == 192

    # Test that a shorter planning horizon yields the same result
    message["duration"] = "PT6H"
    get_device_message_response_short = client.get(
        url_for("flexmeasures_api_v1_2.get_device_message"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" %
          get_device_message_response_short.json)
    assert get_device_message_response_short.status_code == 200
    assert (get_device_message_response_short.json["values"] ==
            get_device_message_response.json["values"][0:24])

    # Test that a much longer planning horizon yields the same result (when there are only 2 days of prices)
    message["duration"] = "PT1000H"
    get_device_message_response_long = client.get(
        url_for("flexmeasures_api_v1_2.get_device_message"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    assert (get_device_message_response_long.json["values"][0:192] ==
            get_device_message_response.json["values"])
コード例 #29
0
def test_post_price_data_2_0(
    fresh_db,
    setup_roles_users_fresh_db,
    setup_markets_fresh_db,
    clean_redis,
    app,
    post_message,
):
    """
    Try to post price data as a logged-in test user, which should succeed.
    """
    db = fresh_db
    # call with client whose context ends, so that we can test for,
    # after-effects in the database after teardown committed.
    with app.test_client() as client:
        # post price data
        auth_token = get_auth_token(client, "*****@*****.**",
                                    "testtest")
        post_price_data_response = client.post(
            url_for("flexmeasures_api_v2_0.post_price_data"),
            json=post_message,
            headers={"Authorization": auth_token},
        )
        print("Server responded with:\n%s" % post_price_data_response.json)
        assert post_price_data_response.status_code == 200
        assert post_price_data_response.json["type"] == "PostPriceDataResponse"

    verify_sensor_data_in_db(post_message,
                             post_message["values"],
                             db,
                             entity_type="market",
                             fm_scheme="fm1")

    # look for Forecasting jobs in queue
    assert (len(app.queues["forecasting"]) == 2
            )  # only one market is affected, but two horizons
    horizons = [timedelta(hours=24), timedelta(hours=48)]
    jobs = sorted(app.queues["forecasting"].jobs,
                  key=lambda x: x.kwargs["horizon"])
    market = SensorField("market",
                         fm_scheme="fm1").deserialize(post_message["market"])
    for job, horizon in zip(jobs, horizons):
        assert job.kwargs["horizon"] == horizon
        assert job.kwargs["start"] == parse_date(
            post_message["start"]) + horizon
        assert job.kwargs["sensor_id"] == market.id
コード例 #30
0
def test_get_device_message_mistyped_duration(client):
    auth_token = get_auth_token(client, "*****@*****.**", "testtest")
    message = message_for_get_device_message()
    asset = Asset.query.filter(Asset.name == "Test battery").one_or_none()
    message["event"] = message["event"] % (asset.owner_id, asset.id)
    message["duration"] = "PTT6H"
    get_device_message_response = client.get(
        url_for("flexmeasures_api_v1_2.get_device_message"),
        query_string=message,
        headers={
            "content-type": "application/json",
            "Authorization": auth_token
        },
    )
    print("Server responded with:\n%s" % get_device_message_response.json)
    assert get_device_message_response.status_code == 422
    assert (
        "Cannot parse PTT6H as ISO8601 duration"
        in get_device_message_response.json["args_and_json"]["duration"][0])