"""Test new_release_json_blaster""" import datetime import json import random from collections import namedtuple import owsrequest import pytest import src.app as new_release_json_blaster from src.models import ows_assets scheduled_event_payload = { "time": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") } config_groups = [{"distribution_format_id": "74", "config_group": "Vinyl"}] def get_us_physical_new_release_view_row( project_id=random.randint(100000, 999999), product_id=random.randint(100000, 999999), placeholder_upc=random.randint(10000000000000, 99999999999999), tracks=None, ): row = { "project_id": project_id, "project_code": "886446548210", "project_name": "Heavy Thoughts", "product_id": product_id, "product_code": "VR7521", "product_name": "Heavy Thoughts", "vendor_id": 22389, "vendor_name": "(RED) VICTORY", "subaccount_id": 13109, "subaccount_name": "Victory", "project_artist_id": 901189, "project_artist_name": "For The Win", "project_artist_description": None, "project_artist_website": None, "project_artist_urls": "{}", "project_artist_videos": "[]", "project_artist_home_market": None, "project_for_fans_of": "[]", "project_description": "The best project description!", "project_highlights": "The best project highlights!", "product_primary_artist_id": 901189, "product_primary_artist_is_individual": "N", "product_primary_artist_name": "For The Win", "product_upc": "746105075214", "product_placeholder_upc": placeholder_upc, "product_imprint": "Victory", "product_version": "The best version!", "product_c_line": "2017 Victory", "product_release_status": "in_content", "product_genre_id": 1, "product_genre": "Rock", "product_subgenre_id": 1039, "product_subgenre": "Rock", "product_sales_date": "2017-10-27", "product_order_due_date": "2017-09-29", "product_release_date": "2017-10-27", "product_type": "New", "product_distribution_format_id": 74, "product_special_instructions": "", "product_highlights": "The best product highlights!", "product_marketing_highlights": "The best product marketing highlights!", # noqa "product_tracks": json.dumps( [ { "track_id": 123456, "disc": 1, "side": "", "track_number": 2, "track_name": "Example D1 T2", "performer": "Applesauce Bananas", }, { "track_id": 123457, "disc": 2, "side": "", "track_number": 2, "track_name": "Example D2 T2", "performer": "Applesauce Bananas", }, { "track_id": 123458, "disc": 1, "side": "", "track_number": 1, "track_name": "Example D1 T1", "performer": "Applesauce Bananas", }, { "track_id": 123459, "disc": 2, "side": "", "track_number": 1, "track_name": "Example D2 T1", "performer": "Applesauce Bananas", }, ] ), "product_packaging_id": 21, "product_exclusive_for": "", "product_initial_stock": 0, "product_units_per_set": 1, "product_box_lot": 30, "product_end_date": None, "product_embargo_date": None, "product_explicit": "N", "product_exportable": "", "product_manufacturing_obligation": "", "product_country_of_origin": 3, "product_pline": "2017 Victory", "product_production_notes": "", "product_display_configuration": "1 x 12' Vinyl Album", "product_first_week_sales_estimate_sum": None, "product_is_returnable": False, "product_price_code": "LP15", } if tracks is not None: row["product_tracks"] = json.dumps(tracks) return row def get_product( product_id=random.randint(100000, 999999), cover_art_img_url=None, cover_art_img_url_2000=None, tracks=None, ): product = { "product_id": product_id, "product_code": "VR7521", "version": "The best version!", "sales_dt": "2017-10-27", "order_due_dt": "2017-09-29", "release_dt": "2017-10-27", "price_code": "LP15", "upc": "746105075214", "box_lot": 30, "returnable": False, "config": "1 x 12' Vinyl Album", "config_group": "Vinyl", "highlights": "The best product highlights!", "marketing_highlights": "The best product marketing highlights!", "artist": "For The Win", "title": "Heavy Thoughts", "cover_art_img_url": cover_art_img_url, "cover_art_img_url_2000": cover_art_img_url_2000, "genre": "Rock", "subgenre": "Rock", "tracks": [ { "track_id": 123458, "disc": 1, "side": "", "track_number": 1, "track_name": "Example D1 T1", "performer": "Applesauce Bananas", }, { "track_id": 123456, "disc": 1, "side": "", "track_number": 2, "track_name": "Example D1 T2", "performer": "Applesauce Bananas", }, { "track_id": 123459, "disc": 2, "side": "", "track_number": 1, "track_name": "Example D2 T1", "performer": "Applesauce Bananas", }, { "track_id": 123457, "disc": 2, "side": "", "track_number": 2, "track_name": "Example D2 T2", "performer": "Applesauce Bananas", }, ], "country_of_origin": 3, } if tracks is not None: product["tracks"] = tracks return product def get_project(project_id=random.randint(100000, 999999), products=[get_product()]): return { "project_id": project_id, "name": "Heavy Thoughts", "type": "Stak", "book_dates": ["2017-10-27"], "book_order": 0, "description": "The best project description!", "highlights": "The best project highlights!", "video_urls": None, "label_contact": "sales@theorchard.com", "label_nm": "Victory", "parent_label_nm": "(RED) VICTORY", "theme": "Dark", "background_color": "131313", "font_color": "FFFFFF", "artist": { "artist_id": 901189, "name": "For The Win", "bio": None, "website_url": None, "facebook_url": None, "twitter_url": None, "youtube_channel_url": None, "instagram_url": None, "soundcloud_url": None, "bandsintown_url": None, "for_fans_of": None, "home_market": None, }, "products": products, } @pytest.mark.parametrize( ("tracks"), [ # no sides ( [ { "track_id": 123458, "disc": 1, "side": "", "track_number": 1, "track_name": "Example D1 T1", "performer": "Applesauce Bananas", }, { "track_id": 123456, "disc": 1, "side": "", "track_number": 2, "track_name": "Example D1 T2", "performer": "Applesauce Bananas", }, { "track_id": 123459, "disc": 2, "side": "", "track_number": 1, "track_name": "Example D2 T1", "performer": "Applesauce Bananas", }, { "track_id": 123457, "disc": 2, "side": "", "track_number": 2, "track_name": "Example D2 T2", "performer": "Applesauce Bananas", }, ] ), # sides ( [ { "track_id": 123458, "disc": 1, "side": "A", "track_number": 1, "track_name": "Example D1 T1", "performer": "Applesauce Bananas", }, { "track_id": 123458, "disc": 1, "side": "A", "track_number": 2, "track_name": "Example D1 T2", "performer": "Applesauce Bananas", }, { "track_id": 123456, "disc": 1, "side": "B", "track_number": 3, "track_name": "Example D1 T3", "performer": "Applesauce Bananas", }, { "track_id": 123459, "disc": 2, "side": "A", "track_number": 1, "track_name": "Example D2 T1", "performer": "Applesauce Bananas", }, { "track_id": 123457, "disc": 2, "side": "B", "track_number": 2, "track_name": "Example D2 T2", }, ] ), ], ) def test_blast_s3_with_new_release_data(mocker, tracks): """Test json output in in expected format.""" projectA = 123456 projectB = 234567 productA0 = 193949 placeholder_upc_A0 = 80161455255437 productA1 = 357691 placeholder_upc_A1 = 81586722612131 productA2 = 716852 placeholder_upc_A2 = 96742104185627 productB0 = 411710 placeholder_upc_B0 = 59533037243079 productB1 = 269205 placeholder_upc_B1 = 58671092262823 unordered_products = [ get_us_physical_new_release_view_row( project_id=projectA, product_id=productA0, placeholder_upc=placeholder_upc_A0, tracks=tracks, ), get_us_physical_new_release_view_row( project_id=projectB, product_id=productB0, placeholder_upc=placeholder_upc_B0, tracks=tracks, ), get_us_physical_new_release_view_row( project_id=projectA, product_id=productA1, placeholder_upc=placeholder_upc_A1, tracks=tracks, ), get_us_physical_new_release_view_row( project_id=projectA, product_id=productA2, placeholder_upc=placeholder_upc_A2, tracks=tracks, ), get_us_physical_new_release_view_row( project_id=projectB, product_id=productB1, placeholder_upc=placeholder_upc_B1, tracks=tracks, ), ] expected_projects = [ get_project( project_id=projectA, products=[ get_product( product_id=productA0, cover_art_img_url="https://images.theorchard.io/product/large_cover/45f8be3ec0dbdf6859c639404fecb4d8.jpg", # noqa cover_art_img_url_2000="https://d1d42quv8tscnl.cloudfront.net/80161455255437.jpg", # noqa tracks=tracks, ), get_product( product_id=productA1, cover_art_img_url="https://images.theorchard.io/product/large_cover/c157729b2a98eeb2c6e212068234756b.jpg", # noqa cover_art_img_url_2000="https://d1d42quv8tscnl.cloudfront.net/81586722612131.jpg", # noqa tracks=tracks, ), get_product( product_id=productA2, cover_art_img_url="https://images.theorchard.io/product/large_cover/4d308fab48d1a54c8bbb4a045101825c.jpg", # noqa cover_art_img_url_2000="https://d1d42quv8tscnl.cloudfront.net/96742104185627.jpg", # noqa tracks=tracks, ), ], ), get_project( project_id=projectB, products=[ get_product( product_id=productB0, cover_art_img_url="https://images.theorchard.io/product/large_cover/9f173d2a5649eee1b726c74fb0ff7192.jpg", # noqa cover_art_img_url_2000="https://d1d42quv8tscnl.cloudfront.net/59533037243079.jpg", # noqa tracks=tracks, ), get_product( product_id=productB1, cover_art_img_url="https://images.theorchard.io/product/large_cover/5a223a996fa1891b00dfd3aef5d07315.jpg", # noqa cover_art_img_url_2000="https://d1d42quv8tscnl.cloudfront.net/58671092262823.jpg", # noqa tracks=tracks, ), ], ), ] MockResponse = namedtuple("MockResponse", ["status_code", "json"]) mocker.patch.object(new_release_json_blaster, "_save_to_s3", autospec=True) covers = { str( productA0 ): "https://images.theorchard.io/product/large_cover/45f8be3ec0dbdf6859c639404fecb4d8.jpg", str( productA1 ): "https://images.theorchard.io/product/large_cover/c157729b2a98eeb2c6e212068234756b.jpg", str( productA2 ): "https://images.theorchard.io/product/large_cover/4d308fab48d1a54c8bbb4a045101825c.jpg", str( productB0 ): "https://images.theorchard.io/product/large_cover/9f173d2a5649eee1b726c74fb0ff7192.jpg", str( productB1 ): "https://images.theorchard.io/product/large_cover/5a223a996fa1891b00dfd3aef5d07315.jpg", } xlarge_covers = { str(productA0): "https://d1d42quv8tscnl.cloudfront.net/80161455255437.jpg", str(productA1): "https://d1d42quv8tscnl.cloudfront.net/81586722612131.jpg", str(productA2): "https://d1d42quv8tscnl.cloudfront.net/96742104185627.jpg", str(productB0): "https://d1d42quv8tscnl.cloudfront.net/59533037243079.jpg", str(productB1): "https://d1d42quv8tscnl.cloudfront.net/58671092262823.jpg", } mocker.patch.object( ows_assets, "fetch_covers", autospec=True, side_effect=[covers, xlarge_covers] ) mocker.patch.object( owsrequest.request, "process", return_value=MockResponse(status_code=200, json=lambda: config_groups), autospec=True, ) mocker.patch.object( new_release_json_blaster, "_get_us_physical_new_release_view_rows", return_value=unordered_products, autospec=True, ) result = new_release_json_blaster.handler(scheduled_event_payload, None) new_release_json_blaster._save_to_s3.assert_called() new_release_data = new_release_json_blaster._save_to_s3.call_args[0][0] assert new_release_data["last_modified"] == scheduled_event_payload["time"] assert new_release_data["projects"] == expected_projects assert result == {"status": "OK"}