'firstName'               : 'Fred',
    'lastName'                : 'Flintstone',
    'phoneNumber'             : '+1-222-333-4444',
    'email'                   : '*****@*****.**',
    'streetAddressOfBuilding' : '123 Rocky Way',
    'city'                    : 'Bedrock',
    'stateProvince'           : 'ZZ',
    'country'                 : 'ZZ',
    'postalCode'              : '00000',
    'latitude'                : 11.1111,
    'longitude'               : -11.1111,
    # products purchased
    'productsPurchased'       : prods_purchased
})

# test blank product entity
purchase = Purchase(True)
print("\nBlank Purchase Entity")
print('Transaction ID: ' + purchase.getKey())
print('Date: ' + purchase.get('dateOfPurchase'))
print('Customer: ' + purchase.getCustomerName())
print(purchase.toJson())

# test purchase entity initialized from dictionary
purchase = Purchase(doc)
print("\nPurchase Entity Initialized from Dictionary")
print('Transaction ID: ' + purchase.getKey())
print('Date: ' + purchase.get('dateOfPurchase'))
print('Customer: ' + purchase.getCustomerName())
print(purchase.toJson())
class TestPurchase(unittest.TestCase):

    purchaseFromDict = None
    purchaseDefaults = None
    purchaseFromJson = None

    testDict = dict({
        # purchase info
        'transactionId':
        '00000000',
        'dateOfPurchase':
        '2020-01-01',
        'extendedPrice':
        1724.94,
        # customer info
        'customerKey':
        '00000000',
        'firstName':
        'Fred',
        'lastName':
        'Flintstone',
        'phoneNumber':
        '+1-222-333-4444',
        'email':
        '*****@*****.**',
        'streetAddressOfBuilding':
        '123 Rocky Way',
        'city':
        'Bedrock',
        'stateProvince':
        'ZZ',
        'country':
        'ZZ',
        'postalCode':
        '00000',
        'latitude':
        11.1111,
        'longitude':
        -11.1111,
        # products purchased
        'productsPurchased': [{
            'productKey': 'AAA111',
            'qtyPurchased': 111,
            'skuNumber': '11111',
            'category': 'AAA',
            'title': 'TEST AAA',
            'price': 1.11
        }, {
            'productKey': 'BBB222',
            'qtyPurchased': 222,
            'skuNumber': '22222',
            'category': 'BBB',
            'title': 'TEST BBB',
            'price': 2.22
        }, {
            'productKey': 'CCC333',
            'qtyPurchased': 333,
            'skuNumber': '33333',
            'category': 'CCC',
            'title': 'TEST CCC',
            'price': 3.33
        }]
    })

    testJson = '''{
        "transactionId"           : "00000000",
        "dateOfPurchase"          : "2020-01-01",
        "extendedPrice"           : 1724.94,
        "customerKey"             : "00000000",
        "firstName"               : "Fred",
        "lastName"                : "Flintstone",
        "phoneNumber"             : "+1-222-333-4444",
        "email"                   : "*****@*****.**",
        "streetAddressOfBuilding" : "123 Rocky Way",
        "city"                    : "Bedrock",
        "stateProvince"           : "ZZ",
        "country"                 : "ZZ",
        "postalCode"              : "00000",
        "latitude"                : 11.1111,
        "longitude"               : -11.1111,
        "productsPurchased"       : [
            {"productKey":"AAA111","qtyPurchased":111,"skuNumber":"11111","category":"AAA","title":"TEST AAA","price":1.11},
            {"productKey":"BBB222","qtyPurchased":222,"skuNumber":"22222","category":"BBB","title":"TEST BBB","price":2.22},
            {"productKey":"CCC333","qtyPurchased":333,"skuNumber":"33333","category":"CCC","title":"TEST CCC","price":3.33}
        ]
    }'''

    def setUp(self):
        self.purchaseFromDict = Purchase(self.testDict)
        self.purchaseDefaults = Purchase(True)
        self.purchaseFromJson = Purchase(self.testJson)

    def test_purchase_from_dict(self):
        expected = '00000000'
        actual = self.purchaseFromDict.getKey()
        self.assertEqual(expected, actual)

    def test_purchase_from_dict_get_and_set(self):
        self.purchaseFromDict.set('skuNumber', '99999999')
        expected = '99999999'
        actual = self.purchaseFromDict.get('skuNumber')
        self.assertEqual(expected, actual)

    def test_purchase_from_dict_to_json(self):
        expected = self.purchaseFromDict
        actual = self.purchaseFromJson
        self.assertEqual(expected, actual)

    def test_purchase_from_json(self):
        expected = '00000000'
        actual = self.purchaseFromJson.getKey()
        self.assertEqual(expected, actual)

    def test_purchase_from_blank(self):
        expected = ''
        actual = self.purchaseDefaults.getKey()
        self.assertEqual(expected, actual)