from campaigns.meta.models import FacebookPage, FacebookPageLabel from campaigns.meta.repositories import FacebookPageRepository from tests.unit.faker import FakerTyped from tests.unit.types import CreateModel, CreateModelBatch async def test_get_or_none_return_none( facebook_page_repository: FacebookPageRepository, fake: FakerTyped ) -> None: page = await facebook_page_repository.get_or_none(page_id=fake.uuid4_string()) assert page is None async def test_get_or_none_return_page( facebook_page_repository: FacebookPageRepository, create_model: CreateModel ) -> None: page = await create_model(FacebookPage) result = await facebook_page_repository.get_or_none(page_id=page.id) assert result assert result.id == page.id async def test_find_by_identity_id_empty( facebook_page_repository: FacebookPageRepository, fake: FakerTyped ) -> None: identity_id = fake.uuid4_string() pages = await facebook_page_repository.find_by_identity_id(identity_id=identity_id) assert pages == [] async def test_find_by_identity_id( facebook_page_repository: FacebookPageRepository, create_model_batch: CreateModelBatch, fake: FakerTyped, ) -> None: identity_id = fake.uuid4_string() await create_model_batch( FacebookPage, size=3, association__orchard_identity_id=identity_id ) pages = await facebook_page_repository.find_by_identity_id(identity_id=identity_id) assert len(pages) async def test_find_by_vendor_id_subaccount_id_return_none( facebook_page_repository: FacebookPageRepository, ) -> None: result = await facebook_page_repository.find_by_vendor_id_subaccount_id( vendor_id=100, subaccount_id=0 ) assert result == [] async def test_find_by_vendor_id_subaccount_id_vendor( facebook_page_repository: FacebookPageRepository, create_model: CreateModel, fake: FakerTyped, ) -> None: vendor_id_1 = 100 vendor_id_2 = 200 page_1 = await create_model(FacebookPage) await create_model( FacebookPageLabel, page=page_1, vendor_id=vendor_id_1, subaccount_id=0 ) page_2 = await create_model(FacebookPage) await create_model( FacebookPageLabel, page=page_2, vendor_id=vendor_id_2, subaccount_id=0 ) result = await facebook_page_repository.find_by_vendor_id_subaccount_id( vendor_id=vendor_id_2, subaccount_id=0 ) assert result assert len(result) == 1 assert result[0].id == page_2.id async def test_find_by_vendor_id_subaccount_id_subaccount( facebook_page_repository: FacebookPageRepository, create_model: CreateModel, fake: FakerTyped, ) -> None: vendor_id = 100 subaccount_id = 2000 page_shared_with_vendor = await create_model(FacebookPage) await create_model( FacebookPageLabel, page=page_shared_with_vendor, vendor_id=vendor_id, subaccount_id=0, ) page_shared_with_subaccount = await create_model(FacebookPage) await create_model( FacebookPageLabel, page=page_shared_with_subaccount, vendor_id=vendor_id, subaccount_id=subaccount_id, ) result = await facebook_page_repository.find_by_vendor_id_subaccount_id( vendor_id=vendor_id, subaccount_id=subaccount_id ) assert result assert len(result) == 1 assert result[0].id == page_shared_with_subaccount.id async def test_find_by_vendor_id_subaccount_id_vendor_has_access_to_subaccount_pages( facebook_page_repository: FacebookPageRepository, create_model: CreateModel, fake: FakerTyped, ) -> None: vendor_id = 100 subaccount_id = 2000 page_shared_with_vendor = await create_model(FacebookPage) await create_model( FacebookPageLabel, page=page_shared_with_vendor, vendor_id=vendor_id, subaccount_id=0, ) page_shared_with_subaccount = await create_model(FacebookPage) await create_model( FacebookPageLabel, page=page_shared_with_subaccount, vendor_id=vendor_id, subaccount_id=subaccount_id, ) result = await facebook_page_repository.find_by_vendor_id_subaccount_id( vendor_id=vendor_id, subaccount_id=0, ) page_ids = [page.id for page in result] assert result assert len(result) == 2 assert page_shared_with_vendor.id in page_ids assert page_shared_with_subaccount.id in page_ids async def test_find_by_vendor_id_subaccount_id_is_manageable( facebook_page_repository: FacebookPageRepository, create_model: CreateModel, fake: FakerTyped, ) -> None: vendor_id = 100 manageable_page = await create_model(FacebookPage, is_manageable=True) await create_model(FacebookPageLabel, page=manageable_page, vendor_id=vendor_id) not_manageable_page = await create_model(FacebookPage, is_manageable=False) await create_model(FacebookPageLabel, page=not_manageable_page, vendor_id=vendor_id) result = await facebook_page_repository.find_by_vendor_id_subaccount_id( vendor_id=vendor_id, subaccount_id=0, is_manageable=True ) assert result assert len(result) == 1 assert result[0].id == manageable_page.id async def test_get_by_vendor_id_subaccount_id_or_none_return_none( facebook_page_repository: FacebookPageRepository, fake: FakerTyped ) -> None: page = await facebook_page_repository.get_by_vendor_id_subaccount_id_or_none( page_id=fake.uuid4_string(), vendor_id=fake.integer(), subaccount_id=0 ) assert page is None async def test_get_by_vendor_id_subaccount_id_or_none_return_by_vendor( facebook_page_repository: FacebookPageRepository, create_model: CreateModel, fake: FakerTyped, ) -> None: vendor_id = fake.integer() page_label = await create_model(FacebookPageLabel, vendor_id=vendor_id) page = await facebook_page_repository.get_by_vendor_id_subaccount_id_or_none( page_id=page_label.page_id, vendor_id=vendor_id, subaccount_id=0 ) assert page assert page.id == page_label.page_id async def test_get_by_vendor_id_subaccount_id_or_none_return_by_subaccount( facebook_page_repository: FacebookPageRepository, create_model: CreateModel, fake: FakerTyped, ) -> None: vendor_id = fake.integer() subaccount_id = fake.integer() page_label = await create_model( FacebookPageLabel, vendor_id=vendor_id, subaccount_id=subaccount_id ) page = await facebook_page_repository.get_by_vendor_id_subaccount_id_or_none( page_id=page_label.page_id, vendor_id=vendor_id, subaccount_id=subaccount_id ) assert page assert page.id == page_label.page_id async def test_get_by_vendor_id_subaccount_id_or_none_return_one_when_shared_with_multiple( facebook_page_repository: FacebookPageRepository, create_model: CreateModel, fake: FakerTyped, ) -> None: vendor_id = fake.integer() subaccount_id = fake.integer() page = await create_model(FacebookPage) # Share the Page with a Vendor await create_model( FacebookPageLabel, page=page, vendor_id=vendor_id, subaccount_id=0 ) # Share the Page with a Subaccount under this Vendor await create_model( FacebookPageLabel, page=page, vendor_id=vendor_id, subaccount_id=subaccount_id ) result = await facebook_page_repository.get_by_vendor_id_subaccount_id_or_none( page_id=page.id, vendor_id=vendor_id, subaccount_id=0 ) assert result == page