async def test_delete_one_artifact():
    ts = time.perf_counter()
    bprint('Test: Delete One Artifact')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        results = await pac.get_records(
            ArtifactQuery(filter={'_filter_type': '"test"'}))
        ids = [c['id'] for c in results.success]
        aid = choice(ids)

        results = await pac.delete_records(query=[ArtifactQuery(id=aid)])
        # print(results)

        assert type(results) is Results
        assert len(results.success) == 1
        assert not results.failure
        assert results.success

        tprint(results)

        print('\nVerify Results from Phantom')
        results = await pac.get_records(query=ArtifactQuery(
            filter={'_filter_id': aid}))

        assert not results.success
        assert not results.failure

        tprint(results)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_delete_many_artifacts():
    ts = time.perf_counter()
    bprint('Test: Delete Many Artifacts')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        results = await pac.get_records(
            ArtifactQuery(filter={'_filter_type': '"test"'}))
        ids = [c['id'] for c in results.success]
        aids = [choice(ids), choice(ids)]
        # print(results)

        while aids[0] == aids[1]:
            aids[1] = choice(ids)

        results = await pac.delete_records(
            query=[ArtifactQuery(id=aid) for aid in aids])

        assert type(results) is Results
        assert len(results.success) == 2
        assert not results.failure
        assert results.success[0]['success']

        tprint(results)

        print('\nVerify Results from Phantom')
        results = await pac.get_records(query=ArtifactQuery(
            filter={'_filter_id__in': str(aids)}))

        assert not results.success
        assert not results.failure

        tprint(results)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_get_all_container_artifacts_date_filtered():
    # TODO: This is hard to test since we don't know what artifacts we'll encounter.

    ts = time.perf_counter()
    bprint('Test: Get All Container Artifacts Date Filtered')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        f = {'_filter_type': '"test"'}
        results = await pac.get_record_count(ArtifactQuery(filter=f))
        unfiltered = results.success[0]['count']
        assert unfiltered

        print(f'Found {unfiltered} unfiltered containers.')

        results = await pac.get_records(
            ArtifactQuery(date_filter_start='2019-09-10',
                          date_filter_field='create_time',
                          filter=f))
        filtered = len(results.success)
        print(f'Found {filtered} filtered containers.')

        assert type(results) is Results
        assert len(results.success) >= 1
        assert not results.failure
        assert unfiltered > filtered

        tprint(results, top=5)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_update_one_artifact():
    ts = time.perf_counter()
    bprint('Test: Update One Artifact')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        container = generate_container(artifact_count=1)[0]
        artifact = container.artifacts[0]
        rid = artifact.data['request_id']
        artifact.clear()
        artifact.data = {'request_id': rid}
        artifact.name = 'Update Test'

        results = await pac.get_records(
            ArtifactQuery(filter={'_filter_type': '"test"'}))
        ids = [c['id'] for c in results.success]
        aid = choice(ids)
        artifact.update_id(aid)

        print(f'Artifact: {aid}\n\t->{artifact}')

        results = await pac.update_records(requests=[artifact])
        # print(response_results)

        assert type(results) is Results
        assert len(results.success) == 1
        assert not results.failure
        assert results.success
        assert results.success[0]['success']

        tprint(results)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_delete_all_container_artifacts():
    ts = time.perf_counter()
    bprint('Test: Delete All Container Artifacts')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        results = await pac.get_records(
            query=ContainerQuery(page=0, page_size=50))
        ids = [c['id'] for c in results.success if c['artifact_count'] > 1]
        cid = choice(ids)

        print(f'Container: {cid}')

        results = await pac.get_record_count(ArtifactQuery(container_id=cid))
        count = results.success[0]['count']

        results = await pac.get_records(ArtifactQuery(container_id=cid))
        # print(results)

        assert type(results) is Results
        assert len(results.success) == count
        assert not results.failure

        tprint(results, top=5)

        aids = [a['id'] for a in results.success]

        results = await pac.delete_records(
            query=[ArtifactQuery(id=aid) for aid in aids])

        tprint(results, top=5)

        print('\nVerify Results from Phantom')
        results = await pac.get_records(query=ArtifactQuery(
            filter={'_filter_id__in': str(aids)}))

        assert not results.success
        assert not results.failure

        tprint(results)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_get_all_artifacts_filtered():
    ts = time.perf_counter()
    bprint('Test: Get All Artifacts Filtered')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        f = {'_filter_type': '"test"'}
        results = await pac.get_record_count(ArtifactQuery(filter=f))
        count = results.success[0]['count']
        assert count

        results = await pac.get_records(ArtifactQuery(filter=f))
        # print(results)

        assert type(results) is Results
        assert len(results.success) == count
        assert not results.failure

        tprint(results, top=5)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_get_one_artifact():
    ts = time.perf_counter()
    bprint('Test: Get One Artifact')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        results = await pac.get_records(query=ArtifactQuery(
            page=0, page_size=50, filter={'_filter_type': '"test"'}))
        ids = [c['id'] for c in results.success]
        aid = choice(ids)
        print(f'Artifact: {aid}')

        results = await pac.get_records(ArtifactQuery(id=6143278))

        assert type(results) is Results
        assert len(results.success) == 1
        assert not results.failure

        tprint(results)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_get_all_artifacts_count_filtered():
    ts = time.perf_counter()
    bprint('Test: Get All Artifacts Count Filtered')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        results = await pac.get_record_count(ArtifactQuery())
        unfiltered = results.success[0]['count']

        results = await pac.get_record_count(
            ArtifactQuery(filter={'_filter_type': '"test"'}))
        filtered = results.success[0]['count']
        # print(results)

        assert type(results) is Results
        assert len(results.success) == 1
        assert not results.failure
        assert unfiltered > filtered

        tprint(results)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_get_all_container_artifacts():
    ts = time.perf_counter()
    bprint('Test: Get All Container Artifacts')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        results = await pac.get_records(
            query=ContainerQuery(page=0, page_size=50))
        ids = [c['id'] for c in results.success if c['artifact_count'] > 1]
        cid = choice(ids)

        results = await pac.get_record_count(ArtifactQuery(container_id=cid))
        count = results.success[0]['count']

        results = await pac.get_records(ArtifactQuery(container_id=cid))
        # print(results)

        assert type(results) is Results
        assert len(results.success) == count
        assert not results.failure

        tprint(results, top=5)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_get_all_artifacts_count():
    ts = time.perf_counter()
    bprint('Test: Get All Artifacts Count')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        results = await pac.get_record_count(ArtifactQuery())
        # print(results)

        assert type(results) is Results
        assert len(results.success) >= 1
        assert not results.failure

        tprint(results)  # Should return all artifacts across all containers

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')
async def test_update_many_artifacts():
    ts = time.perf_counter()
    bprint('Test: Update Many Artifacts')

    async with PhantomApiClient(
            cfg=f'{getenv("CFG_HOME")}/phantom_api_client.toml') as pac:
        container = generate_container(artifact_count=2)[0]
        artifacts = container.artifacts
        rids = [a.data['request_id'] for a in artifacts]
        [a.clear() for a in artifacts]

        results = await pac.get_records(
            ArtifactQuery(filter={'_filter_type': '"test"'}))
        ids = [c['id'] for c in results.success]
        aids = [choice(ids), choice(ids)]

        while aids[0] == aids[1]:
            aids[1] = choice(ids)

        print(f'Artifacts: {aids}')

        for i, a in enumerate(artifacts):
            a.data = {'request_id': rids[i]}
            a.name = f'Update Test: {i}'
            a.update_id(aids[i])

        results = await pac.update_records(artifacts)
        # print(response_results)

        assert type(results) is Results
        assert len(results.success) == 2
        assert not results.failure
        assert results.success
        assert results.success[0]['success']

        tprint(results)

    bprint(f'-> Completed in {(time.perf_counter() - ts):f} seconds.')