Search code examples
fitnesserestfixture

Use Fitnesse symbol to inject baseUrl into RestFixture


I'd like to set the baseUrl for a table based on the outcome of another test (on the same page). I tried following these pages of Fitnesse's docs (and other resources) : smartrics blog post, fitnesse symbols page, but I can't seem to get it working. So far I've tried with the following syntaxes :

| Fit Rest Fixture | %emailLink% | | GET | / | 200 |Content-Type: text/plain|Email Verified|

| Fit Rest Fixture | emailLink= | | GET | / | 200 |Content-Type: text/plain|Email Verified|

| Fit Rest Fixture | $emailLink | | GET | / | 200 |Content-Type: text/plain|Email Verified|

but none of those work. I know that the emailLink symbol is not null because I'm testing it in another table, but I can't seem to inject it into the RestFixture. I always get an IllegalArgumentException indicating that the symbol name has not been resolved against its value, e.g. java.lang.IllegalArgumentException: Malformed base URL: $emailLink

Any help would be appreciated.


Solution

  • By taking a look at the code of FitRestFixture and fiddling with it, I've come up with something that works for me. It seems that the feature I was looking for is not supported out of the box, but can be easily achieved (although this way is not the cleanest) with a simple mod such as the following :

    /**
     * @return Process args ({@link fit.Fixture}) for Fit runner to extract the
     * baseUrl of each Rest request, first parameter of each RestFixture
     * table.
     */
    protected String getBaseUrlFromArgs() {
        String arg = null;
        if (args.length > 0) {
            arg = args[0];
            /* mod starts here */
            if (isSymbol(arg)) {
                String symbolName = stripSymbolNotation(arg);
                arg = resolveSymbol(symbolName);
            }
            /* mod ends here */
        }
        return arg;
    }
    
    private boolean isSymbol(String arg) {
        // notice that I've used the '<<' notation convention to extract the 
        // the value from a symbol, while in RestFixture the conventional 
        // notation is %symbolName%
        return null != arg && arg.startsWith("<<");
    }
    
    private String stripSymbolNotation(String arg) {
        return arg.substring(2);
    }
    
    private String resolveSymbol(String arg) {
        String symbolValue = (String) Fixture.getSymbol(arg);
        LOG.warn(String.format("resolved symbol %s to value %s", arg, symbolValue));
        return symbolValue;
    }