diff --git a/vision/cloud-client/product_search/create_product_set_test.py b/vision/cloud-client/product_search/create_product_set_test.py new file mode 100644 index 00000000000..82f51c76c2b --- /dev/null +++ b/vision/cloud-client/product_search/create_product_set_test.py @@ -0,0 +1,45 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import uuid + +import pytest + +from product_set_management import ( + create_product_set, delete_product_set, list_product_sets) + + +PROJECT_ID = os.getenv('GCLOUD_PROJECT') +LOCATION = 'us-west1' + +PRODUCT_SET_DISPLAY_NAME = 'fake_product_set_display_name_for_testing' +PRODUCT_SET_ID = 'test_{}'.format(uuid.uuid4()) + + +@pytest.fixture(scope="function", autouse=True) +def teardown(): + yield + + # tear down + delete_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) + + +def test_create_product_set(capsys): + create_product_set( + PROJECT_ID, LOCATION, PRODUCT_SET_ID, + PRODUCT_SET_DISPLAY_NAME) + list_product_sets(PROJECT_ID, LOCATION) + out, _ = capsys.readouterr() + assert PRODUCT_SET_ID in out diff --git a/vision/cloud-client/product_search/create_product_test.py b/vision/cloud-client/product_search/create_product_test.py new file mode 100644 index 00000000000..94057ec887a --- /dev/null +++ b/vision/cloud-client/product_search/create_product_test.py @@ -0,0 +1,45 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import uuid + +import pytest + +from product_management import create_product, delete_product, list_products + + +PROJECT_ID = os.getenv('GCLOUD_PROJECT') +LOCATION = 'us-west1' + +PRODUCT_DISPLAY_NAME = 'fake_product_display_name_for_testing' +PRODUCT_CATEGORY = 'homegoods' +PRODUCT_ID = 'test_{}'.format(uuid.uuid4()) + + +@pytest.fixture(scope="function", autouse=True) +def teardown(): + yield + + # tear down + delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) + + +def test_create_product(capsys): + create_product( + PROJECT_ID, LOCATION, PRODUCT_ID, + PRODUCT_DISPLAY_NAME, PRODUCT_CATEGORY) + list_products(PROJECT_ID, LOCATION) + out, _ = capsys.readouterr() + assert PRODUCT_ID in out diff --git a/vision/cloud-client/product_search/import_product_sets_test.py b/vision/cloud-client/product_search/import_product_sets_test.py index ece29054528..58480a8062b 100644 --- a/vision/cloud-client/product_search/import_product_sets_test.py +++ b/vision/cloud-client/product_search/import_product_sets_test.py @@ -13,9 +13,12 @@ # limitations under the License. import os +import uuid import pytest +from google.cloud import storage + from import_product_sets import import_product_sets from product_in_product_set_management import list_products_in_product_set from product_management import delete_product, list_products @@ -26,48 +29,38 @@ PROJECT_ID = os.getenv('GCLOUD_PROJECT') LOCATION = 'us-west1' -GCS_URI = 'gs://cloud-samples-data/vision/product_search/product_sets.csv' +FILENAME = uuid.uuid4() +GCS_URI = 'gs://{}/vision/{}.csv'.format(PROJECT_ID, FILENAME) PRODUCT_SET_DISPLAY_NAME = 'fake_product_set_display_name_for_testing' -PRODUCT_SET_ID = 'fake_product_set_id_for_testing' -PRODUCT_ID_1 = 'fake_product_id_for_testing_1' -PRODUCT_ID_2 = 'fake_product_id_for_testing_2' +PRODUCT_SET_ID = 'test_{}'.format(uuid.uuid4()) +PRODUCT_ID_1 = 'test_{}'.format(uuid.uuid4()) IMAGE_URI_1 = 'shoes_1.jpg' -IMAGE_URI_2 = 'shoes_2.jpg' -@pytest.fixture -def teardown(): - # no set up, tear down only - yield None +@pytest.fixture(scope="function", autouse=True) +def setup_teardown(): + # Create the product set csv file locally and upload it to GCS + # This is so that there is a unique product set ID for all python version + # tests. + client = storage.Client(project=PROJECT_ID) + bucket = client.get_bucket(PROJECT_ID) + blob = storage.Blob("vision/{}.csv".format(FILENAME), bucket) + blob.upload_from_string( + '"gs://cloud-samples-data/vision/product_search/shoes_1.jpg",' + + '"{}",'.format(IMAGE_URI_1) + + '"{}",'.format(PRODUCT_SET_ID) + + '"{}",'.format(PRODUCT_ID_1) + + '"apparel",,"style=womens","0.1,0.1,0.9,0.1,0.9,0.9,0.1,0.9"') + + yield delete_product(PROJECT_ID, LOCATION, PRODUCT_ID_1) - delete_product(PROJECT_ID, LOCATION, PRODUCT_ID_2) delete_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) + # Delete the created file + blob.delete(client) -def test_import_product_sets(capsys, teardown): - list_product_sets(PROJECT_ID, LOCATION) - out, _ = capsys.readouterr() - assert PRODUCT_SET_ID not in out - - list_products(PROJECT_ID, LOCATION) - out, _ = capsys.readouterr() - assert PRODUCT_ID_1 not in out - assert PRODUCT_ID_2 not in out - - list_products_in_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) - out, _ = capsys.readouterr() - assert PRODUCT_ID_1 not in out - assert PRODUCT_ID_2 not in out - - list_reference_images(PROJECT_ID, LOCATION, PRODUCT_ID_1) - out, _ = capsys.readouterr() - assert IMAGE_URI_1 not in out - - list_reference_images(PROJECT_ID, LOCATION, PRODUCT_ID_2) - out, _ = capsys.readouterr() - assert IMAGE_URI_2 not in out - +def test_import_product_sets(capsys): import_product_sets(PROJECT_ID, LOCATION, GCS_URI) list_product_sets(PROJECT_ID, LOCATION) @@ -77,17 +70,11 @@ def test_import_product_sets(capsys, teardown): list_products(PROJECT_ID, LOCATION) out, _ = capsys.readouterr() assert PRODUCT_ID_1 in out - assert PRODUCT_ID_2 in out list_products_in_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) out, _ = capsys.readouterr() assert PRODUCT_ID_1 in out - assert PRODUCT_ID_2 in out list_reference_images(PROJECT_ID, LOCATION, PRODUCT_ID_1) out, _ = capsys.readouterr() assert IMAGE_URI_1 in out - - list_reference_images(PROJECT_ID, LOCATION, PRODUCT_ID_2) - out, _ = capsys.readouterr() - assert IMAGE_URI_2 in out diff --git a/vision/cloud-client/product_search/product_in_product_set_management_test.py b/vision/cloud-client/product_search/product_in_product_set_management_test.py index 8d93f2e0e72..dad975e2b57 100644 --- a/vision/cloud-client/product_search/product_in_product_set_management_test.py +++ b/vision/cloud-client/product_search/product_in_product_set_management_test.py @@ -13,6 +13,7 @@ # limitations under the License. import os +import uuid import pytest @@ -28,15 +29,15 @@ LOCATION = 'us-west1' PRODUCT_SET_DISPLAY_NAME = 'fake_product_set_display_name_for_testing' -PRODUCT_SET_ID = 'fake_product_set_id_for_testing' +PRODUCT_SET_ID = 'test_set_{}'.format(uuid.uuid4()) PRODUCT_DISPLAY_NAME = 'fake_product_display_name_for_testing' PRODUCT_CATEGORY = 'homegoods' -PRODUCT_ID = 'fake_product_id_for_testing' +PRODUCT_ID = 'test_product_{}'.format(uuid.uuid4()) -@pytest.fixture -def product_and_product_set(): +@pytest.fixture(scope="function", autouse=True) +def setup_teardown(): # set up create_product_set( PROJECT_ID, LOCATION, PRODUCT_SET_ID, PRODUCT_SET_DISPLAY_NAME) @@ -44,18 +45,14 @@ def product_and_product_set(): PROJECT_ID, LOCATION, PRODUCT_ID, PRODUCT_DISPLAY_NAME, PRODUCT_CATEGORY) - yield None + yield # tear down delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) delete_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) -def test_add_product_to_product_set(capsys, product_and_product_set): - list_products_in_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) - out, _ = capsys.readouterr() - assert 'Product id: {}'.format(PRODUCT_ID) not in out - +def test_add_product_to_product_set(capsys): add_product_to_product_set( PROJECT_ID, LOCATION, PRODUCT_ID, PRODUCT_SET_ID) list_products_in_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) @@ -63,7 +60,7 @@ def test_add_product_to_product_set(capsys, product_and_product_set): assert 'Product id: {}'.format(PRODUCT_ID) in out -def test_remove_product_from_product_set(capsys, product_and_product_set): +def test_remove_product_from_product_set(capsys): add_product_to_product_set( PROJECT_ID, LOCATION, PRODUCT_ID, PRODUCT_SET_ID) list_products_in_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) @@ -77,7 +74,7 @@ def test_remove_product_from_product_set(capsys, product_and_product_set): assert 'Product id: {}'.format(PRODUCT_ID) not in out -def test_purge_products_in_product_set(capsys, product_and_product_set): +def test_purge_products_in_product_set(capsys): add_product_to_product_set( PROJECT_ID, LOCATION, PRODUCT_ID, PRODUCT_SET_ID) list_products(PROJECT_ID, LOCATION) @@ -90,5 +87,3 @@ def test_purge_products_in_product_set(capsys, product_and_product_set): list_products(PROJECT_ID, LOCATION) out, _ = capsys.readouterr() assert 'Product id: {}'.format(PRODUCT_ID) not in out - - print(out) diff --git a/vision/cloud-client/product_search/product_management_test.py b/vision/cloud-client/product_search/product_management_test.py index 1019c52f417..dd58ab35236 100644 --- a/vision/cloud-client/product_search/product_management_test.py +++ b/vision/cloud-client/product_search/product_management_test.py @@ -13,11 +13,12 @@ # limitations under the License. import os +import uuid import pytest from product_management import ( - create_product, delete_product, get_product, list_products, + create_product, delete_product, list_products, purge_orphan_products, update_product_labels) @@ -26,13 +27,13 @@ PRODUCT_DISPLAY_NAME = 'fake_product_display_name_for_testing' PRODUCT_CATEGORY = 'homegoods' -PRODUCT_ID = 'fake_product_id_for_testing' +PRODUCT_ID = 'test_{}'.format(uuid.uuid4()) KEY = 'fake_key_for_testing' VALUE = 'fake_value_for_testing' -@pytest.fixture -def product(): +@pytest.fixture(scope="function", autouse=True) +def setup_teardown(): # set up create_product( PROJECT_ID, LOCATION, PRODUCT_ID, @@ -44,22 +45,7 @@ def product(): delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) -def test_create_product(capsys): - list_products(PROJECT_ID, LOCATION) - out, _ = capsys.readouterr() - assert PRODUCT_ID not in out - - create_product( - PROJECT_ID, LOCATION, PRODUCT_ID, - PRODUCT_DISPLAY_NAME, PRODUCT_CATEGORY) - list_products(PROJECT_ID, LOCATION) - out, _ = capsys.readouterr() - assert PRODUCT_ID in out - - delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) - - -def test_delete_product(capsys, product): +def test_delete_product(capsys): list_products(PROJECT_ID, LOCATION) out, _ = capsys.readouterr() assert PRODUCT_ID in out @@ -71,21 +57,14 @@ def test_delete_product(capsys, product): assert PRODUCT_ID not in out -def test_update_product_labels(capsys, product): - get_product(PROJECT_ID, LOCATION, PRODUCT_ID) - out, _ = capsys.readouterr() - assert KEY not in out - assert VALUE not in out - +def test_update_product_labels(capsys): update_product_labels(PROJECT_ID, LOCATION, PRODUCT_ID, KEY, VALUE) out, _ = capsys.readouterr() assert KEY in out assert VALUE in out - delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) - -def test_purge_orphan_products(capsys, product): +def test_purge_orphan_products(capsys): list_products(PROJECT_ID, LOCATION) out, _ = capsys.readouterr() assert PRODUCT_ID in out diff --git a/vision/cloud-client/product_search/product_set_management_test.py b/vision/cloud-client/product_search/product_set_management_test.py index 2148f29e345..d7eae005d54 100644 --- a/vision/cloud-client/product_search/product_set_management_test.py +++ b/vision/cloud-client/product_search/product_set_management_test.py @@ -13,6 +13,7 @@ # limitations under the License. import os +import uuid import pytest @@ -24,37 +25,17 @@ LOCATION = 'us-west1' PRODUCT_SET_DISPLAY_NAME = 'fake_product_set_display_name_for_testing' -PRODUCT_SET_ID = 'fake_product_set_id_for_testing' +PRODUCT_SET_ID = 'test_{}'.format(uuid.uuid4()) -@pytest.fixture -def product_set(): +@pytest.fixture(scope="function", autouse=True) +def setup(): # set up create_product_set( PROJECT_ID, LOCATION, PRODUCT_SET_ID, PRODUCT_SET_DISPLAY_NAME) - yield None - # tear down - delete_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) - - -def test_create_product_set(capsys): - list_product_sets(PROJECT_ID, LOCATION) - out, _ = capsys.readouterr() - assert PRODUCT_SET_ID not in out - - create_product_set( - PROJECT_ID, LOCATION, PRODUCT_SET_ID, - PRODUCT_SET_DISPLAY_NAME) - list_product_sets(PROJECT_ID, LOCATION) - out, _ = capsys.readouterr() - assert PRODUCT_SET_ID in out - - delete_product_set(PROJECT_ID, LOCATION, PRODUCT_SET_ID) - - -def test_delete_product_set(capsys, product_set): +def test_delete_product_set(capsys): list_product_sets(PROJECT_ID, LOCATION) out, _ = capsys.readouterr() assert PRODUCT_SET_ID in out diff --git a/vision/cloud-client/product_search/reference_image_management_test.py b/vision/cloud-client/product_search/reference_image_management_test.py index 335bf4195aa..74db90954b0 100644 --- a/vision/cloud-client/product_search/reference_image_management_test.py +++ b/vision/cloud-client/product_search/reference_image_management_test.py @@ -13,6 +13,7 @@ # limitations under the License. import os +import uuid import pytest @@ -26,14 +27,14 @@ PRODUCT_DISPLAY_NAME = 'fake_product_display_name_for_testing' PRODUCT_CATEGORY = 'homegoods' -PRODUCT_ID = 'fake_product_id_for_testing' +PRODUCT_ID = 'test_{}'.format(uuid.uuid4()) REFERENCE_IMAGE_ID = 'fake_reference_image_id_for_testing' GCS_URI = 'gs://cloud-samples-data/vision/product_search/shoes_1.jpg' -@pytest.fixture -def product(): +@pytest.fixture(scope="function", autouse=True) +def setup_teardown(): # set up create_product( PROJECT_ID, LOCATION, PRODUCT_ID, @@ -45,11 +46,7 @@ def product(): delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) -def test_create_reference_image(capsys, product): - list_reference_images(PROJECT_ID, LOCATION, PRODUCT_ID) - out, _ = capsys.readouterr() - assert REFERENCE_IMAGE_ID not in out - +def test_create_reference_image(capsys): create_reference_image( PROJECT_ID, LOCATION, PRODUCT_ID, REFERENCE_IMAGE_ID, GCS_URI) @@ -57,10 +54,8 @@ def test_create_reference_image(capsys, product): out, _ = capsys.readouterr() assert REFERENCE_IMAGE_ID in out - delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) - -def test_delete_reference_image(capsys, product): +def test_delete_reference_image(capsys): create_reference_image( PROJECT_ID, LOCATION, PRODUCT_ID, REFERENCE_IMAGE_ID, GCS_URI) @@ -73,5 +68,3 @@ def test_delete_reference_image(capsys, product): list_reference_images(PROJECT_ID, LOCATION, PRODUCT_ID) out, _ = capsys.readouterr() assert REFERENCE_IMAGE_ID not in out - - delete_product(PROJECT_ID, LOCATION, PRODUCT_ID) diff --git a/vision/cloud-client/product_search/requirements.txt b/vision/cloud-client/product_search/requirements.txt index aab93a3560c..b1736773d73 100644 --- a/vision/cloud-client/product_search/requirements.txt +++ b/vision/cloud-client/product_search/requirements.txt @@ -1 +1,2 @@ google-cloud-vision==0.39.0 +google-cloud-storage==1.25.0 \ No newline at end of file