Skip to content
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

Asynchronous/Messages metadata validation fail #543

Open
1 task done
flipcc opened this issue Feb 6, 2024 · 0 comments
Open
1 task done

Asynchronous/Messages metadata validation fail #543

flipcc opened this issue Feb 6, 2024 · 0 comments

Comments

@flipcc
Copy link

flipcc commented Feb 6, 2024

Description

I was trying to provider-side verify a customer pact file, when noticing that my current local testing setup must fail, because it does not include meta attributes in contrast to the actual pub-sub resources. But it did not fail, it just did not verify them.

The verification is important, as faning out by SNS->multiple SQS is often realized by using filters on meta attributes.

To reproduce my error I adopted your examples provided in this repo (a big thank you at this point for providing examples!).

Steps to reproduce

(1) consumer test:

"""pact test for a message consumer"""

import logging
import time
from os import remove
from os.path import isfile

import pytest
from pact import MessageConsumer
from pact import Provider

log = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

PACT_DIR = "pacts"

CONSUMER_NAME = "DetectContentLambda"
PROVIDER_NAME = "ContentProvider"
PACT_FILE = (
    f"{PACT_DIR}/{CONSUMER_NAME.lower().replace(' ', '_')}-"
    + f"{PROVIDER_NAME.lower().replace(' ', '_')}.json"
)


@pytest.fixture(scope="session")
def pact(request):
    pact = MessageConsumer(CONSUMER_NAME).has_pact_with(
        Provider(PROVIDER_NAME),
        publish_to_broker=False,
        pact_dir=PACT_DIR,
    )

    yield pact


def cleanup_json(file):
    """
    Remove existing json file before test if any
    """
    if isfile(f"{file}"):
        remove(f"{file}")


def progressive_delay(file, time_to_wait=10, second_interval=0.5, verbose=False):
    """
    progressive delay
    defaults to wait up to 5 seconds with 0.5 second intervals
    """
    time_counter = 0
    while not isfile(file):
        time.sleep(second_interval)
        time_counter += 1
        if verbose:
            print(f"Trying for {time_counter * second_interval} seconds")
        if time_counter > time_to_wait:
            if verbose:
                print(f"Already waited {time_counter * second_interval} seconds")
            break


def test_put_file(pact):
    cleanup_json(PACT_FILE)

    expected_event = {
        "event": "ObjectCreated:Put",
        "documentName": "document.doc",
        "creator": "TP",
        "documentType": "microsoft-word",
    }

    (
        pact.given("A document created successfully")
        .expects_to_receive("Description")
        .with_content(expected_event)
        .with_metadata(
            {"Content-Type": "application/json", "Additional-Key": "to test with"}
        )
    )

    with pact:
        print("\nRunning test.")

    progressive_delay(f"{PACT_FILE}")
    assert isfile(f"{PACT_FILE}") == 1

(2) subsequently provider test:

from pact import MessageProvider

PACT_DIR = "pacts"


def document_created_handler():
    return {
        "event": "ObjectCreated:Put",
        "documentName": "document.doc",
        "creator": "TP",
        "documentType": "microsoft-word",
    }


def test_verify_success():
    provider = MessageProvider(
        message_providers={
            "A document created successfully": document_created_handler,
        },
        provider="ContentProvider",
        consumer="DetectContentLambda",
        pact_dir="pacts",
    )
    with provider:
        provider.verify()

results in:

test_msg_provider.py::test_verify_success PASSED                         

[100%]pact WARN: Please note: we are tracking events anonymously to gather important usage statistics like Pact-Ruby version and operating system. To disable tracking, set the 'PACT_DO_NOT_TRACK' environment variable to 'true'.
INFO: Reading pact at pacts/detectcontentlambda-contentprovider.json

Verifying a pact between DetectContentLambda and ContentProvider
  Given A document created successfully
    Description
WARN: Skipping set up for provider state 'A document created successfully' for consumer 'DetectContentLambda' as there is no --provider-states-setup-url specified.
      has matching content

1 interaction, 0 failures

Expected behavior

A failure is expected in the form of:

Verifying a pact between DetectContentLambda and ContentProvider
  Given A document created successfully
    has matching metadata
        Expected message metada "Additional-Key" to have value  "to test with" but was ""

There were 1 pact failures

Actual behavior

The test succeeds without verifying the metadata attributes.

Your environment

Adapted the examples from examples/message/tests.

Self-service

  • I'd be willing to fix this bug myself.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant