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

Matcher doesn't match partly URLs #96

Open
Buju77 opened this issue Apr 20, 2018 · 3 comments
Open

Matcher doesn't match partly URLs #96

Buju77 opened this issue Apr 20, 2018 · 3 comments
Labels

Comments

@Buju77
Copy link

Buju77 commented Apr 20, 2018

It seems current version (2.0.1) of matcher doesn't match uri path partly.

Example:

func testPartlyPathMatches() {
    let request = URLRequest(url: URL(string: "https://api.palaverapp.com/some/other/v42/auth/login")!)
    XCTAssertTrue(uri("/auth/login")(request))
}

This test will fail. It seems I always need to specify everything after the host in the uri matcher. This is a bit inconvenient.

Because eg. I as mobile app developer don't want to care how the backend has structured the login endpoint in my tests or which endpoint version it is. I'm only interested in stubbing the login request.

Or did I miss something?

@kylef kylef added the question label Apr 20, 2018
@kylef
Copy link
Owner

kylef commented Apr 20, 2018

It seems current version (2.0.1) of matcher doesn't match uri path partly.

That is intentional, it is designed to be the full URI of full path.

Try the following:

func isLogin(_ request: URLRequest) -> Bool {
  return request.url?.path.hasSuffix("/auth/login") ?? false
}

stub(isLogin, failure(error))

@Buju77
Copy link
Author

Buju77 commented Apr 23, 2018

thx. your suggested solution works, but not very intuitive on first sight. can you please elaborate more on the design decision of only matching full URIs instead of only partly matching?

@Buju77
Copy link
Author

Buju77 commented Apr 26, 2018

I also noticed that it really needs to match the full URI including query parameters, which is very cumbersome in my case. The requests I want to simply mock have lots of query parameters.

My use case:
I want to write integration tests of my whole system. I want to test if our backend sends us a specific error code like 410 with some response body. So in those error case tests, I don't really care about any of those query parameters.

So my workaround is creating this new matcher to partly match the uri

func partUri(_ uri: String) -> (_ request: URLRequest) -> Bool {
    return { (_ request: URLRequest) in
        return request.url?.path.contains(uri) ?? false
    }
}

and then

    let jsonString = """ ... """
    let data = jsonString.data(using: .utf8)!
    stub(partUri("/samples"), jsonData(data, status: 410))

I believe a mocking library should offer a built-in possibility to mock network requests in a very easy and very fast way. This includes only matching part of uri.

eg. instead of using the regex pattern "^\(pattern)$", simply use "\(pattern)" in URITemplate.swift. Maybe add some flags to turn it on/off.

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