-
Notifications
You must be signed in to change notification settings - Fork 47
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TDL-15168: Use unique_line_item_id
for invoice updates' lines value instead of id
#134
Merged
namrata270998
merged 7 commits into
crest-master
from
TDL-15168-update-id-for-invoice-line-items
May 27, 2022
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
6508646
updated id field for invoice line items
406194d
resolve integration test error
f0dff09
updated code to handle null invoice_item for invoice line items
baa485a
resolved merge conflicts
f1ff1a8
resolve review comments
3b3935a
resolved CCi failure
8574501
Merge branch 'crest-master' of https://github.com/singer-io/tap-strip…
namrata270998 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,283 @@ | ||
import unittest | ||
from unittest import mock | ||
import tap_stripe | ||
|
||
# mock invoice line items | ||
class MockLines: | ||
def __init__(self, data): | ||
self.data = data | ||
|
||
def to_dict_recursive(self): | ||
return self.data | ||
|
||
# mock invoice | ||
class MockInvoice: | ||
def __init__(self, lines): | ||
self.lines = lines | ||
self.id = "inv_testinvoice" | ||
|
||
# mock transform function | ||
def transform(*args, **kwargs): | ||
# return the data with was passed for transformation in the argument | ||
return args[0] | ||
|
||
@mock.patch("singer.Transformer.transform") | ||
@mock.patch("tap_stripe.Context.get_catalog_entry") | ||
@mock.patch("tap_stripe.Context.new_counts") | ||
@mock.patch("tap_stripe.Context.updated_counts") | ||
class InvoiceLineItemId(unittest.TestCase): | ||
""" | ||
Test cases to verify the invoice line items 'id' is used as expected when syncing 'event updates' | ||
""" | ||
|
||
def test_no_events_updates(self, mocked_new_counts, mocked_updated_counts, mocked_get_catalog_entry, mocked_transform): | ||
""" | ||
Test case to verify no data should be changed when function is not called with 'event updates' | ||
""" | ||
# mock transform | ||
mocked_transform.side_effect = transform | ||
# create line items dummy data | ||
lines = [ | ||
MockLines({ | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"unique_id": "il_testlineitem" | ||
}) | ||
] | ||
|
||
# function call when 'updates=False' | ||
tap_stripe.sync_sub_stream("invoice_line_items", MockInvoice(lines), False) | ||
|
||
# expected data | ||
expected_record = { | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"unique_id": "il_testlineitem", | ||
"invoice": "inv_testinvoice" | ||
} | ||
# get args for transform function | ||
args, kwargs = mocked_transform.call_args | ||
# verify the data is not changed as function was not called with updates | ||
self.assertEqual(expected_record, args[0]) | ||
|
||
def test_no_unique_id(self, mocked_new_counts, mocked_updated_counts, mocked_get_catalog_entry, mocked_transform): | ||
""" | ||
Test case to verify no data should be changed when invoice line item data does not contain 'unique_id' | ||
""" | ||
# mock transform | ||
mocked_transform.side_effect = transform | ||
# create line items dummy data | ||
lines = [ | ||
MockLines({ | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem" | ||
}) | ||
] | ||
|
||
# function call | ||
tap_stripe.sync_sub_stream("invoice_line_items", MockInvoice(lines), True) | ||
|
||
# expected data | ||
expected_record = { | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"invoice": "inv_testinvoice" | ||
} | ||
# get args for transform function | ||
args, kwargs = mocked_transform.call_args | ||
# verify the data is not changed as not 'unique_id' is present | ||
self.assertEqual(expected_record, args[0]) | ||
|
||
def test_no_updates_and_unique_id(self, mocked_new_counts, mocked_updated_counts, mocked_get_catalog_entry, mocked_transform): | ||
""" | ||
Test case to verify no data should be changed when invoice line item data | ||
does not contain 'unique_id' and function is not called with 'event updates' | ||
""" | ||
# mock transform | ||
mocked_transform.side_effect = transform | ||
# create line items dummy data | ||
lines = [ | ||
MockLines({ | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem" | ||
}) | ||
] | ||
|
||
# function call with 'updates=False' | ||
tap_stripe.sync_sub_stream("invoice_line_items", MockInvoice(lines), False) | ||
|
||
# expected data | ||
expected_record = { | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"invoice": "inv_testinvoice" | ||
} | ||
# get args for tranform function | ||
args, kwargs = mocked_transform.call_args | ||
# verify the data is not changed as the function was not called with updates and not unique_id is present | ||
self.assertEqual(expected_record, args[0]) | ||
|
||
def test_invoiceitem_with_invoice_item(self, mocked_new_counts, mocked_updated_counts, mocked_get_catalog_entry, mocked_transform): | ||
""" | ||
Test case to verify 'unique_id' is used as 'id' value when invoice line item type is 'invoiceitem' | ||
""" | ||
# mock transform | ||
mocked_transform.side_effect = transform | ||
# create line items dummy data | ||
lines = [ | ||
MockLines({ | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"unique_id": "il_testlineitem" | ||
}) | ||
] | ||
|
||
# function call with updates | ||
tap_stripe.sync_sub_stream("invoice_line_items", MockInvoice(lines), True) | ||
|
||
# expected data | ||
expected_record = { | ||
"id": "il_testlineitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"unique_id": "il_testlineitem", | ||
"invoice": "inv_testinvoice" | ||
} | ||
# get args for transform function | ||
args, kwargs = mocked_transform.call_args | ||
# verify the unique_id's value is used as 'id' | ||
self.assertEqual(expected_record, args[0]) | ||
|
||
def test_invoiceitem_without_invoice_item(self, mocked_new_counts, mocked_updated_counts, mocked_get_catalog_entry, mocked_transform): | ||
""" | ||
Test case to verify 'unique_id' is used as 'id' and 'invoice_item' field | ||
contains 'id' value when invoice line item type is 'invoiceitem' | ||
""" | ||
# mock transform | ||
mocked_transform.side_effect = transform | ||
# create line items dummy data | ||
lines = [ | ||
MockLines({ | ||
"id": "ii_testinvoiceitem", | ||
"object": "line_item", | ||
"invoice_item": None, | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"unique_id": "il_testlineitem" | ||
}) | ||
] | ||
|
||
# function call with updates | ||
tap_stripe.sync_sub_stream("invoice_line_items", MockInvoice(lines), True) | ||
|
||
# expected data | ||
expected_record = { | ||
"id": "il_testlineitem", | ||
"object": "line_item", | ||
"invoice_item": "ii_testinvoiceitem", | ||
"subscription": "sub_testsubscription", | ||
"type": "invoiceitem", | ||
"unique_id": "il_testlineitem", | ||
"invoice": "inv_testinvoice" | ||
} | ||
# get args for transform function | ||
args, kwargs = mocked_transform.call_args | ||
# verify the unique_id's value is used as 'id' and id's value is used as 'invoice_item' value | ||
self.assertEqual(expected_record, args[0]) | ||
|
||
def test_subscription_without_subscription(self, mocked_new_counts, mocked_updated_counts, mocked_get_catalog_entry, mocked_transform): | ||
""" | ||
Test case to verify 'unique_id' is used as 'id' and 'subscription' field | ||
contains the 'id' value when invoice line item type is 'subscription' | ||
""" | ||
# mock transform | ||
mocked_transform.side_effect = transform | ||
# create line items dummy data | ||
lines = [ | ||
MockLines({ | ||
"id": "sub_testsubscription", | ||
"object": "line_item", | ||
"subscription": None, | ||
"type": "subscription", | ||
"unique_id": "il_testlineitem", | ||
"unique_line_item_id": "sli_testsublineitem" | ||
}) | ||
] | ||
|
||
# function call with updates | ||
tap_stripe.sync_sub_stream("invoice_line_items", MockInvoice(lines), True) | ||
|
||
# expected data | ||
expected_record = { | ||
"id": "il_testlineitem", | ||
"object": "line_item", | ||
"subscription": "sub_testsubscription", | ||
"type": "subscription", | ||
"unique_id": "il_testlineitem", | ||
"unique_line_item_id": "sli_testsublineitem", | ||
"invoice": "inv_testinvoice" | ||
} | ||
# get args for transform function | ||
args, kwargs = mocked_transform.call_args | ||
# verify the unique_id's value is used as 'id' and id's value is used as 'subscription' value | ||
self.assertEqual(expected_record, args[0]) | ||
|
||
def test_subscription_with_subscription(self, mocked_new_counts, mocked_updated_counts, mocked_get_catalog_entry, mocked_transform): | ||
""" | ||
Test case to verify 'unique_id' is used as 'id' and 'subscription' | ||
field is not updated when invoice line item type is 'subscription' | ||
""" | ||
# mock transform | ||
mocked_transform.side_effect = transform | ||
# create line items dummy data | ||
lines = [ | ||
MockLines({ | ||
"id": "sli_1KJvqbDcBSxinnbLvE4qMiJV", | ||
"object": "line_item", | ||
"subscription": "sub_testsubscription", | ||
"type": "subscription", | ||
"unique_id": "il_testlineitem", | ||
"unique_line_item_id": "sli_testsublineitem" | ||
}) | ||
] | ||
|
||
# function call with updates | ||
tap_stripe.sync_sub_stream("invoice_line_items", MockInvoice(lines), True) | ||
|
||
# expected data | ||
expected_record = { | ||
"id": "il_testlineitem", | ||
"object": "line_item", | ||
"subscription": "sub_testsubscription", | ||
"type": "subscription", | ||
"unique_id": "il_testlineitem", | ||
"unique_line_item_id": "sli_testsublineitem", | ||
"invoice": "inv_testinvoice" | ||
} | ||
# get args for transform function | ||
args, kwargs = mocked_transform.call_args | ||
# verify the unique_id's value is used as 'id' | ||
self.assertEqual(expected_record, args[0]) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add a general comment here regarding which field's value moves to another field and all or write one sample example for both records(old and new) with changed field values.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added comment.