"""Test core function handler.""" # import base64 # import json from unittest import mock import pytest from src import app # @mock.patch('src.app.ALL_TERRITORIES', ['DE', 'FR', 'US']) @mock.patch('src.app.ows_sound_recordings') def test_vendor_no_carveouts(mock_ows): """No carveout rules -> monetize everything.""" mock_ows.post_rule.return_value = { 'num_created': 2, 'num_deleted': 0 } # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'vendor_id:12345', # 'VALUE': '[\n {\n \"service\": \"meta\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"start_date\": \"2012-11-26T09:11:03+00:00\",\n \"territory_carveouts\": \"\",\n \"territory_rules\": \"\"\n },\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"start_date\": \"2012-11-26T09:11:03+00:00\",\n \"territory_carveouts\": \"\",\n \"territory_rules\": \"\"\n }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) test_vendor_no_carveouts = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', 'key': None, 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y' '3QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXB' 'lIjogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKI' 'CAgICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiA' 'gICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uY' 'WwiOiBmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICA' 'gIH0KICAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgI' 'nBheWxvYWQiOiB7CiAgICAiS0VZIjogInZlbmRvcl9pZDoxMjM0NSI' 'sCiAgICAiVkFMVUUiOiAiW1xuICB7XG4gICAgXCJzZXJ2aWNlXCI6I' 'FwibWV0YVwiLFxuICAgIFwic3Rhcl9jYXJ2ZW91dFwiOiBmYWxzZSx' 'cbiAgICBcInN0YXJfcnVsZVwiOiBmYWxzZSxcbiAgICBcInN0YXJ0X' '2RhdGVcIjogXCIyMDEyLTExLTI2VDA5OjExOjAzKzAwOjAwXCIsXG4' 'gICAgXCJ0ZXJyaXRvcnlfY2FydmVvdXRzXCI6IFwiXCIsXG4gICAgX' 'CJ0ZXJyaXRvcnlfcnVsZXNcIjogXCJcIlxuICB9LFxuICB7XG4gICA' 'gXCJzZXJ2aWNlXCI6IFwidGlrdG9rXCIsXG4gICAgXCJzdGFyX2Nhc' 'nZlb3V0XCI6IGZhbHNlLFxuICAgIFwic3Rhcl9ydWxlXCI6IGZhbHN' 'lLFxuICAgIFwic3RhcnRfZGF0ZVwiOiBcIjIwMTItMTEtMjZUMDk6M' 'TE6MDMrMDA6MDBcIixcbiAgICBcInRlcnJpdG9yeV9jYXJ2ZW91dHN' 'cIjogXCJcIixcbiAgICBcInRlcnJpdG9yeV9ydWxlc1wiOiBcIlwiX' 'G4gIH1cbl0iCiAgfQp9', # 'value': kafka_message_base64, 'headers': [] } ] } } result = app.handler(test_vendor_no_carveouts, None) assert result == [{ 'num_created': 2, 'num_deleted': 0 }] # mock_ows.post_rule.assert_called_once_with( # 'vendors', # [ # { # 'obj_id': '12345', # 'rules': [ # { # 'territories': ['DE', 'FR', 'US'], # 'policy': 'monetize', # 'start': '2012-11-26T09:11:03+00:00', # 'service': 'meta' # }, # { # 'territories': ['DE', 'FR', 'US'], # 'policy': 'monetize', # 'start': '2012-11-26T09:11:03+00:00', # 'service': 'tiktok' # }, # ] # } # ] # ) # @mock.patch('src.app.ALL_TERRITORIES', ['DE', 'FR', 'US']) @mock.patch('src.app.ows_sound_recordings') def test_vendor_star_carveouts(mock_ows): # def test_vendor_everything_carved_out(mock_ows): """Carveout all territories -> no monetize rules.""" mock_ows.post_rule.return_value = { 'num_created': 0, 'num_deleted': 2 } # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'vendor_id:12345', # 'VALUE': '[\n {\n \"service\": \"meta\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"DE,FR,US\",\n \"territory_rules\": \"\",\n \"start_date\": \"2022-02-13T23:02:29+00:00\"\n },\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"DE,FR,US\",\n \"territory_rules\": \"\",\n \"start_date\": \"2022-02-13T23:02:29+00:00\"\n }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) test_vendor_star_carveouts = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', 'key': None, 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y' '3QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXB' 'lIjogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKI' 'CAgICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiA' 'gICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uY' 'WwiOiBmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICA' 'gIH0KICAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgI' 'nBheWxvYWQiOiB7CiAgICAiS0VZIjogInZlbmRvcl9pZDoxMjM0NSI' 'sCiAgICAiVkFMVUUiOiAiW1xuICB7XG4gICAgXCJzZXJ2aWNlXCI6I' 'FwibWV0YVwiLFxuICAgIFwic3Rhcl9jYXJ2ZW91dFwiOiB0cnVlLFx' 'uICAgIFwic3Rhcl9ydWxlXCI6IHRydWUsXG4gICAgXCJ0ZXJyaXRvc' 'nlfY2FydmVvdXRzXCI6IFwiXCIsXG4gICAgXCJ0ZXJyaXRvcnlfcnV' 'sZXNcIjogXCJcIixcbiAgICBcInN0YXJ0X2RhdGVcIjogXCIyMDIyL' 'TAyLTEzVDIzOjAyOjI5KzAwOjAwXCJcbiAgfSxcbiAge1xuICAgIFw' 'ic2VydmljZVwiOiBcInRpa3Rva1wiLFxuICAgIFwic3Rhcl9jYXJ2Z' 'W91dFwiOiB0cnVlLFxuICAgIFwic3Rhcl9ydWxlXCI6IHRydWUsXG4' 'gICAgXCJ0ZXJyaXRvcnlfY2FydmVvdXRzXCI6IFwiXCIsXG4gICAgX' 'CJ0ZXJyaXRvcnlfcnVsZXNcIjogXCJcIixcbiAgICBcInN0YXJ0X2R' 'hdGVcIjogXCIyMDIyLTAyLTEzVDIzOjAyOjI5KzAwOjAwXCJcbiAgI' 'CB9XG5dIgogIH0KfQ==', 'headers': [] } ] } } # test_vendor_everything_carved_out = { # 'eventSource': 'aws:kafka', # 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' # 'qa-managed-kafka-cdc-destination/' # '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', # 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' # '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' # 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094', # 'records': { # 'event.orchardSoundRecording.fingerprintRules-0': [ # { # 'topic': 'event.orchardSoundRecording.fingerprintRules', # 'partition': 0, # 'offset': 0, # 'timestamp': 1660310105818, # 'timestampType': 'CREATE_TIME', # 'key': None, # 'value': kafka_message_base64, # 'headers': [] # } # ] # } # } result = app.handler(test_vendor_star_carveouts, None) assert result == [{ 'num_created': 0, 'num_deleted': 2 }] # app.handler(test_vendor_everything_carved_out, None) # mock_ows.post_rule.assert_called_once_with( # 'vendors', # [ # { # 'obj_id': '12345', # 'rules': [ # { # 'territories': [ # 'DE', # 'FR', # 'US' # ], # 'policy': 'carveout', # 'start': None, # 'service': 'meta' # }, # { # 'territories': [ # 'DE', # 'FR', # 'US' # ], # 'policy': 'carveout', # 'start': None, # 'service': 'tiktok' # } # ] # } # ] # ) # @mock.patch('src.app.ALL_TERRITORIES', ['DE', 'FR', 'US']) @mock.patch('src.app.ows_sound_recordings') def test_vendor_complex_carveouts(mock_ows): """Added vendor with complex rules -> add all rules.""" mock_ows.post_rule.return_value = { 'num_created': 249, 'num_deleted': 0 } # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'vendor_id:14253', # 'VALUE': '[\n {\n \"service\": \"meta\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"DE,FR\",\n \"territory_rules\": \"\"\n },\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"US\",\n \"territory_rules\": \"\"\n }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) test_vendor_complex_carveouts = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', 'key': None, 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y' '3QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXB' 'lIjogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKI' 'CAgICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiA' 'gICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uY' 'WwiOiBmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICA' 'gIH0KICAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgI' 'nBheWxvYWQiOiB7CiAgICAiS0VZIjogInZlbmRvcl9pZDoxNDI1MyI' 'sCiAgICAiVkFMVUUiOiAiW1xuICB7XG4gICAgXCJzZXJ2aWNlXCI6I' 'FwibWV0YVwiLFxuICAgIFwic3Rhcl9jYXJ2ZW91dFwiOiB0cnVlLFx' 'uICAgIFwic3Rhcl9ydWxlXCI6IHRydWUsXG4gICAgXCJ0ZXJyaXRvc' 'nlfY2FydmVvdXRzXCI6IFwiQVgsREssRkksRk8sR0wsSVMsTk8sU0U' 'sU0pcIixcbiAgICBcInRlcnJpdG9yeV9ydWxlc1wiOiBcIkFELEFFL' 'EFGLEFHLEFJLEFMLEFNLEFPLEFRLEFSLEFTLEFULEFVLEFXLEFaLEJ' 'BLEJCLEJELEJFLEJGLEJHLEJILEJJLEJKLEJMLEJNLEJOLEJPLEJRL' 'EJSLEJTLEJULEJWLEJXLEJZLEJaLENBLENDLENELENGLENHLENILEN' 'JLENLLENMLENNLENOLENPLENSLENVLENWLENXLENYLENZLENaLERFL' 'ERKLERNLERPLERaLEVDLEVFLEVHLEVILEVSLEVTLEVULEZKLEZLLEZ' 'NLEZSLEdBLEdCLEdELEdFLEdGLEdHLEdILEdJLEdNLEdOLEdQLEdRL' 'EdSLEdTLEdULEdVLEdXLEdZLEhLLEhNLEhOLEhSLEhULEhVLElELEl' 'FLElMLElNLElOLElPLElRLElSLElULEpFLEpNLEpPLEpQLEtFLEtHL' 'EtILEtJLEtNLEtOLEtQLEtSLEtXLEtZLEtaLExBLExCLExDLExJLEx' 'LLExSLExTLExULExVLExWLExZLE1BLE1DLE1ELE1FLE1GLE1HLE1IL' 'E1LLE1MLE1NLE1OLE1PLE1QLE1RLE1SLE1TLE1ULE1VLE1WLE1XLE1' 'YLE1ZLE1aLE5BLE5DLE5FLE5GLE5HLE5JLE5MLE5QLE5SLE5VLE5aL' 'E9NLFBBLFBFLFBGLFBHLFBILFBLLFBMLFBNLFBOLFBSLFBTLFBULFB' 'XLFBZLFFBLFJFLFJPLFJTLFJVLFJXLFNBLFNCLFNDLFNELFNHLFNIL' 'FNJLFNLLFNMLFNNLFNOLFNPLFNSLFNTLFNULFNWLFNYLFNZLFNaLFR' 'DLFRELFRGLFRHLFRILFRKLFRLLFRMLFRNLFROLFRPLFRSLFRULFRWL' 'FRXLFRaLFVBLFVHLFVNLFVTLFVZLFVaLFZBLFZDLFZFLFZHLFZJLFZ' 'OLFZVLFdGLFdTLFlFLFlULFpBLFpNLFpXXCIsXG4gICAgXCJzdGFyd' 'F9kYXRlXCI6IFwiMjAyMy0wNy0yN1QxNTowNzo1OSswMDowMFwiXG4' 'gIH0sXG4gIHtcbiAgICBcInNlcnZpY2VcIjogXCJ0aWt0b2tcIixcb' 'iAgICBcInN0YXJfY2FydmVvdXRcIjogdHJ1ZSxcbiAgICBcInN0YXJ' 'fcnVsZVwiOiB0cnVlLFxuICAgIFwidGVycml0b3J5X2NhcnZlb3V0c' '1wiOiBcIkFYLERLLEZJLEZPLEdMLElTLE5PLFNFLFNKXCIsXG4gICA' 'gXCJ0ZXJyaXRvcnlfcnVsZXNcIjogXCJcIixcbiAgICBcInN0YXJ0X' '2RhdGVcIjogXCIyMDIzLTA3LTI3VDE1OjA3OjU5KzAwOjAwXCJcbiA' 'gICB9XG5dIgogIH0KfQ==', # 'value': kafka_message_base64, 'headers': [] } ] } } result = app.handler(test_vendor_complex_carveouts, None) assert result == [{ 'num_created': 249, 'num_deleted': 0 }] # mock_ows.post_rule.assert_called_once_with( # 'vendors', # [ # { # 'obj_id': '14253', # 'rules': [ # { # 'territories': [ # 'US' # ], # 'policy': 'monetize', # 'start': None, # 'service': 'meta' # }, # { # 'territories': [ # 'DE', # 'FR' # ], # 'policy': 'carveout', # 'start': None, # 'service': 'meta' # }, # { # 'territories': [ # 'DE', # 'FR' # ], # 'policy': 'monetize', # 'start': None, # 'service': 'tiktok' # }, # { # 'territories': [ # 'US' # ], # 'policy': 'carveout', # 'start': None, # 'service': 'tiktok' # } # ] # } # ] # ) @mock.patch('src.app.ows_sound_recordings') # def test_tuid_no_carveouts(mock_ows): def test_vendor_ru_carved_out(mock_ows): """Add russia carveout -> add all other territories as carve-ins.""" mock_ows.post_rule.return_value = { 'num_created': 1, 'num_deleted': 0 } # """All carveouts removed from track.""" # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'tuid:10587840', # 'VALUE': '[\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"\",\n \"territory_rules\": \"\" }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) test_vendor_ru_carved_out = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', # 'key': None, # 'value': kafka_message_base64, 'key': 'InZlbmRvcl9pZDoxNDI1MyI=', 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y' '3QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXB' 'lIjogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKI' 'CAgICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiA' 'gICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uY' 'WwiOiBmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICA' 'gIH0KICAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgI' 'nBheWxvYWQiOiB7CiAgICAiS0VZIjogInZlbmRvcl9pZDoxMjM0NSI' 'sCiAgICAiVkFMVUUiOiAiW1xuICB7XG4gICAgXCJzZXJ2aWNlXCI6I' 'FwidGlrdG9rXCIsXG4gICAgXCJzdGFyX2NhcnZlb3V0XCI6IGZhbHN' 'lLFxuICAgIFwic3Rhcl9ydWxlXCI6IGZhbHNlLFxuICAgIFwidGVyc' 'ml0b3J5X2NhcnZlb3V0c1wiOiBcIlJVXCIsXG4gICAgXCJ0ZXJyaXR' 'vcnlfcnVsZXNcIjogXCJcIixcbiAgICBcInN0YXJ0X2RhdGVcIjogX' 'CIyMDIzLTA3LTI3VDE1OjA3OjU5KzAwOjAwXCJcbiAgICB9XG5dIgo' 'gIH0KfQ==', 'headers': [] } ] } } # test_tuid_no_carveouts = { # 'eventSource': 'aws:kafka', # 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' # 'qa-managed-kafka-cdc-destination/' # '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', # 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' # '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' # 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094', # 'records': { # 'event.orchardSoundRecording.fingerprintRules-0': [ # { # 'topic': 'event.orchardSoundRecording.fingerprintRules', # 'partition': 0, # 'offset': 0, # 'timestamp': 1660310105818, # 'timestampType': 'CREATE_TIME', # 'key': None, # 'value': kafka_message_base64, # 'headers': [] # } # ] # } # } result = app.handler(test_vendor_ru_carved_out, None) assert result == [{ 'num_created': 1, 'num_deleted': 0 }] # app.handler(test_tuid_no_carveouts, None) # mock_ows.post_rule.assert_called_once_with( # 'tracks', # [ # { # 'obj_id': '10587840', # 'rules': [] # } # ] # ) @mock.patch('src.app.ows_sound_recordings') def test_tuid_no_carveouts(mock_ows): """New track added with no carveouts -> add global rules.""" mock_ows.post_rule.return_value = { 'num_created': 0, 'num_deleted': 0 } # def test_tuid_ru_carveout(mock_ows): # """RU carved out from track.""" # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'tuid:10587840', # 'VALUE': '[\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"RU\",\n \"territory_rules\": \"\" }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) # test_tuid_ru_carveout = { # 'eventSource': 'aws:kafka', # 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' # 'qa-managed-kafka-cdc-destination/' # '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', # 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' # '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' # 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094', # 'records': { # 'event.orchardSoundRecording.fingerprintRules-0': [ # { # 'topic': 'event.orchardSoundRecording.fingerprintRules', # 'partition': 0, # 'offset': 0, # 'timestamp': 1660310105818, # 'timestampType': 'CREATE_TIME', # 'key': None, # 'value': kafka_message_base64, # 'headers': [] # } # ] # } # } test_tuid_no_carveouts = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', 'key': None, 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y' '3QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXB' 'lIjogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKI' 'CAgICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiA' 'gICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uY' 'WwiOiBmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICA' 'gIH0KICAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgI' 'nBheWxvYWQiOiB7CiAgICAiS0VZIjogInR1aWQ6MTA1ODc4NDAiLAo' 'gICAgIlZBTFVFIjogIltcbiAge1xuICAgIFwic2VydmljZVwiOiBcI' 'nRpa3Rva1wiLFxuICAgIFwic3Rhcl9jYXJ2ZW91dFwiOiBmYWxzZSx' 'cbiAgICBcInN0YXJfcnVsZVwiOiBmYWxzZSxcbiAgICBcInRlcnJpd' 'G9yeV9jYXJ2ZW91dHNcIjogXCJcIixcbiAgICBcInRlcnJpdG9yeV9' 'ydWxlc1wiOiBcIlwiICAgIH1cbl0iCiAgfQp9', 'headers': [] } ] } } result = app.handler(test_tuid_no_carveouts, None) assert result == [{ 'num_created': 0, 'num_deleted': 0 }] # app.handler(test_tuid_ru_carveout, None) # mock_ows.post_rule.assert_called_once_with( # 'tracks', # [ # { # 'obj_id': '10587840', # 'rules': [ # { # 'territories': ['RU'], # 'policy': 'carveout', # 'start': None, # 'service': 'tiktok'}] # } # ] # ) @mock.patch('src.app.ows_sound_recordings') def test_subaccount_no_carveouts(mock_ows): """New subaccount added with no carveouts -> add global rules.""" mock_ows.post_rule.return_value = { 'num_created': 0, 'num_deleted': 0 } # """All carveouts removed from subaccount.""" # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'subaccount_id:21700', # 'VALUE': '[\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"\",\n \"territory_rules\": \"\" }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) test_subaccount_no_carveouts = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', 'key': None, 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y' '3QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXB' 'lIjogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKI' 'CAgICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiA' 'gICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uY' 'WwiOiBmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICA' 'gIH0KICAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgI' 'nBheWxvYWQiOiB7CiAgICAiS0VZIjogInN1YmFjY291bnRfaWQ6MjE' '3MDAiLAogICAgIlZBTFVFIjogIltcbiAge1xuICAgIFwic2VydmljZ' 'VwiOiBcInRpa3Rva1wiLFxuICAgIFwic3Rhcl9jYXJ2ZW91dFwiOiB' 'mYWxzZSxcbiAgICBcInN0YXJfcnVsZVwiOiBmYWxzZSxcbiAgICBcI' 'nRlcnJpdG9yeV9jYXJ2ZW91dHNcIjogXCJcIixcbiAgICBcInRlcnJ' 'pdG9yeV9ydWxlc1wiOiBcIlwiICAgIH1cbl0iCiAgfQp9', # 'value': kafka_message_base64, 'headers': [] } ] } } result = app.handler(test_subaccount_no_carveouts, None) assert result == [{ 'num_created': 0, 'num_deleted': 0 }] # app.handler(test_subaccount_no_carveouts, None) # mock_ows.post_rule.assert_called_once_with( # 'subaccounts', # [ # { # 'obj_id': '21700', # 'rules': [] # } # ] # ) @mock.patch('src.app.logger.exception') def test_handler_decode_exception(mock_logger_exception): """Test handler function exception on decode.""" test_bad_key_data = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', 'key': None, 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y3' 'QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXBlI' 'jogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAg' 'ICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiAgICA' 'gICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uYWwiOi' 'BmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICAgIH0KI' 'CAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgInBheWxv' 'YWQiOiB7CiAgICAiS0VZIjogImJhZF9rZXk6MTIzNDUiLAogICAgIlZ' 'BTFVFIjogIltcbiAge1xuICAgIFwic2VydmljZVwiOiBcIm1ldGFcIi' 'xcbiAgICBcInN0YXJfY2FydmVvdXRcIjogZmFsc2UsXG4gICAgXCJzd' 'GFyX3J1bGVcIjogZmFsc2UsXG4gICAgXCJzdGFydF9kYXRlXCI6IFwi' 'MjAxMi0xMS0yNlQwOToxMTowMyswMDowMFwiLFxuICAgIFwidGVycml' '0b3J5X2NhcnZlb3V0c1wiOiBcIlwiLFxuICAgIFwidGVycml0b3J5X3' 'J1bGVzXCI6IFwiXCJcbiAgfSxcbiAge1xuICAgIFwic2VydmljZVwiO' 'iBcInRpa3Rva1wiLFxuICAgIFwic3Rhcl9jYXJ2ZW91dFwiOiBmYWxz' 'ZSxcbiAgICBcInN0YXJfcnVsZVwiOiBmYWxzZSxcbiAgICBcInN0YXJ' '0X2RhdGVcIjogXCIyMDEyLTExLTI2VDA5OjExOjAzKzAwOjAwXCIsXG' '4gICAgXCJ0ZXJyaXRvcnlfY2FydmVvdXRzXCI6IFwiXCIsXG4gICAgX' 'CJ0ZXJyaXRvcnlfcnVsZXNcIjogXCJcIlxuICB9XG5dIgogIH0KfQ==', 'headers': [] } ] } } # @mock.patch('src.app.ows_sound_recordings') # def test_subaccount_ru_carveout(mock_ows): # """All carveouts removed from subaccount.""" # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'subaccount_id:21700', # 'VALUE': '[\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"territory_carveouts\": \"RU\",\n \"territory_rules\": \"\" }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) # test_subaccount_ru_carveout = { # 'eventSource': 'aws:kafka', # 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' # 'qa-managed-kafka-cdc-destination/' # '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', # 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' # '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' # 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094', # 'records': { # 'event.orchardSoundRecording.fingerprintRules-0': [ # { # 'topic': 'event.orchardSoundRecording.fingerprintRules', # 'partition': 0, # 'offset': 0, # 'timestamp': 1660310105818, # 'timestampType': 'CREATE_TIME', # 'key': None, # 'value': kafka_message_base64, # 'headers': [] # } # ] # } # } with pytest.raises(Exception): app.handler(test_bad_key_data, None) mock_logger_exception.assert_called_once_with( 'Unhandled key "bad_key:12345"') # app.handler(test_subaccount_ru_carveout, None) # mock_ows.post_rule.assert_called_once_with( # 'subaccounts', # [ # { # 'obj_id': '21700', # 'rules': [ # { # 'territories': ['RU'], # 'policy': 'carveout', # 'start': None, # 'service': 'tiktok' # } # ] # } # ] # ) @mock.patch('src.app.logger.exception') @mock.patch('src.app.ows_sound_recordings') def test_handler_exception_on_ows_call(mock_ows, mock_logger_exception): """Test handler function exception on ows call.""" test_vendor_no_carveouts = { 'eventSource': 'aws:kafka', 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' 'qa-managed-kafka-cdc-destination/' '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' 'us-east-1.amazonaws.com:9094', 'records': { 'event.orchardSoundRecording.fingerprintRules-0': [ { 'topic': 'event.orchardSoundRecording.fingerprintRules', 'partition': 0, 'offset': 0, 'timestamp': 1660310105818, 'timestampType': 'CREATE_TIME', 'key': None, 'value': 'ewogICJzY2hlbWEiOiB7CiAgICAidHlwZSI6ICJzdHJ1Y' '3QiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJ0eXB' 'lIjogInN0cmluZyIsCiAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKI' 'CAgICAgICAiZmllbGQiOiAiS0VZIgogICAgICB9LAogICAgICB7CiA' 'gICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAib3B0aW9uY' 'WwiOiBmYWxzZSwKICAgICAgICAiZmllbGQiOiAiVkFMVUUiCiAgICA' 'gIH0KICAgIF0sCiAgICAib3B0aW9uYWwiOiBmYWxzZQogIH0sCiAgI' 'nBheWxvYWQiOiB7CiAgICAiS0VZIjogInZlbmRvcl9pZDoxMjM0NSI' 'sCiAgICAiVkFMVUUiOiAiW1xuICB7XG4gICAgXCJzZXJ2aWNlXCI6I' 'FwibWV0YVwiLFxuICAgIFwic3Rhcl9jYXJ2ZW91dFwiOiBmYWxzZSx' 'cbiAgICBcInN0YXJfcnVsZVwiOiBmYWxzZSxcbiAgICBcInN0YXJ0X' '2RhdGVcIjogXCIyMDEyLTExLTI2VDA5OjExOjAzKzAwOjAwXCIsXG4' 'gICAgXCJ0ZXJyaXRvcnlfY2FydmVvdXRzXCI6IFwiXCIsXG4gICAgX' 'CJ0ZXJyaXRvcnlfcnVsZXNcIjogXCJcIlxuICB9LFxuICB7XG4gICA' 'gXCJzZXJ2aWNlXCI6IFwidGlrdG9rXCIsXG4gICAgXCJzdGFyX2Nhc' 'nZlb3V0XCI6IGZhbHNlLFxuICAgIFwic3Rhcl9ydWxlXCI6IGZhbHN' 'lLFxuICAgIFwic3RhcnRfZGF0ZVwiOiBcIjIwMTItMTEtMjZUMDk6M' 'TE6MDMrMDA6MDBcIixcbiAgICBcInRlcnJpdG9yeV9jYXJ2ZW91dHN' 'cIjogXCJcIixcbiAgICBcInRlcnJpdG9yeV9ydWxlc1wiOiBcIlwiX' 'G4gIH1cbl0iCiAgfQp9', 'headers': [] } ] } } # def test_handler_decode_exception(mock_logger_exception): # """Test handler function exception on decode.""" # kafka_message_value = { # 'schema': { # 'type': 'struct', # 'fields': [ # { # 'type': 'string', # 'optional': True, # 'field': 'KEY' # }, # { # 'type': 'string', # 'optional': False, # 'field': 'VALUE' # } # ], # 'optional': False # }, # 'payload': { # 'KEY': 'bad_key:12345', # 'VALUE': '[\n {\n \"service\": \"meta\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"start_date\": \"2012-11-26T09:11:03+00:00\",\n \"territory_carveouts\": \"\",\n \"territory_rules\": \"\"\n },\n {\n \"service\": \"tiktok\",\n \"star_carveout\": false,\n \"star_rule\": false,\n \"start_date\": \"2012-11-26T09:11:03+00:00\",\n \"territory_carveouts\": \"\",\n \"territory_rules\": \"\"\n }\n]' # noqa: E501 # } # } # kafka_message_base64 = base64.b64encode(json.dumps(kafka_message_value).encode('utf-8')) # test_bad_key_data = { # 'eventSource': 'aws:kafka', # 'eventSourceArn': 'arn:aws:kafka:us-east-1:437795906767:cluster/' # 'qa-managed-kafka-cdc-destination/' # '9d840e30-6e78-4bf7-8ab2-8d788cff806d-6', # 'bootstrapServers': 'b-3.qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094,b-1.qa-managed-kafka-cdc-d.' # '2kgc64.c6.kafka.us-east-1.amazonaws.com:9094,b-2.' # 'qa-managed-kafka-cdc-d.2kgc64.c6.kafka.' # 'us-east-1.amazonaws.com:9094', # 'records': { # 'event.orchardSoundRecording.fingerprintRules-0': [ # { # 'topic': 'event.orchardSoundRecording.fingerprintRules', # 'partition': 0, # 'offset': 0, # 'timestamp': 1660310105818, # 'timestampType': 'CREATE_TIME', # 'key': None, # 'value': kafka_message_base64, # 'headers': [] # } # ] # } # } mock_ows.post_rule.side_effect = Exception('test exc') app.handler(test_vendor_no_carveouts, None) mock_logger_exception.assert_called_once_with('test exc') # with pytest.raises(Exception): # app.handler(test_bad_key_data, None) # mock_logger_exception.assert_called_once_with( # 'Unhandled key "bad_key:12345"')