How to use regex in AngularJS $httpBackend ExpectGET
Asked Answered
T

2

13

I'm passing a url as a parameter in a $resource GET request. Angular is url encoding this parameter and matching the request in the $httpBackend.expectGET method is finicky.

I see that you can use regular expressions to match the expected request but can't get it to work. I'd like to match the resource location but with any "uri" query string parameter value.

Ctrl

var resource = $resource('../api/lookup');
resource.get({ uri: "http://www.something.com" }, function (data) {
  // do something
});

Test

// mock out the $httpBackend response

$httpBackend.expectGET(/\.\.\/api\/lookup\?uri=.*/)).respond(200, { Response: "a response" });

// call my test method here

// ensure the $httpBackend work is done
$rootScope.$apply();
$httpBackend.flush();

// do assertions

Karma Output

Error: Unexpected request: GET ../api/lookup?uri=http%3A%2F%2Fwww.something.com

Expected GET /../api/lookup?uri=.*/

Can anyone see why my regex isn't being matched?

Edit

Even after improving the regex as suggested I couldn't get this working using the '$var' injection syntax. I rewrote the tests, injecting the dependencies with the inject function and ensuring the order of my test arrangement was correct. Now it's working like a charm!

Turpin answered 21/10, 2013 at 14:29 Comment(0)
J
8

You need to escape the question mark in your regex.

Without escaping it, you're just marking the token prior to it as optional.

> test = "../api/lookup?uri=http%3A%2F%2Fwww.something.com";

> test.match(/\.\.\/api\/lookup?uri=.*/);
null

> test.match(/\.\.\/api\/lookup\?uri=.*/);
["../api/lookup?uri=http%3A%2F%2Fwww.something.com"]
Jamison answered 21/10, 2013 at 14:42 Comment(1)
Cheers for fixing my regex. Unfortunately Angular still isn't matching the request. I'll keep looking in case I can solve the overall issue but if not will be back to accept this as the answer.Turpin
G
6

You need to escape the question mark with a double slash \\?

$httpBackend.expectGET(/\.\.\/api\/lookup\\?uri=.*/)).respond(200, { Response: "a response" });

additionally you might want to write your regular expression like this:

new RegExp('../api/lookup\\?uri=.*')

the // syntax has its difficulties when an escaped slash is followed by a modifier

Gorge answered 14/3, 2014 at 12:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.