Skip to content

Commit 2313170

Browse files
authored
Add unit tests for notification entity (Azure#39577)
* add unit tests for feature set * add ms copyright * code formattings
1 parent af595cf commit 2313170

File tree

6 files changed

+191
-0
lines changed

6 files changed

+191
-0
lines changed

sdk/ml/azure-ai-ml/tests/batch_online_common/unittests/test_batch_job.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# ---------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# ---------------------------------------------------------
4+
15
import pytest
26

37
from azure.ai.ml.entities import BatchJob

sdk/ml/azure-ai-ml/tests/batch_online_common/unittests/test_model_batch_deployment.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# ---------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# ---------------------------------------------------------
4+
15
import pytest
26
from azure.ai.ml.entities import ModelBatchDeployment
37
from azure.ai.ml.entities._load_functions import load_model_batch_deployment

sdk/ml/azure-ai-ml/tests/batch_online_common/unittests/test_pipeline_component_bach_deployment.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# ---------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# ---------------------------------------------------------
4+
15
import pytest
26
import json
37
from azure.ai.ml.entities._deployment.pipeline_component_batch_deployment import (
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# ---------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# ---------------------------------------------------------
4+
5+
import pytest
6+
import json
7+
8+
from azure.ai.ml.entities._assets._artifacts.feature_set import FeatureSet
9+
from azure.ai.ml.entities._load_functions import load_feature_set
10+
from azure.ai.ml._restclient.v2023_10_01.models import (
11+
FeaturesetContainer,
12+
FeaturesetContainerProperties,
13+
FeaturesetVersion,
14+
FeaturesetVersionProperties,
15+
)
16+
17+
18+
@pytest.mark.unittest
19+
class TestFeatureSetEntity:
20+
FEATURE_SET = "./tests/test_configs/feature_set/feature_set_full.yaml"
21+
FEATURE_SET_REST = "./tests/test_configs/feature_set/feature_set_full_rest.json"
22+
FEATURE_SET_CONTAINER_REST = "./tests/test_configs/feature_set/feature_set_container_rest.json"
23+
24+
def test_to_rest_object(self) -> None:
25+
feature_set = load_feature_set(self.FEATURE_SET)
26+
27+
feature_set_rest = feature_set._to_rest_object()
28+
assert feature_set_rest.properties.description == feature_set.description
29+
assert feature_set_rest.properties.tags == feature_set.tags
30+
assert feature_set_rest.properties.entities == feature_set.entities
31+
assert feature_set_rest.properties.specification.path == feature_set.specification.path
32+
assert feature_set_rest.properties.stage == feature_set.stage
33+
assert (
34+
str(feature_set_rest.properties.materialization_settings.store_type) == "MaterializationStoreType.OFFLINE"
35+
)
36+
assert (
37+
feature_set_rest.properties.materialization_settings.schedule.frequency
38+
== feature_set.materialization_settings.schedule.frequency
39+
)
40+
assert (
41+
feature_set_rest.properties.materialization_settings.schedule.interval
42+
== feature_set.materialization_settings.schedule.interval
43+
)
44+
assert (
45+
feature_set_rest.properties.materialization_settings.spark_configuration
46+
== feature_set.materialization_settings.spark_configuration
47+
)
48+
assert (
49+
feature_set_rest.properties.materialization_settings.resource.instance_type
50+
== feature_set.materialization_settings.resource.instance_type
51+
)
52+
assert (
53+
feature_set_rest.properties.materialization_settings.notification.email_on
54+
== feature_set.materialization_settings.notification.email_on
55+
)
56+
assert (
57+
feature_set_rest.properties.materialization_settings.notification.emails
58+
== feature_set.materialization_settings.notification.emails
59+
)
60+
61+
def test_from_rest_object(self) -> None:
62+
with open(self.FEATURE_SET_REST, "r") as f:
63+
feature_set_rest = FeaturesetVersion.deserialize(json.load(f))
64+
feature_set = FeatureSet._from_rest_object(featureset_rest_object=feature_set_rest)
65+
assert feature_set.name == feature_set_rest.name
66+
assert feature_set.description == feature_set_rest.properties.description
67+
assert feature_set.tags == feature_set_rest.properties.tags
68+
assert feature_set.entities == feature_set_rest.properties.entities
69+
assert feature_set.specification.path == feature_set_rest.properties.specification.path
70+
assert feature_set.stage == feature_set_rest.properties.stage
71+
assert (
72+
feature_set.materialization_settings.schedule.frequency
73+
== feature_set_rest.properties.materialization_settings.schedule.frequency.lower()
74+
)
75+
assert (
76+
feature_set.materialization_settings.schedule.interval
77+
== feature_set_rest.properties.materialization_settings.schedule.interval
78+
)
79+
assert (
80+
feature_set.materialization_settings.spark_configuration
81+
== feature_set_rest.properties.materialization_settings.spark_configuration
82+
)
83+
assert (
84+
feature_set.materialization_settings.resource.instance_type
85+
== feature_set_rest.properties.materialization_settings.resource.instance_type
86+
)
87+
assert (
88+
feature_set.materialization_settings.notification.email_on
89+
== feature_set_rest.properties.materialization_settings.notification.email_on
90+
)
91+
assert (
92+
feature_set.materialization_settings.notification.emails
93+
== feature_set_rest.properties.materialization_settings.notification.emails
94+
)
95+
96+
def test_from_container_rest_object(self) -> None:
97+
with open(self.FEATURE_SET_CONTAINER_REST, "r") as f:
98+
featureset_container_rest = FeaturesetContainer.deserialize(json.load(f))
99+
feature_set = FeatureSet._from_container_rest_object(featureset_container_rest)
100+
assert feature_set.name == featureset_container_rest.name
101+
assert feature_set.description == featureset_container_rest.properties.description
102+
assert feature_set.tags == featureset_container_rest.properties.tags
103+
assert feature_set.entities == []
104+
assert feature_set.specification.path == None
105+
assert feature_set.version == ""
106+
assert feature_set.latest_version == featureset_container_rest.properties.latest_version
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "feature_set_full_rest",
3+
"id": "/subscriptions/sub-id/resourceGroups/some-rg/providers/Microsoft.MachineLearningServices/workspaces/some-ws/feature_set/feature_set_full_rest/versions/1",
4+
"properties": {
5+
"description": "Feature set for testing",
6+
"provisioningState": "Succeeded",
7+
"tags": {
8+
"tag1": "value1",
9+
"tag2": "value2"
10+
},
11+
"isArchived": false,
12+
"latestVersion": "1",
13+
"nextVersion": "2"
14+
}
15+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"name": "feature_set_full_rest",
3+
"id": "/subscriptions/sub-id/resourceGroups/some-rg/providers/Microsoft.MachineLearningServices/workspaces/some-ws/feature_set/feature_set_full_rest/versions/1",
4+
"properties": {
5+
"description": "Feature set for testing",
6+
"entities": [
7+
"azureml:test:1",
8+
"azureml:test:2"
9+
],
10+
"provisioningState": "Succeeded",
11+
"specification": {
12+
"path": "./tests/test_configs/feature_set"
13+
},
14+
"tags": {
15+
"tag1": "value1",
16+
"tag2": "value2"
17+
},
18+
"stage": "Production",
19+
"materializationSettings": {
20+
"notification": {
21+
"emailOn": [
22+
"JobCompleted",
23+
"JobFailed"
24+
],
25+
"email": [
26+
27+
28+
]
29+
},
30+
"resource": {
31+
"instanceType": "standard_e8s_v3"
32+
},
33+
"schedule": {
34+
"frequency": "Minute",
35+
"interval": 5,
36+
"schedule": {
37+
"hours": [
38+
12
39+
],
40+
"minutes": [
41+
5
42+
],
43+
"weekDays": [
44+
"Sunday"
45+
]
46+
}
47+
},
48+
"sparkConfiguration": {
49+
"spark.executor.instances": 2,
50+
"spark.executor.memory": "4g",
51+
"spark.executor.cores": 2,
52+
"spark.driver.memory": "4g",
53+
"spark.driver.cores": 2
54+
},
55+
"storeType": "Offline"
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)