@@ -44,80 +44,101 @@ class TestFeaturestore(e2e_base.TestEndToEnd):
4444
4545 _temp_prefix = "temp_vertex_sdk_e2e_featurestore_test"
4646
47- def test_end_to_end (self , shared_state , caplog ):
48-
49- caplog .set_level (logging .INFO )
50-
47+ def test_create_get_list_featurestore (self , shared_state ):
5148 aiplatform .init (
5249 project = e2e_base ._PROJECT , location = e2e_base ._LOCATION ,
5350 )
5451
5552 base_list_featurestores = len (aiplatform .Featurestore .list ())
56- base_list_searched_features = len (aiplatform .Feature .search ())
53+ shared_state [ " base_list_searched_features" ] = len (aiplatform .Feature .search ())
5754
58- # Featurestore
5955 featurestore_id = self ._make_display_name (key = _TEST_FEATURESTORE_ID ).replace (
6056 "-" , "_"
6157 )[:60 ]
6258 featurestore = aiplatform .Featurestore .create (featurestore_id = featurestore_id )
59+
6360 shared_state ["resources" ] = [featurestore ]
61+ shared_state ["featurestore" ] = featurestore
62+ shared_state ["featurestore_name" ] = featurestore .resource_name
6463
6564 get_featurestore = aiplatform .Featurestore (
6665 featurestore_name = featurestore .resource_name
6766 )
6867 assert featurestore .resource_name == get_featurestore .resource_name
6968
7069 list_featurestores = aiplatform .Featurestore .list ()
71- assert len (list_featurestores ) - base_list_featurestores == 1
70+ assert (len (list_featurestores ) - base_list_featurestores ) == 1
71+
72+ def test_create_get_list_entity_types (self , shared_state ):
73+
74+ assert shared_state ["featurestore" ]
75+ assert shared_state ["featurestore_name" ]
76+
77+ featurestore = shared_state ["featurestore" ]
78+ featurestore_name = shared_state ["featurestore_name" ]
7279
73- # EntityType
80+ aiplatform .init (
81+ project = e2e_base ._PROJECT , location = e2e_base ._LOCATION ,
82+ )
7483
75- # User EntityType
76- user_entity_type_id = _TEST_USER_ENTITY_TYPE_ID
84+ # Users
7785 user_entity_type = featurestore .create_entity_type (
78- entity_type_id = user_entity_type_id
86+ entity_type_id = _TEST_USER_ENTITY_TYPE_ID
7987 )
88+ shared_state ["user_entity_type" ] = user_entity_type
89+ shared_state ["user_entity_type_name" ] = user_entity_type .resource_name
8090
8191 get_user_entity_type = featurestore .get_entity_type (
82- entity_type_id = user_entity_type_id
92+ entity_type_id = _TEST_USER_ENTITY_TYPE_ID
8393 )
8494 assert user_entity_type .resource_name == get_user_entity_type .resource_name
8595
86- # Movie EntityType
87- movie_entity_type_id = _TEST_MOVIE_ENTITY_TYPE_ID
96+ # Movies
8897 movie_entity_type = aiplatform .EntityType .create (
89- entity_type_id = movie_entity_type_id ,
90- featurestore_name = featurestore . resource_name ,
98+ entity_type_id = _TEST_MOVIE_ENTITY_TYPE_ID ,
99+ featurestore_name = featurestore_name ,
91100 )
101+ shared_state ["movie_entity_type" ] = movie_entity_type
102+ shared_state ["movie_entity_type_name" ] = movie_entity_type .resource_name
92103
93104 get_movie_entity_type = aiplatform .EntityType (
94105 entity_type_name = movie_entity_type .resource_name
95106 )
96107 assert movie_entity_type .resource_name == get_movie_entity_type .resource_name
97108
98109 list_entity_types = aiplatform .EntityType .list (
99- featurestore_name = featurestore . resource_name
110+ featurestore_name = featurestore_name
100111 )
101112 assert len (list_entity_types ) == 2
102113
103- # Feature
114+ def test_create_batch_create_get_list_features (self , shared_state ):
115+
116+ assert shared_state ["user_entity_type" ]
117+ assert shared_state ["user_entity_type_name" ]
118+ user_entity_type = shared_state ["user_entity_type" ]
119+ user_entity_type_name = shared_state ["user_entity_type_name" ]
120+
121+ aiplatform .init (
122+ project = e2e_base ._PROJECT , location = e2e_base ._LOCATION ,
123+ )
124+
125+ list_user_features = user_entity_type .list_features ()
126+ assert len (list_user_features ) == 0
104127
105128 # User Features
106- user_age_feature_id = _TEST_USER_AGE_FEATURE_ID
107129 user_age_feature = user_entity_type .create_feature (
108- feature_id = user_age_feature_id , value_type = "INT64"
130+ feature_id = _TEST_USER_AGE_FEATURE_ID , value_type = "INT64"
109131 )
110132
111133 get_user_age_feature = user_entity_type .get_feature (
112- feature_id = user_age_feature_id
134+ feature_id = _TEST_USER_AGE_FEATURE_ID
113135 )
114136 assert user_age_feature .resource_name == get_user_age_feature .resource_name
115137
116- user_gender_feature_id = _TEST_USER_GENDER_FEATURE_ID
117138 user_gender_feature = aiplatform .Feature .create (
118- feature_id = user_gender_feature_id ,
139+ feature_id = _TEST_USER_GENDER_FEATURE_ID ,
119140 value_type = "STRING" ,
120- entity_type_name = user_entity_type . resource_name ,
141+ entity_type_name = user_entity_type_name ,
121142 )
122143
123144 get_user_gender_feature = aiplatform .Feature (
@@ -127,66 +148,97 @@ def test_end_to_end(self, shared_state, caplog):
127148 user_gender_feature .resource_name == get_user_gender_feature .resource_name
128149 )
129150
130- user_liked_genres_feature_id = _TEST_USER_LIKED_GENRES_FEATURE_ID
151+ list_user_features = aiplatform .Feature .list (
152+ entity_type_name = user_entity_type_name
153+ )
154+ assert len (list_user_features ) == 2
155+
131156 user_feature_configs = {
132- user_liked_genres_feature_id : {"value_type" : "STRING_ARRAY" },
157+ _TEST_USER_LIKED_GENRES_FEATURE_ID : {"value_type" : "STRING_ARRAY" },
133158 }
134159 user_entity_type .batch_create_features (feature_configs = user_feature_configs )
135160
136161 list_user_features = user_entity_type .list_features ()
137162 assert len (list_user_features ) == 3
138163
139- user_entity_type = user_entity_type .ingest_from_gcs (
164+ def test_ingest_feature_values (self , shared_state , caplog ):
165+
166+ assert shared_state ["user_entity_type" ]
167+ user_entity_type = shared_state ["user_entity_type" ]
168+
169+ caplog .set_level (logging .INFO )
170+
171+ aiplatform .init (
172+ project = e2e_base ._PROJECT , location = e2e_base ._LOCATION ,
173+ )
174+
175+ user_entity_type .ingest_from_gcs (
140176 feature_ids = [
141- user_age_feature_id ,
142- user_gender_feature_id ,
143- user_liked_genres_feature_id ,
177+ _TEST_USER_AGE_FEATURE_ID ,
178+ _TEST_USER_GENDER_FEATURE_ID ,
179+ _TEST_USER_LIKED_GENRES_FEATURE_ID ,
144180 ],
145181 feature_time = "update_time" ,
146182 gcs_source_uris = _TEST_USERS_ENTITY_TYPE_GCS_SRC ,
147183 gcs_source_type = "avro" ,
148184 entity_id_field = "user_id" ,
149185 worker_count = 2 ,
150- sync = False ,
151186 )
152187
153- movie_title_feature_id = _TEST_MOVIE_TITLE_FEATURE_ID
154- movie_genres_feature_id = _TEST_MOVIE_GENRES_FEATURE_ID
155- movie_average_rating_id = _TEST_MOVIE_AVERAGE_RATING_FEATURE_ID
188+ assert "EntityType feature values imported." in caplog .text
189+
190+ caplog .clear ()
191+
192+ def test_ingest_feature_values_with_config (self , shared_state , caplog ):
193+
194+ assert shared_state ["movie_entity_type" ]
195+ movie_entity_type = shared_state ["movie_entity_type" ]
196+
197+ caplog .set_level (logging .INFO )
198+
199+ aiplatform .init (
200+ project = e2e_base ._PROJECT , location = e2e_base ._LOCATION ,
201+ )
156202
157203 movie_feature_configs = {
158- movie_title_feature_id : {"value_type" : "STRING" },
159- movie_genres_feature_id : {"value_type" : "STRING" },
160- movie_average_rating_id : {"value_type" : "DOUBLE" },
204+ _TEST_MOVIE_TITLE_FEATURE_ID : {"value_type" : "STRING" },
205+ _TEST_MOVIE_GENRES_FEATURE_ID : {"value_type" : "STRING" },
206+ _TEST_MOVIE_AVERAGE_RATING_FEATURE_ID : {"value_type" : "DOUBLE" },
161207 }
162208
163209 list_movie_features = movie_entity_type .list_features ()
164210 assert len (list_movie_features ) == 0
165211
166- movie_entity_type = movie_entity_type .ingest_from_gcs (
212+ movie_entity_type .ingest_from_gcs (
167213 feature_ids = [
168- movie_title_feature_id ,
169- movie_genres_feature_id ,
170- movie_average_rating_id ,
214+ _TEST_MOVIE_TITLE_FEATURE_ID ,
215+ _TEST_MOVIE_GENRES_FEATURE_ID ,
216+ _TEST_MOVIE_AVERAGE_RATING_FEATURE_ID ,
171217 ],
172218 feature_time = "update_time" ,
173219 gcs_source_uris = _TEST_MOVIES_ENTITY_TYPE_GCS_SRC ,
174220 gcs_source_type = "avro" ,
175221 entity_id_field = "movie_id" ,
176222 worker_count = 2 ,
177223 batch_create_feature_configs = movie_feature_configs ,
178- sync = False ,
179224 )
180225
181- user_entity_type .wait ()
182- movie_entity_type .wait ()
183-
184- assert "EntityType feature values imported." in caplog .text
185-
186226 list_movie_features = movie_entity_type .list_features ()
187227 assert len (list_movie_features ) == 3
188228
189- list_searched_features = aiplatform .Feature .search ()
190- assert len (list_searched_features ) - base_list_searched_features == 6
229+ assert "EntityType feature values imported." in caplog .text
191230
192231 caplog .clear ()
232+
233+ def test_search_features (self , shared_state ):
234+
235+ assert shared_state ["base_list_searched_features" ] is not None
236+
237+ aiplatform .init (
238+ project = e2e_base ._PROJECT , location = e2e_base ._LOCATION ,
239+ )
240+
241+ list_searched_features = aiplatform .Feature .search ()
242+ assert (
243+ len (list_searched_features ) - shared_state ["base_list_searched_features" ]
244+ ) == 3
0 commit comments