def test_inline_section_remove(self): """ Tests removing section from a single listing """ expected_section_names = ['Summer Sale', 'Choose Section'] expected_api_calls = [{ 'PUT': '/v2/listings/100002?shop_section_id=0', 'body': { 'listing_id': 100002, 'state': 'active' } }] bp = BulkPage(self.driver) bp.select_single_section('Second something 1235', 'None') # Check listings assert bp.section_names() == expected_section_names # Check that sync button is enabled after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') # Check API calls to Etsy emulator - section should be set to None on one listing check_etsy_emulator_requests(expected_api_calls)
def test_wholesale_bulk_delete_occasion(self): """ Test verifies bulk delete of occasion of listings that have different value of the flag 'can_write_inventory' - Etsy returns false for this flag when a listing is not Retail listing. So far it is not possible to update inventory and attributes on such listings through API, therefore VELA doesn't allow to change it. Test also verifies that if 'can_write_inventory' is changed to false on Etsy, no occasion updates of the listing are sent to Etsy (HIVE-1553). """ expected_can_write_inventory = [ ('100001', True), ('100002', False), ('100003', False), ] retail_expected_value = 'Choose Occasion' expected_api_calls = [{ 'DELETE': '/v2/listings/100001/attributes/46803063641', 'body': {} }] # ---- Make changes in Occasion editor ---- bp = BulkPage(self.driver) click(bp.edit_part('Occasion')) bp.select_occasion('None') # Apply changes and check listings click(bp.operation_apply()) assert bp.listing_row('One').text == 'One\n' + retail_expected_value assert bp.listing_row( 'Two').text == 'Two\n' + CANNOT_EDIT_OCCASION_TEXT assert bp.listing_row( 'Three').text == 'Three\n' + retail_expected_value # Check that sync button is enabled after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') # Check API calls to Etsy emulator - only first listing should be updated check_etsy_emulator_requests(expected_api_calls) # Check can_write_inventory flags in DB - it was set to False on the listing 'Three' assert self.db.get_can_write_inventory( ) == expected_can_write_inventory
def test_inline_holiday_change(self): """ Tests setting/changing holiday on a listing using inline edit """ self.custom_setup('listings_push_attributes') expected_listings = [ 'Four\nThe category of this listing does not support holiday', 'One\nEaster', 'Three\nVeterans\' Day', 'Two\nFather\'s Day' ] expected_api_calls = [{ 'PUT': '/v2/listings/100001/attributes/46803063659?value_ids=37', 'body': {} }, { 'PUT': '/v2/listings/100002/attributes/46803063659?value_ids=38', 'body': {} }, { 'PUT': '/v2/listings/100003/attributes/46803063659?value_ids=49', 'body': {} }] select_listings_to_edit(self.driver) bp = BulkPage(self.driver) # set holiday bp.select_single_holiday('One', 'Easter') # change holiday bp.select_single_holiday('Two', 'Father\'s Day') bp.select_single_holiday('Three', 'Veterans\' Day') # Check listings actual_listings = bp.listing_rows_texts_sorted() assert actual_listings == expected_listings # Check that sync button is enabled and blue dot is displayed after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') assert bp.is_part_modified( 'Holiday') is True, 'Blue dot didn\'t show up' # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled and blue dot is not displayed after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') assert bp.is_part_modified( 'Holiday') is False, 'Blue dot is still shown' # Check holiday data in DB and Etsy requests check_etsy_emulator_requests(expected_api_calls)
def test_bulk_holiday_delete(self): """ Tests deleting holiday from listings using bulk """ self.custom_setup('listings_delete_holiday_bulk') expected_listings = [ 'Four\nThe category of this listing does not support holiday', 'One\nChoose Holiday', 'Three\nChoose Holiday', 'Two\nChoose Holiday' ] expected_holiday_db = [] expected_api_calls = [{ 'DELETE': '/v2/listings/100002/attributes/46803063659', 'body': {} }, { 'DELETE': '/v2/listings/100003/attributes/46803063659', 'body': {} }] # Delete holiday from listings using bulk select_listings_to_edit(self.driver, 'None') bp = BulkPage(self.driver) # Apply changes and check listings click(bp.operation_apply()) actual_listings = bp.listing_rows_texts_sorted() assert actual_listings == expected_listings # Check that sync button is enabled and blue dot is displayed after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') assert bp.is_part_modified( 'Holiday') is True, 'Blue dot didn\'t show up' # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled and blue dot is not displayed after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') assert bp.is_part_modified( 'Holiday') is False, 'Blue dot is still shown' # Check Etsy requests and holiday data in DB after resync check_etsy_emulator_requests(expected_api_calls) check_db_state(expected_holiday_db)
def test_bulk_holiday_set(self): """ Tests setting/changing holiday using bulk on listings """ self.custom_setup('listings_push_attributes') expected_listings = [ 'Four\nThe category of this listing does not support holiday', 'One\nChristmas', 'Three\nChristmas', 'Two\nChristmas' ] expected_api_calls = [{ 'PUT': '/v2/listings/100001/attributes/46803063659?value_ids=35', 'body': {} }, { 'PUT': '/v2/listings/100002/attributes/46803063659?value_ids=35', 'body': {} }, { 'PUT': '/v2/listings/100003/attributes/46803063659?value_ids=35', 'body': {} }] # Set/change holiday using bulk select_listings_to_edit(self.driver, 'Christmas') bp = BulkPage(self.driver) # Apply changes and check listings click(bp.operation_apply()) actual_listings = bp.listing_rows_texts_sorted() assert actual_listings == expected_listings # Check that sync button is enabled and blue dot is displayed after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') assert bp.is_part_modified( 'Holiday') is True, 'Blue dot didn\'t show up' # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled and blue dot is not displayed after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') assert bp.is_part_modified( 'Holiday') is False, 'Blue dot is still shown' # Check holiday data in DB and Etsy requests check_etsy_emulator_requests(expected_api_calls)
def test_inline_occasion_change(self): """ Tests setting/changing of occasion on listings using inline edit """ self.custom_setup('listings_push_attributes') expected_listings = [ 'Four\nThe category of this listing does not support occasion', 'One\nEngagement', 'Three\nChoose Occasion', 'Two\nWedding' ] expected_api_calls = [{ 'PUT': '/v2/listings/100001/attributes/46803063641?value_ids=22', 'body': {} }, { 'PUT': '/v2/listings/100002/attributes/46803063641?value_ids=32', 'body': {} }] select_listings_to_edit(self.driver) bp = BulkPage(self.driver) # Change occasion bp.select_single_occasion('One', 'Engagement') # Set occasion bp.select_single_occasion('Two', 'Wedding') # Check listings actual_listings = bp.listing_rows_texts_sorted() assert actual_listings == expected_listings # Check that sync button is enabled and blue dot is displayed after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') assert bp.is_part_modified( 'Occasion') is True, 'Blue dot didn\'t show up' # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled and blue dot is not displayed after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') assert bp.is_part_modified( 'Occasion') is False, 'Blue dot is still shown' # Check occasion data in Etsy requests check_etsy_emulator_requests(expected_api_calls)
def test_inline_occasion_delete(self): """ Tests deleting occasion from a listing using inline edit """ self.custom_setup('listings_delete_occasion') expected_listings = [ 'Four\nThe category of this listing does not support occasion', 'One\nChoose Occasion', 'Three\nChoose Occasion', 'Two\nChoose Occasion' ] expected_occasion_db = [] expected_api_calls = [{ 'DELETE': '/v2/listings/100001/attributes/46803063641', 'body': {} }] select_listings_to_edit(self.driver) bp = BulkPage(self.driver) # Delete occasion from listing bp.select_single_occasion('One', 'None') # Check listings actual_listings = bp.listing_rows_texts_sorted() assert actual_listings == expected_listings # Check that sync button is enabled and blue dot is displayed after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') assert bp.is_part_modified( 'Occasion') is True, 'Blue dot didn\'t show up' # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled and blue dot is not displayed after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') assert bp.is_part_modified( 'Occasion') is False, 'Blue dot is still shown' # Check Etsy requests and occasion data in DB after resync check_etsy_emulator_requests(expected_api_calls) check_db_state(expected_occasion_db)
def test_bulk_section_add(self): """ Tests adding a new section and setting it to listings using bulk operation """ new_section_name = 'New section' expected_section_names = [new_section_name] * 2 expected_api_calls = [{ 'POST': '/v2/shops/14458117/sections?title=New%20section', 'body': {} }, { 'PUT': '/v2/listings/100001', 'body': { 'listing_id': 100001, 'shop_section_id': '66666666', 'state': 'active' } }, { 'PUT': '/v2/listings/100002', 'body': { 'listing_id': 100002, 'shop_section_id': '66666666', 'state': 'active' } }] bp = BulkPage(self.driver) bp.add_new_section(new_section_name) # Apply changes and check listings click(bp.operation_apply()) assert bp.section_names() == expected_section_names # Check that sync button is enabled after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') # Check API calls to Etsy emulator - new section should be created and two listings updated check_etsy_emulator_requests(expected_api_calls)
def test_inline_add_photo_sync(self): """ Test adding a picture using inline edit and syncing it to Etsy """ # the last API call doesn't show actual picture data, because we don't have multipart support in emulator expected_api_calls = [ { 'DELETE': '/v2/listings/100001/images/1224764834', 'body': {} }, { 'POST': '/v2/listings/100001/images', 'body': { 'listing_id': '100001', 'listing_image_id': '1224764834', 'overwrite': '1', 'rank': '1' } }, { 'POST': '/v2/listings/100001/images', 'body': { 'listing_id': '100001', 'overwrite': '1', 'rank': '2' } } ] bp = BulkPage(self.driver) # Add a photo to a listing bp.select_single_photo('One', 1, full_path('onion.jpg')) # Check that sync button is enabled and blue dot is displayed after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') assert bp.is_part_modified('Photos') is True, 'Blue dot didn\'t show up' # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled and blue dot is not displayed after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') assert bp.is_part_modified('Photos') is False, 'Blue dot is still shown' # Wait for shop to sync and check requests made to Etsy vela.wait_for_shop_to_sync(expected_status='up_to_date') check_etsy_emulator_requests(expected_api_calls)
def test_sync_updates_tags(self): """ Tests that data is written to the database when [Sync Updates] is clicked """ expected_data = [['1', '{Tag01,AAA,BBB,CCC}'], ['2', '{Tag01,AAA,BBB,CCC}'], ['3', '{Tag01,AAA,BBB,CCC}']] select_listings_to_edit(self.driver) d = self.driver bp = BulkPage(d) send_keys(bp.operation_input(), 'AAA,BBB ,CCC') click(bp.operation_apply()) # Check apply button assert bp.operation_apply().is_enabled( ) is False, 'Apply button is enabled' click(bp.sync_updates_button()) # Check updated data in DB wait_for_assert(expected_data, lambda: run_sql('HIVE', 'select_tags_modified', True), 'Unexpected tags data in DB')
def test_sync_description(self): """ Tests that data is written to the database when [Sync Updates] is clicked """ expected_data = [['1', 'invisible gloves New Description']] d = self.driver select_listings_to_edit(d) bp = BulkPage(d) row = bp.listing_row('First something 1234 (1)') description = row.find_element_by_css_selector( 'div.body span.description') click(description) sleep(1) form = row.find_element_by_css_selector('div.body form > textarea') click(form) send_keys(form, ' New Description') click( d.find_element_by_css_selector('bulk-edit-dashboard-op-container')) sleep(1) click(bp.sync_updates_button()) wait_for_assert( expected_data, lambda: run_sql('HIVE', 'select_description_modified', True), 'Unexpected data in DB')
def test_edit_single_category(self): """ Tests that a single category can be edited """ expected_listings_01 = [ 'First something 1234 (1)\nClothing\nMen\'s Clothing\nSocks\nChoose Category', 'Second something 1235 (2)\nClothing\nMen\'s Clothing\nSocks\nChoose Category', 'Third something LG-512a (3)\nClothing\nMen\'s Clothing\nPants' ] expected_data = [['1', '1761']] self.select_listings_to_edit() d = self.driver bp = BulkPage(d) actual_listings = bp.listing_rows_texts_sorted() assert actual_listings == expected_listings_01 # update category of the 1st listing row = bp.listing_row('First something 1234 (1)') bp.select_category(['Accessories', 'Costume Accessories', 'Costume Tails & Ears', 'Costume Ears'], row, True) click(bp.sync_updates_button()) wait_for_assert(expected_data, lambda: run_sql('HIVE', 'select_taxonomy_id_modified', True), 'Unexpected taxonomy ID in DB')
def test_sync_updates_title(self): """ Tests that data is written to the database when [Sync Updates] is clicked It also tests that data are correctly processed in more than one batch (see HIVE-1216). """ # Configure Hive to process changes in batches of two listings # Env variable must be set before Hive is started os.environ['SYNC_UPDATES_BATCH_SIZE'] = '2' expected_data = [['1', 'hello First something 1234 (1)'], ['2', 'hello Second something 1235 (2)'], ['3', 'hello Third something LG-512a (3)']] select_listings_to_edit(self.driver) bp = BulkPage(self.driver) input_field = bp.operation_input() send_keys(input_field, 'hello ') # click on Apply and check Apply button click(bp.operation_apply()) wait_for_web_assert(False, bp.operation_apply().is_enabled, 'Apply button is enabled') # Sync changes click(bp.sync_updates_button()) # Check data in DB wait_for_assert(expected_data, lambda: run_sql('HIVE', 'select_title_modified', True), 'Unexpected title data in DB')
def test_bulk_section_change(self): """ Tests changing section on listings using bulk operation """ expected_section_names = ['On Sale'] * 2 expected_api_calls = [{ 'PUT': '/v2/listings/100001', 'body': { 'listing_id': 100001, 'shop_section_id': '15183328', 'state': 'active' } }, { 'PUT': '/v2/listings/100002', 'body': { 'listing_id': 100002, 'shop_section_id': '15183328', 'state': 'active' } }] bp = BulkPage(self.driver) bp.select_section('On Sale') # Apply changes and check listings click(bp.operation_apply()) assert bp.section_names() == expected_section_names # Check that sync button is enabled after clicking on Apply wait_for_web_assert(True, bp.sync_updates_button().is_enabled, 'Sync button is not enabled') # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') # Check API calls to Etsy emulator - section should be changed on two listings check_etsy_emulator_requests(expected_api_calls)
def test_etsy_upload(self): """ Verify that listings can be fetched from Etsy, changed in vela GUI and pushed back to Etsy """ # debug # with open('tests-etsy/data.json') as f: # data = json.load(f) # self.validate_listings(data, '20161124_184056') # return # Delete log files logs = Logs(os.environ['LOG_CLEAN_SCRIPT'], os.environ['LOG_GREP_SCRIPT']) logs.empty() timestamp = strftime("%Y%m%d_%H%M%S") credentials = self.get_credentials() etsy = EtsyApiForATs(credentials) # Delete our section from Etsy log("Deleting section from Etsy") etsy.remove_at_section(AT_SECTION) # Delete and re-create listings on Etsy log("Removing AT listings from Etsy") etsy.remove_at_listings() log("Creating AT listings on Etsy") st_id = etsy.get_shipping_template_id() for i in range(3): title = "{}_{:02d}".format(AT_TITLE, i) etsy.create_listing( dict(self.NEW_LISTING, title=title, taxonomy_id=1, shipping_template_id=st_id)) listings = etsy.get_listings() for listing_id, title in ((l['listing_id'], l['title']) for l in listings if l['title'][:len(AT_TITLE)] == AT_TITLE): print(listing_id, title) # Clean up Vela DB, Load new shop log("Cleaning Vela DB") # Reset feature flags for features that are not in production yet self.db.reset_user_profile_flags(self.user_id, BETA_FEATURE_FLAGS) self.reload_shop() log("Making UI changes") self.go_to_bulk() bp = BulkPage(self.driver) # Edit title log(" title") bp.edit_part('Title').click() bp.select_operation('Add After') send_keys(bp.operation_input(), ' ' + timestamp) bp.operation_apply().click() # Edit description log(" description") bp.edit_part('Description').click() bp.select_operation('Add After') send_keys(bp.operation_input_description(), ' ' + timestamp) bp.operation_apply().click() # Edit category log(" category") bp.edit_part('Category').click() bp.select_category(AT_CATEGORIES) bp.operation_apply().click() # Edit photos log(" photos") bp.edit_part('Photos').click() with Photos(self.driver) as photos: for i, img in enumerate(AT_IMAGES): photos.select_photo( i, os.path.join(photos.photo_dir, img['file'])) bp.operation_apply().click() # Edit tags log(" tags") bp.edit_part('Tags').click() send_keys(bp.operation_input(), ', '.join(AT_TAGS)) bp.operation_apply().click() # Edit materials log(" materials") bp.edit_part('Materials').click() send_keys(bp.operation_input(), ', '.join(AT_MATERIALS)) bp.operation_apply().click() # Edit section log(" section") bp.edit_part('Section').click() bp.operation_select().click() sleep(2) send_keys(bp.operation_menu_new_item_input(), AT_SECTION + Keys.RETURN) bp.operation_apply().click() # Edit Occasion log(" occasion") bp.edit_part('Occasion').click() bp.select_occasion(AT_OCCASION) bp.operation_apply().click() # Edit Holiday log(" holiday") bp.edit_part('Holiday').click() bp.select_holiday(AT_HOLIDAY) bp.operation_apply().click() # Edit variations log(" variations") bp.edit_part('Variations').click() biv = BulkPageInventoryVariations(self.driver, self.ts) bp.select_category(AT_CATEGORIES) bulk_row = biv.bulk_edit_row biv.set_property(bulk_row, 0, AT_VAR_PROPERTY_NAME) for option_name in AT_VAR_OPTION_VALUES: biv.add_option(bulk_row, 0, option_name) bp.operation_apply().click() # Edit price log(" price") bp.edit_part('Price').click() bip = BulkPageInventoryPrice(self.driver, self.ts) bip.select_operation('Change To') input_field = bip.operation_input() send_keys(input_field, AT_PRICE) bp.operation_apply().click() # Edit quantity log(" quantity") bp.edit_part('Quantity').click() biq = BulkPageInventoryQuantity(self.driver, self.ts) biq.select_operation('Change To') input_field = biq.operation_input() send_keys(input_field, str(AT_QUANTITY)) biq.operation_apply().click() # Edit Sku log(" sku") bp.edit_part('SKU').click() bis = BulkPageInventorySku(self.driver, self.ts) input_field = bis.operation_input() send_keys(input_field, AT_SKU) bis.operation_apply().click() # Sync Updates log("Syncing Updates") bp.sync_updates_button().click() sleep(10) self.wait_for_synced() # Get listings from Etsy data = etsy.get_at_listings_details() self.validate_listings(data, timestamp) # Check logs for errors logs.check_for_errors()
def test_wholesale_bulk_change_inventory(self): """ Test verifies bulk changes of inventory of listings that have different value of the flag 'can_write_inventory' - Etsy returns false for this flag when a listing is not Retail listing. So far it is not possible to update inventory and attributes on such listings through API, therefore VELA doesn't allow to change it. Test also verifies that if 'can_write_inventory' is changed to false on Etsy, no inventory updates of the listing are sent to Etsy (HIVE-1553). """ api_products_unpacked1 = [{ 'offerings': [{ 'is_enabled': 1, 'price': 33.33, 'quantity': 21 }], 'property_values': [{ 'property_id': 500, 'property_name': 'Finish', 'scale_id': None, 'value': 'smooth', 'value_id': None }], 'sku': 'NEW SKU' }] expected_api_calls = [{ 'PUT': '/v2/listings/100001/inventory?price_on_property=&quantity_on_property=&sku_on_property=', 'body': { '_products_unpacked': api_products_unpacked1, 'listing_id': 100001 } }] expected_can_write_inventory = [ ('100001', True), ('100002', False), ('100003', False), ] bp = BulkPage(self.driver) # ---- Make changes in Variations editor ---- click(bp.edit_part('Variations')) category = ['Accessories'] bpiv = BulkPageInventoryVariations(self.driver, self.ts) # Select category in bulk edit area bpiv.select_category(category) # Set first variation property and its option bulk_row = bpiv.bulk_edit_row bpiv.set_property(bulk_row, 0, 'Finish') bpiv.add_custom_option(bulk_row, 0, 'smooth') # Apply changes and check results in UI click(bpiv.operation_apply()) assert 'smooth' in bpiv.listing_row('One').text assert bpiv.listing_row( 'Two').text == 'Two\n' + CANNOT_EDIT_INVENTORY_TEXT assert 'smooth' in bpiv.listing_row('Three').text wait_for_web_assert(True, lambda: bpiv.is_part_modified('Variations'), 'Blue dot didn\'t show up for Variations editor') # ---- Make changes in Price, Quantity, SKU editors ---- retail_values = {'Price': '33.33', 'Quantity': '21', 'SKU': 'NEW SKU'} retail_expected_values = { 'Price': '$33.33', 'Quantity': '21', 'SKU': 'NEW SKU' } for editor_name in ['Price', 'Quantity', 'SKU']: # Switch to particular inventory editor, choose bulk operation and set the value for it click(bpiv.edit_part(editor_name)) operation = 'Change To' bp.select_operation(operation) input_field = bp.operation_input() send_keys(input_field, retail_values[editor_name]) # Apply changes and check results in UI click(bp.operation_apply()) wait_for_web_assert( True, lambda: bp.is_part_modified(editor_name), 'Blue dot didn\'t show up for %s editor' % editor_name) assert bp.listing_row( 'One').text == 'One\n' + retail_expected_values[editor_name] assert bp.listing_row( 'Two').text == 'Two\n' + CANNOT_EDIT_INVENTORY_TEXT assert bp.listing_row( 'Three' ).text == 'Three\n' + retail_expected_values[editor_name] # Sync changes click(bp.sync_updates_button()) # Check that sync button is disabled and blue dot is not displayed after clicking on Sync wait_for_web_assert(False, bp.sync_updates_button().is_enabled, 'Sync button is not disabled') # Check API calls to Etsy emulator - only first listing should be updated check_etsy_emulator_requests(expected_api_calls) # Check can_write_inventory flags in DB - it was set to False on the listing 'Three' assert self.db.get_can_write_inventory( ) == expected_can_write_inventory
def test_shopify_upload(self): """ Verify that listings can be fetched from Shopify, changed in vela GUI and pushed back to Shopify """ # --- Preparation ---- # Delete log files logs = Logs(os.environ['LOG_CLEAN_SCRIPT'], os.environ['LOG_GREP_SCRIPT']) logs.empty() timestamp = strftime("%Y%m%d_%H%M%S") # Remove test listings on shopify and create them again there test_listings = ShopifyTestProducts(self.shop_domain, self.shop_token, AT_TITLE_PREFIX) log('Removing AT listings from Shopify') ids = test_listings.delete_test_products() log('Removed listings: ' + ', '.join(map(str, ids))) log('Creating AT listings on Shopify') ids = test_listings.create_test_products(NUMBER_OF_TEST_LISTINGS) log('Created listings: ' + ', '.join(map(str, ids))) # Reload shop - sync from Shopify and disable beta features we don't want to test self.reload_shopify_shop() self.db.reset_user_profile_flags(self.user_id, BETA_FEATURE_FLAGS) # --- Start testing in UI --- log("Making UI changes") self.go_to_bulk(self.shop_name) bp = BulkPage(self.driver) # Edit title log(" title") bp.edit_part('Title').click() bp.select_operation('Add After') send_keys(bp.operation_input(), ' ' + timestamp) bp.operation_apply().click() # Edit description log(" description") bp.edit_part('Description').click() bp.select_operation('Add Before') send_keys(bp.operation_edit_area_description(), timestamp) bp.operation_apply().click() # Edit photos log(" photos") bp.edit_part('Photos').click() with Photos(self.driver) as photos: for i, img in enumerate(AT_IMAGES): photos.select_photo( i, os.path.join(photos.photo_dir, img['file'])) bp.operation_apply().click() # Edit tags log(" tags") bp.edit_part('Tags').click() send_keys(bp.operation_input(), ', '.join(AT_TAGS)) bp.operation_apply().click() # Edit section log(" product type") bp.edit_part('Product Type').click() bp.operation_select().click() sleep(2) send_keys(bp.operation_menu_new_item_input(), AT_PRODUCT_TYPE + Keys.RETURN) bp.operation_apply().click() # Edit section log(" vendor") bp.edit_part('Vendor').click() bp.operation_select().click() sleep(2) send_keys(bp.operation_menu_new_item_input(), AT_VENDOR + Keys.RETURN) bp.operation_apply().click() # Sync Updates log("Syncing Updates") bp.sync_updates_button().click() sleep(5) self.wait_for_synced() # Get test listings from Shopify and verify them data = test_listings.get_test_products() validate_listings(data, timestamp) # Check logs for errors logs.check_for_errors()