Skip to content

Instantly share code, notes, and snippets.

@chrismckelt
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chrismckelt/f28342e29c71e717c305 to your computer and use it in GitHub Desktop.
Save chrismckelt/f28342e29c71e717c305 to your computer and use it in GitHub Desktop.
Web API Test to ensure public routes do not change
[TestFixture]
public class RouteTestFixture
{
[Test]
public void Routes_should_not_change()
{
const string good = @"admin/event/lasteventhandlererror/;admin/event/search/AdminEventSearch;admin/event/{id}/AdminEventGet;admin/event/{seq}/byseq/AdminEventGetBySeq;admin/event/max/GetMaxEvent;admin/event/previous/GetEventBefore;admin/event/seq/GetSeq;admin/event/publish/test/;admin/event/skip/{seq=}/;admin/event/skipend/;admin/event/maxseq/;address/addressSearch;address/warnings/{state}/{suburb}/addressWarnings;calendar/{calendarName}/allCalendars;jobAddress/search/;booking/{bookingId}/documents/AddBookingDocuments;booking/{bookingId}/document/{documentId}/TagBookingDocument;booking/{bookingId}/document/{documentId}/DeleteBookingDocument;getStructerreValidGuid/GetStructerreValidGuid;booking/{id}/GetBooking;bookings/NewBooking;booking/{id}/UpdateBooking;booking/{id}/DeleteBookingDraft;booking/{id}/submit/SubmitBooking;bookingproject/{projectId}/bookingProjectDetails;booking/jobTypes/{customerId}/{projectId}/jobTypesAvailable;booking/survey/services/{projectId}/servicesAvailable;booking/project/{projectId}/GetBookingByProjectId;job/{jobId}/variation/GetVariation;customers/;customers/canbook/;customers/canSEFT/;dashboard/RetrieveDashboardInformation;dashboard/jobActiveTurnAround/jobActiveTurnAround;dashboard/jobCompletedTurnAround/jobCompletedTurnAround;dashboard/jobActiveTurnAroundDetail/{id}/jobActiveTurnAroundDetail;dashboard/jobCompletedTurnAroundDetail/{id}/jobCompletedTurnAroundDetail;export/activitystream/ExportActivityStream;job/{id}/activitystream/RetrieveActivitySteamForJob;job/{id}/messages/RetrieveMessagesForJob;job/{id}/messages/ReplyToMessage;job/{id}/messages/AcknowledgeMessage;jobRequest/{jobRequestId}/documents/AddJobRequestDocuments;jobRequest/{jobRequestId}/document/{documentId}/TagJobRequestDocument;jobRequest/{jobRequestId}/document/{documentId}/DeleteJobRequestDocument;job/{jobId}/documents/AddJobDocuments;job/{jobId}/document/{documentId}/TagJobDocument;job/{jobId}/document/{documentId}/DeleteJobDocument;job/{jobId}/documents/submit/SubmitJobDocument;job/{jobId}/issued/RetrieveIssuedDocumentsForJob;job/{jobId}/issued/all/RetrieveAllIssuedDocumentsForJob;jobRequest//;job/{id}/submitted/RetrieveJobDocumentsForJob;knowledgeBase/RetrieveKnowledgeBaseSummary;knowledgeBase/{knowledgeBaseId}/RetrieveKnowledgeBaseDetail;knowledgeBase/getbyjobtype/{jobType}/SearchKnowledgeBase;messages/messages;Impersonation/Begin/{loginId}/BeginImpersonation;Impersonation/End/EndImpersonation;Impersonation/Customers/GetImpersonationCustomers;Impersonation/Customers/{customerId}/Users/GetImpersonationUsers;ValidatePasswordResetToken/{token}/validatePasswordResetToken;RequestPasswordReset//requestPasswordReset;CompletePasswordReset/{token}/completePasswordReset;Session/AntiForgery/AntiForgery;Session/WhoAmI/WhoAmI;admin/exception/exception;admin/viewlogs/viewlogs;admin/version/version;globalValues/globalValues;job/{id}/jobDetails;job/GetJobIdByBookingId/{id}/GetJobIdByBookingId;job/structerre/{id}/jobStructerreDetails;job/{id}/createmessage/getJobForMessage;jobs/jobsList;getJobNumbers/jobNumbers;getJobNumbersWithDetails/jobNumbersWithDetails;projects/projectsList;getRelatedJobs/jobSummaries;project/{projectId}/projectDetails;project/{projectId}/jobs/projectJobList;getProjectIdentifiers/projectIdentifiers;getProjectProgress/projectProgress;project/structerre/{customerId}/{customerJobNo}/projectStructerreDetails;event/paged/GetPaged;siteClassification/siteClassificationGeoCode;siteClassificationByLatitudeLongitude/siteClassificationByLatitudeLongitude;imageThumbs/{imageName}/{x}/{y}/imageThumbs;imageMap/{imageName}/{x}/{y}/imageMap;siteRelatedJobLatLong/siteRelatedJobLatLong;siteRelatedJobAddress/siteRelatedJobAddress;b2bApiToken/GetTokenInfo/GetB2BApiTokenInfo;b2bApiToken/Generate/GenerateB2BApiToken;UserLoginDetails/UpdatePassword/;userProfile/current/;userProfile/current/;admin/event/stats/{aggregateType=}/;event/handlerstatus/;event/;event/testSubscription/;event/{objectType}/{objectId}/stream/{currentEventId=0}/{pageSize=1}/GetEventsByObject;event/{objectType}/stream/{currentEventId=0}/{pageSize=1}/GetEventsByObjectType;event/forwardedfrom/{forwardedFrom}/stream/{currentEventId=0}/{pageSize=1}/GetByForwardedFrom;event/all/stream/{currentEventId=0}/{pageSize=1}/GetAll;";
var goodRoutes = good.Split(Convert.ToChar(";"));
var notFound = new List<string>();
var ass = Assembly.GetAssembly(typeof (EventStatisticsController));
var sb = new StringBuilder();
foreach (var type in ass.GetTypes())
{
try
{
var members = type.GetMembers();
for (int i = 0; i < members.Length; i++)
{
// Display the attribute if it is of type MyAttribute.
if (members[i].IsDefined(typeof (RouteAttribute), false))
{
Object[] atts = members[i].GetCustomAttributes(typeof (RouteAttribute), false);
for (int j = 0; j < atts.Length; j++)
{
var routeAttribute = (RouteAttribute)atts[j];
string route = routeAttribute.Template + @"/" + routeAttribute.Name;
Console.WriteLine(route);
sb.Append(route + ";");
if (!goodRoutes.Contains(route))
{
notFound.Add(route);
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(@"An exception occurred: {0}", e.Message);
}
}
if (notFound.Any())
{
Console.WriteLine(@"-- MISSING ROUTES --");
foreach (var nf in notFound)
{
Console.WriteLine(nf);
}
Assert.Fail("Missing Routes: " + notFound.Count);
}
else
{
Assert.True(true, "All routes matched");
}
Console.WriteLine(@"------------------------------------------------");
Console.WriteLine(@"Match the following string for future tests");
Console.WriteLine(sb.ToString());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment