"""Functional test for update product project id.""" import json import pytest from ows_product_physical.constant import header from ows_product_physical.constant import service_name from tests.utils import db NEW_PROJECT_ID = 4242 NEW_SUBACCOUNT_ID = 2424 @pytest.mark.parametrize( 'login_source,product_status,display_upc', [ ('alw', 'label_processing', '0666677778888'), ('oa', 'in_content', '111222333445'), ('alw', 'transfer_to_content', '0666677778888'), ] ) def test_update_project_id_with_feature( client, setup_put_product, db_with_data, db_release_id, valid_put_header, ows_request_mocker, valid_grass_account_vendor_id, login_source, product_status, db_release_id_with_history, display_upc): """Test successful update of project id with enabled feature.""" valid_put_header[header.ORCHARD_USER_ID] = login_source + ':1234' release_id = db_release_id if product_status == 'in_content': release_id = db_release_id_with_history setup_put_product({}, release_id=release_id) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PROJECT, 'path': '/ownership/vendor/{}/project/{}'.format( valid_grass_account_vendor_id, NEW_PROJECT_ID), 'status': 200, 'json': {} }) ows_request_mocker.add({ 'method': 'get', 'service': service_name.OWS_PROJECT, 'path': '/project/{}'.format(NEW_PROJECT_ID), 'status': 200, 'json': { 'subaccount_id': NEW_SUBACCOUNT_ID, } }) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PRODUCT, 'path': '/{account_type}/{account_id}/display_upc/{display_upc}/' 'available?context_type=physical'.format( account_type='subaccount', account_id=NEW_SUBACCOUNT_ID, display_upc=display_upc), 'status': 200, 'json': {} }) response = client.put( '/product/{}'.format(release_id), headers=valid_put_header, data=json.dumps({'project_id': NEW_PROJECT_ID})) assert response.status_code == 200 response_body = json.loads(response.data.decode()) assert response_body['project_id'] == NEW_PROJECT_ID assert response_body['subaccount_id'] == NEW_SUBACCOUNT_ID def test_update_project_id_no_rights_on_target_project( client, setup_put_product, db_with_data, db_release_id, valid_put_header, ows_request_mocker, valid_grass_account_vendor_id): """Test reject update project id when have no rights on target project.""" setup_put_product({}) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PROJECT, 'path': '/ownership/vendor/{}/project/{}'.format( valid_grass_account_vendor_id, NEW_PROJECT_ID), 'status': 403, 'json': {} }) response = client.put( '/product/{}'.format(db_release_id), headers=valid_put_header, data=json.dumps({'project_id': NEW_PROJECT_ID})) assert response.status_code == 403 def test_update_project_id( client, ows_request_mocker, setup_put_product, valid_grass_account_vendor_id, db_with_data, valid_put_header, db_release_id_with_history, feature_engine): """Test move in_content product when feature is enabled.""" valid_put_header[header.ORCHARD_USER_ID] = 'alw:1234' setup_put_product({}, release_id=db_release_id_with_history) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PROJECT, 'path': '/ownership/vendor/{}/project/{}'.format( valid_grass_account_vendor_id, NEW_PROJECT_ID), 'status': 200, 'json': {} }) ows_request_mocker.add({ 'method': 'get', 'service': service_name.OWS_PROJECT, 'path': '/project/{}'.format(NEW_PROJECT_ID), 'status': 200, 'json': { 'subaccount_id': NEW_SUBACCOUNT_ID, } }) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PRODUCT, 'path': '/{account_type}/{account_id}/display_upc/{display_upc}/' 'available?context_type=physical'.format( account_type='subaccount', account_id=NEW_SUBACCOUNT_ID, display_upc=111222333445), 'status': 200, 'json': {} }) response = client.put( '/product/{}'.format(db_release_id_with_history), headers=valid_put_header, data=json.dumps({'project_id': NEW_PROJECT_ID})) response_body = json.loads(response.data.decode()) assert response_body['project_id'] == NEW_PROJECT_ID assert response_body['subaccount_id'] == NEW_SUBACCOUNT_ID assert response_body['release_status'] == 'in_content' assert response.status_code == 200 def test_update_project_id_display_upc_conflict( client, setup_put_product, db_with_data, db_release_id, valid_put_header, ows_request_mocker, valid_grass_account_vendor_id, feature_engine): """Test successful update of project id with enabled feature.""" setup_put_product({}) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PROJECT, 'path': '/ownership/vendor/{}/project/{}'.format( valid_grass_account_vendor_id, NEW_PROJECT_ID), 'status': 200, 'json': {} }) ows_request_mocker.add({ 'method': 'get', 'service': service_name.OWS_PROJECT, 'path': '/project/{}'.format(NEW_PROJECT_ID), 'status': 200, 'json': { 'subaccount_id': NEW_SUBACCOUNT_ID, } }) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PRODUCT, 'path': '/{account_type}/{account_id}/display_upc/{display_upc}/' 'available?context_type=physical'.format( account_type='subaccount', account_id=NEW_SUBACCOUNT_ID, display_upc='0666677778888'), 'status': 400, 'json': {} }) response = client.put( '/product/{}'.format(db_release_id), headers=valid_put_header, data=json.dumps({'project_id': NEW_PROJECT_ID})) assert response.status_code == 400 response_body = json.loads(response.data.decode()) assert 'display_upc' in response_body['message'] def test_update_project_id_with_product_code( client, setup_put_product, db_with_data, valid_put_header, ows_request_mocker, valid_grass_account_vendor_id, db_release, db_product_physical): """Test that product code uniqueness checked during move process.""" product_id = 444 # new id to create product to copy subaccount_id = 668 # other subaccount that already has product_code PHYS1 # create product we will move. db_release['release_id'] = product_id db_release['product_code'] = 'PHYS1' db_release['release_status'] = 'label_processing' db_release['country_of_origin'] = 3 db.populate_table('releases', [db_release]) phys_product = db_product_physical[0] phys_product['release_id'] = product_id del phys_product['id'] db.populate_table('product_physical', [phys_product]) setup_put_product({}, release_id=product_id) ows_request_mocker.add({ 'method': 'head', 'service': service_name.OWS_PROJECT, 'path': '/ownership/vendor/{}/project/{}'.format( valid_grass_account_vendor_id, NEW_PROJECT_ID), 'status': 200, 'json': {} }) ows_request_mocker.add({ 'method': 'get', 'service': service_name.OWS_PROJECT, 'path': '/project/{}'.format(NEW_PROJECT_ID), 'status': 200, 'json': { 'subaccount_id': subaccount_id, } }) response = client.put( '/product/{}'.format(product_id), headers=valid_put_header, data=json.dumps({'project_id': NEW_PROJECT_ID})) assert response.status_code == 400 response_body = json.loads(response.data.decode()) assert response_body['code'] == 'validation_error' assert 'product_code' in response_body['message']