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

Query string match on DateTimeOffset is not working #347

Closed
viktorpeacock opened this issue Sep 19, 2019 · 9 comments
Closed

Query string match on DateTimeOffset is not working #347

viktorpeacock opened this issue Sep 19, 2019 · 9 comments
Labels

Comments

@viktorpeacock
Copy link

viktorpeacock commented Sep 19, 2019

Hi,

I am sending two values via a query string and I am trying to configure wiremock to respond when these two values come through. First is an int and it works fine. Second is a DateTimeOffset in the following format:

"yyyy-MM-ddTHH\\:mm\\:ss.fffzzz"

I have tried using the ExactValue matcher as so:

public static void AddQueryStringValueMatch(this RequestModel requestModel, KeyValuePair<string, string> queryStringItem)
        {
            var queryStringMatch = new ParamModel
            {
                IgnoreCase = true,
                Name = queryStringItem.Key,
                Matchers = new[]
                {
                    new MatcherModel
                    {
                        Name = "ExactMatcher",
                        Pattern = queryStringItem.Value,
                        IgnoreCase = true,
                        RejectOnMatch = false
                    }
                }
            };

            if (requestModel.Params == null)
                requestModel.Params = new List<ParamModel>();

            requestModel.Params.Add(queryStringMatch);
        }

This does not work and the following is returned from the wiremock:

[Error] : HttpStatusCode set to 400 System.ArgumentException: values
at WireMock.Validation.Check.HasNoNulls[T](IList1 value, String parameterName) at WireMock.Matchers.ExactMatcher..ctor(MatchBehaviour matchBehaviour, String[] values) at WireMock.Serialization.MatcherMapper.Map(MatcherModel matcher) at System.Linq.Enumerable.SelectArrayIterator2.MoveNext()
at System.Linq.Enumerable.CastIterator[TResult](IEnumerable source)+MoveNext()
at System.Collections.Generic.LargeArrayBuilder1.AddRange(IEnumerable1 items)
at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)
at WireMock.Server.FluentMockServer.InitRequestBuilder(RequestModel requestModel, Boolean pathOrUrlRequired)
at WireMock.Server.FluentMockServer.DeserializeAndAddOrUpdateMapping(MappingModel mappingModel, Nullable`1 guid, String path)
at WireMock.Server.FluentMockServer.MappingsPost(RequestMessage requestMessage)

However, when I use a standard dateTimeOffset.ToString(), then it works fine and the following is configured:

 {
          "Name": "dateTime",
          "IgnoreCase": true,
          "Matchers": [
            {
              "Name": "ExactMatcher",
              "Pattern": "6/20/2021 5:16:56 AM +01:00"
            }
          ]
        }

Is there any guidance/examples on how to work with datetime/datetimeoffset in a specific format? I thought it would treat it just like any other string.

@StefH
Copy link
Collaborator

StefH commented Sep 19, 2019

The issue is that when you post a mapping like this:

"Params": [
            {
                "Name": "dateTime",
                "Matchers": [
                    {
                        "Name": "ExactMatcher",
                        "Pattern": "2019-09-19T18:02:31.7039950+02:00"
                    }
                ]
            }
        ]

The string value 2019-09-19T18:02:31.7039950+02:00 is actually converted to real DateTime, this means that some code fails.

I'll investigate if this can be solved.

@viktorpeacock
Copy link
Author

Thank you. I was looking through code myself but it's difficult to get up to speed with it as I don't know how it all fits together. Maybe in future you could give a high level overview of the solution so that others can get up and running and contribute :-) thank you!

@StefH
Copy link
Collaborator

StefH commented Sep 19, 2019

I've made a fix.

Can you please try MyGet version : WireMock.Net.1.0.32-ci-11907

Can be tested with request like:
http://xxx/param2?dateTime=2019-09-19T18:02:31.7039950%2B02:00

@viktorpeacock
Copy link
Author

Thank you for such a fast turnaround! Can you please update a Docker image as we use this in K8s to simulate our dependencies?

@StefH StefH removed the question label Sep 20, 2019
@StefH
Copy link
Collaborator

StefH commented Sep 20, 2019

I'll create a new official version tonight and also a new docker.

@StefH StefH closed this as completed Sep 20, 2019
@StefH StefH reopened this Sep 20, 2019
@StefH
Copy link
Collaborator

StefH commented Sep 20, 2019

@viktorpeacock : do double check : did you test it ?

@viktorpeacock
Copy link
Author

Hi Stef,

Yes. The following configuration and request worked for me:

[
  {
    "Guid": "1f4764d6-db9e-44c6-a78b-794cb13dee72",
    "Request": {
      "Path": {
        "Matchers": [
          {
            "Name": "WildcardMatcher",
            "Pattern": "/test",
            "IgnoreCase": false
          }
        ]
      },
      "Methods": [
        "GET"
      ],
      "Params": [
        {
          "Name": "dateTime",
          "IgnoreCase": true,
          "Matchers": [
            {
              "Name": "ExactMatcher",
              "Pattern": "2019-09-20T11:03:17.221+00:00"
            }
          ]
        }
      ]
    },
    "Response": {
      "StatusCode": 200,
      "BodyDestination": "SameAsSource",
      "Body": "{ \"result\": \"2019-09-20T11:03:17.221+00:00}",
      "Headers": {
        "Content-Type": "application/json"
      }
    }
  }
]

Request: http://localhost:9092/test?dateTime=2019-09-20T11%3A03%3A17.221%2B00%3A00

Response: { "result": "2019-09-20T11:03:17.221+00:00}

@StefH
Copy link
Collaborator

StefH commented Sep 20, 2019

I'll create a new official version tonight and also a new docker.

@StefH StefH closed this as completed Sep 20, 2019
@viktorpeacock
Copy link
Author

You are a star! Thank you very much :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants