package net.bitpot.railways.parser;
import net.bitpot.railways.models.Route;
import net.bitpot.railways.models.requestMethods.RequestMethod;
import net.bitpot.railways.models.routes.EngineRoute;
import net.bitpot.railways.models.routes.SimpleRoute;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* Parametrized test for testing line parsing from `rake routes` output.
*/
@RunWith(Parameterized.class)
public class RailsRoutesParseLineTest
{
RailsRoutesParser parser = null;
private String line, name, path, actionTitle;
private Class routeClass;
private RequestMethod rType;
public RailsRoutesParseLineTest(String line, Class routeClass, String name,
RequestMethod rType, String path, String actionTitle) {
this.line = line;
this.routeClass = routeClass;
this.name = name;
this.rType = rType;
this.path = path;
this.actionTitle = actionTitle;
}
@Before
public void setUp() throws Exception {
parser = new RailsRoutesParser();
}
@Parameterized.Parameters
public static Collection<Object[]> createParseLineData() {
return Arrays.asList(new Object[][] {
// [0]
{" photo_album_photos POST /photo_albums/:photo_album_id/photos(.:format) {:action=>\"create\", :controller=>\"photos\"}",
SimpleRoute.class, "photo_album_photos", RequestMethod.POST,
"/photo_albums/:photo_album_id/photos(.:format)", "photos#create"},
// [1]
{" new_photo_album GET /photo_albums/new(.:format) {:action=>\"new\", :controller=>\"photo_albums\"}",
SimpleRoute.class, "new_photo_album", RequestMethod.GET,
"/photo_albums/new(.:format)", "photo_albums#new"},
// [2]
{" edit_photo_album GET /photo_albums/:id/edit(.:format) {:action=>\"edit\", :controller=>\"photo_albums\"}",
SimpleRoute.class, "edit_photo_album", RequestMethod.GET,
"/photo_albums/:id/edit(.:format)", "photo_albums#edit"},
// [3]
{" photo_album GET /photo_albums/:id(.:format) {:action=>\"show\", :controller=>\"photo_albums\"}",
SimpleRoute.class, "photo_album", RequestMethod.GET,
"/photo_albums/:id(.:format)", "photo_albums#show"},
// [4]
{" PUT /photo_albums/:id(.:format) {:action=>\"update\", :controller=>\"photo_albums\"}",
SimpleRoute.class, "", RequestMethod.PUT,
"/photo_albums/:id(.:format)", "photo_albums#update"},
// [5]
{" DELETE /photo_albums/:id(.:format) {:action=>\"destroy\", :controller=>\"photo_albums\"}",
SimpleRoute.class, "", RequestMethod.DELETE,
"/photo_albums/:id(.:format)", "photo_albums#destroy"},
// [6] New rails format
{" photo_album GET /photo_albums/:id(.:format) photo_albums#show",
SimpleRoute.class, "photo_album", RequestMethod.GET,
"/photo_albums/:id(.:format)", "photo_albums#show"},
// [7]
{" PUT /photo_albums/:id(.:format) photo_albums#update",
SimpleRoute.class, "", RequestMethod.PUT,
"/photo_albums/:id(.:format)", "photo_albums#update"},
// [8]
{" DELETE /photo_albums/:id(.:format) photo_albums#destroy",
SimpleRoute.class, "", RequestMethod.DELETE,
"/photo_albums/:id(.:format)", "photo_albums#destroy"},
// [9] Test mounting rack-application
// No action means that it's Rack application
{" test_server /test {:to=>TestServer}",
EngineRoute.class, "test_server", RequestMethod.ANY,
"/test", "TestServer"
},
// [10] Mounted rack application with namespace
// No action means that it's Rack application
{" test_server2 /test Test::Server",
EngineRoute.class, "test_server2", RequestMethod.ANY,
"/test", "Test::Server"
},
// [11] Test parsing routes with additional requirements (constraints etc.) (Old format)
{"mozilla_users /mozilla_users(.:format) {:user_agent=>/(Mozilla.*(compatible|Windows|Macintosh|Linux|iPad)|Site 24 X 7).*/, :controller=>\"users\", :action=>\"index\"}",
SimpleRoute.class, "mozilla_users", RequestMethod.ANY,
"/mozilla_users(.:format)", "users#index"
},
// [12] Test parsing routes with additional requirements (constraints etc.) (New format)
{"mozilla_users /mozilla_users(.:format) users#index {:user_agent=>/(Mozilla.*(compatible|Windows|Macintosh|Linux|iPad)|Site 24 X 7).*/}",
SimpleRoute.class, "mozilla_users", RequestMethod.ANY,
"/mozilla_users(.:format)", "users#index"
},
// [13] Test parsing of redirecting route
{" redirect /redirect(.:format) :controller#:action",
SimpleRoute.class, "redirect", RequestMethod.ANY,
"/redirect(.:format)", ":controller#:action"},
// [14] Test parsing of Rails 4 PATCH method
{" PATCH /users/:id(.:format) users#update",
SimpleRoute.class, "", RequestMethod.PATCH,
"/users/:id(.:format)", "users#update"},
// [15] Parser should successfully parse custom action text - it's better
// that route is added with unknown action string than ignored.
{" redirect_301 GET /redirect_301(.:format) unknown format in action field",
SimpleRoute.class, "redirect_301", RequestMethod.GET,
"/redirect_301(.:format)", "unknown format in action field"},
});
}
@Test
public void testParseLine()
{
List<Route> routeList = parser.parseLine(line);
Route r = routeList.get(0);
assertEquals(1, routeList.size());
assertNotNull(r);
assertEquals(name, r.getRouteName());
assertEquals(routeClass, r.getClass());
assertEquals(rType, r.getRequestMethod());
assertEquals(path, r.getPath());
//assertEquals(controller, r.getController());
assertEquals(actionTitle, r.getActionTitle());
}
}