public void ReturnsHttp200AndBodyWithUpdatedFeatureSwitch_IfRequestIsValid() { //Arrange const string validFeatureType = "Femah.Core.FeatureSwitchTypes.SimpleFeatureSwitch, Femah.Core, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null"; var jsonRequestAndResponse = string.Format( "{{\"IsEnabled\":true,\"Name\":\"TestFeatureSwitch1\",\"FeatureType\":\"{0}\",\"Description\":\"Define a short description of the feature switch type here.\",\"ConfigurationInstructions\":\"Add configuration context and instructions to be displayed in the admin UI\"}}", validFeatureType); var apiRequest = new PutApiRequestFactory().WithBody(jsonRequestAndResponse) .WithParameterName("TestFeatureSwitch").Build(); var featureSwitch = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = false, FeatureType = validFeatureType }; var providerMock = new Mock<IFeatureSwitchProvider>(); providerMock.Setup(p => p.Get("TestFeatureSwitch1")) .Returns(featureSwitch); Femah.Configure() .FeatureSwitchEnum(typeof (FemahApiTests.FeatureSwitches)) .Provider(providerMock.Object) .Initialise(); //Act var apiResponse = ProcessApiRequest.ProcessPutRequest(apiRequest); //Assert Assert.AreEqual((int) HttpStatusCode.OK, apiResponse.HttpStatusCode); Assert.AreEqual(jsonRequestAndResponse, apiResponse.Body); }
public void GivenTwoSimpleFeatureSwitches_ReturnsFalse_IfNamesAreDifferent() { //Arrange const string validFeatureType = "Femah.Core.FeatureSwitchTypes.SimpleFeatureSwitch, Femah.Core, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null"; var featureSwitch1 = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", FeatureType = validFeatureType }; var featureSwitch2 = new SimpleFeatureSwitch { Name = "TestFeatureSwitch2", FeatureType = validFeatureType }; //Act var equal = featureSwitch1.Equals(featureSwitch2); //Assert Assert.IsFalse(equal); }
public void GivenTwoSimpleFeatureSwitches_ReturnsTrue_IfIfAllPropertyValuesAreIdentical() { //Arrange const string validFeatureType = "Femah.Core.FeatureSwitchTypes.SimpleFeatureSwitch, Femah.Core, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null"; var featureSwitch1 = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", FeatureType = validFeatureType, IsEnabled = true }; var featureSwitch2 = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", FeatureType = validFeatureType, IsEnabled = true }; //Act var equal = featureSwitch1.Equals(featureSwitch2); //Assert Assert.IsTrue(equal); }
public void ProcessPutRequestSetsHttpStatusCodeTo304IfPutRequestBodyIsValidJsonButFeatureSwitchHasNoChanges() { //Arrange const string validFeatureType = "Femah.Core.FeatureSwitchTypes.SimpleFeatureSwitch, Femah.Core, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null"; string jsonRequestAndResponse = string.Format( "{{\"IsEnabled\":true,\"Name\":\"TestFeatureSwitch1\",\"FeatureType\":\"{0}\",\"Description\":\"Define a short description of the feature switch type here.\",\"ConfigurationInstructions\":\"Add configuration context and instructions to be displayed in the admin UI\"}}", validFeatureType); var apiRequest = new ApiRequest { HttpMethod = "PUT", Service = ApiRequest.ApiService.featureswitches, Parameter = "TestFeatureSwitch", Body = jsonRequestAndResponse }; var featureSwitch = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = true, FeatureType = validFeatureType }; var providerMock = new Mock<IFeatureSwitchProvider>(); providerMock.Setup(p => p.Get("TestFeatureSwitch1")) .Returns(featureSwitch); Femah.Configure() .FeatureSwitchEnum(typeof(FeatureSwitches)) .Provider(providerMock.Object) .Initialise(); //Act ApiResponse apiResponse = ProcessApiRequest.ProcessPutRequest(apiRequest); //Assert Assert.AreEqual((int)HttpStatusCode.NotModified, apiResponse.HttpStatusCode); Assert.AreEqual(string.Empty, apiResponse.Body); }
public void ApiResponseBuilderSetsHttpStatusCodeTo200AndReturnsDesiredFeatureSwitchStateIfPutRequestIncludesFeatureSwitchChangesToIsEnabledState() { //Arrange const string validFeatureType = "Femah.Core.FeatureSwitchTypes.SimpleFeatureSwitch, Femah.Core, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null"; string jsonRequestAndResponse = string.Format( "{{\"IsEnabled\":false,\"Name\":\"TestFeatureSwitch1\",\"FeatureType\":\"{0}\",\"Description\":\"Define a short description of the feature switch type here.\",\"ConfigurationInstructions\":\"Add configuration context and instructions to be displayed in the admin UI\"}}", validFeatureType); var currentFeatureSwitchState = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = true, FeatureType = validFeatureType, }; var desiredFeatureSwitchState = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = false, FeatureType = validFeatureType }; var providerMock = new Mock<IFeatureSwitchProvider>(); providerMock.Setup(p => p.Get("TestFeatureSwitch1")) .Returns(currentFeatureSwitchState); Femah.Configure() .FeatureSwitchEnum(typeof(FeatureSwitches)) .Provider(providerMock.Object) .Initialise(); //Act ApiResponse apiResponse; using (var apiResponseBuilder = new ApiResponseBuilder()) { apiResponse = apiResponseBuilder.CreateWithUpdatedFeatureSwitch(desiredFeatureSwitchState); } //Assert Assert.AreEqual((int)HttpStatusCode.OK, apiResponse.HttpStatusCode); Assert.AreEqual(jsonRequestAndResponse, apiResponse.Body); }
public void ApiPutReturns415AndAccurateErrorMessageIfContentTypeIsNotSetToApplicationJson() { //Arrange var testable = new TestableFemahApiHttpHandler(); var httpContextMock = new Mock<HttpContextBase>(); httpContextMock.Setup(x => x.Request.Url) .Returns(new Uri("http://example.com/femah.axd/api/featureswitches/TestFeatureSwitch1")); httpContextMock.SetupGet(x => x.Request.HttpMethod).Returns("PUT"); httpContextMock.SetupGet(x => x.Request.ContentType).Returns("incorrect/contenttype"); var response = new Mock<HttpResponseBase>(); response.SetupProperty(x => x.StatusCode); httpContextMock.Setup(x => x.Response).Returns(response.Object); var featureSwitch = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = false, FeatureType = "SimpleFeatureSwitch" }; const string expectedJsonResponse = "\"Error: Content-Type 'incorrect/contenttype' of request is not supported, expecting 'application/json'.\""; var providerMock = new Mock<IFeatureSwitchProvider>(); providerMock.Setup(p => p.Get(featureSwitch.Name.ToLower())) .Returns(featureSwitch); Femah.Configure() .FeatureSwitchEnum(typeof(FeatureSwitches)) .Provider(providerMock.Object) .Initialise(); //Get the JSON response by intercepting the call to context.Response.Write string responseContent = string.Empty; response.Setup(x => x.Write(It.IsAny<string>())).Callback((string r) => { responseContent = r; }); //Act testable.ProcessRequest(httpContextMock.Object); //Asert Assert.AreEqual(415, response.Object.StatusCode); Assert.AreEqual(expectedJsonResponse, responseContent); }
public void ApiGetReturns500AndAccurateErrorMessageIfRequestUrlIsInvalidAndContainsTooManySegments() { //apiRequest.ErrorMessage = string.Format("Error: The requested Url: '{0}' does not match the expected format /femah.axd/api/[service]/[parameter]", request.Url); //Arrange var testable = new TestableFemahApiHttpHandler(); var httpContextMock = new Mock<HttpContextBase>(); httpContextMock.Setup(x => x.Request.Url) .Returns(new Uri("http://example.com/femah.axd/api/invalid/url/structure")); httpContextMock.SetupGet(x => x.Request.HttpMethod).Returns("GET"); var response = new Mock<HttpResponseBase>(); response.SetupProperty(x => x.StatusCode); httpContextMock.Setup(x => x.Response).Returns(response.Object); var featureSwitch = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = false, FeatureType = "SimpleFeatureSwitch" }; const string expectedJsonResponse = "\"Error: The requested Url 'http://example.com/femah.axd/api/invalid/url/structure' does not match the expected format /femah.axd/api/[service]/[parameter].\""; var providerMock = new Mock<IFeatureSwitchProvider>(); providerMock.Setup(p => p.Get(featureSwitch.Name.ToLower())) .Returns(featureSwitch); Femah.Configure() .FeatureSwitchEnum(typeof(FeatureSwitches)) .Provider(providerMock.Object) .Initialise(); //Get the JSON response by intercepting the call to context.Response.Write string responseContent = string.Empty; response.Setup(x => x.Write(It.IsAny<string>())).Callback((string r) => { responseContent = r; }); //Act testable.ProcessRequest(httpContextMock.Object); //Asert Assert.AreEqual(500, response.Object.StatusCode); Assert.AreEqual(expectedJsonResponse, responseContent); }
public void ApiGetReturns404AndEmptyResponseBodyIfFeatureSwitchNotfoundWithinFeatureSwitchService() { //Arrange var testable = new TestableFemahApiHttpHandler(); var httpContextMock = new Mock<HttpContextBase>(); httpContextMock.Setup(x => x.Request.Url) .Returns(new Uri("http://example.com/femah.axd/api/featureswitches/unknownfeatureswitch")); httpContextMock.SetupGet(x => x.Request.HttpMethod).Returns("GET"); var response = new Mock<HttpResponseBase>(); response.SetupProperty(x => x.StatusCode); httpContextMock.Setup(x => x.Response).Returns(response.Object); var featureSwitch = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = false, FeatureType = "SimpleFeatureSwitch" }; const string expectedJsonResponse = "\"\""; var providerMock = new Mock<IFeatureSwitchProvider>(); providerMock.Setup(p => p.Get(featureSwitch.Name.ToLower())) .Returns(featureSwitch); Femah.Configure() .FeatureSwitchEnum(typeof(FeatureSwitches)) .Provider(providerMock.Object) .Initialise(); //Get the JSON response by intercepting the call to context.Response.Write string responseContent = string.Empty; response.Setup(x => x.Write(It.IsAny<string>())).Callback((string r) => { responseContent = r; }); //Act testable.ProcessRequest(httpContextMock.Object); //Asert Assert.AreEqual(404, response.Object.StatusCode); Assert.AreEqual(expectedJsonResponse, responseContent); }
public void ApiGetReturns200AndValidJsonForSingleFeatureSwitchFoundWithinFeatureSwitchService() { //Arrange var testable = new TestableFemahApiHttpHandler(); var httpContextMock = new Mock<HttpContextBase>(); httpContextMock.Setup(x => x.Request.Url) .Returns(new Uri("http://example.com/femah.axd/api/featureswitches/TestFeatureSwitch1")); httpContextMock.SetupGet(x => x.Request.HttpMethod).Returns("GET"); var response = new Mock<HttpResponseBase>(); response.SetupProperty(x => x.StatusCode); httpContextMock.Setup(x => x.Response).Returns(response.Object); var featureSwitch = new SimpleFeatureSwitch { Name = "TestFeatureSwitch1", IsEnabled = false, FeatureType = "SimpleFeatureSwitch" }; const string expectedJsonResponse = "[{\"IsEnabled\":false,\"Name\":\"TestFeatureSwitch1\",\"FeatureType\":\"SimpleFeatureSwitch\",\"Description\":\"Define a short description of the feature switch type here.\",\"ConfigurationInstructions\":\"Add configuration context and instructions to be displayed in the admin UI\"}]"; var providerMock = new Mock<IFeatureSwitchProvider>(); providerMock.Setup(p => p.Get(featureSwitch.Name.ToLower())) .Returns(featureSwitch); Femah.Configure() .FeatureSwitchEnum(typeof(FeatureSwitches)) .Provider(providerMock.Object) .Initialise(); //Get the JSON response by intercepting the call to context.Response.Write string responseContent = string.Empty; response.Setup(x => x.Write(It.IsAny<string>())).Callback((string r) => { responseContent = r; }); //Act testable.ProcessRequest(httpContextMock.Object); //Asert Assert.AreEqual(200, response.Object.StatusCode); Assert.AreEqual(expectedJsonResponse, responseContent); }
/// <summary> /// Initialise the provider, given the names of the feature switches. /// </summary> /// <param name="featureSwitches">Names of the feature switches in the application.</param> public void Initialise(IEnumerable<string> featureSwitches) { using (var conn = new SqlConnection(_connectionString)) { conn.Open(); // Ensure all listed feature switches exist in the database. foreach (var featureSwitchName in featureSwitches) { var featureSwitch = this.Get(featureSwitchName); if (featureSwitch == null) { featureSwitch = new SimpleFeatureSwitch { Name = featureSwitchName, IsEnabled = false }; } this.SaveOrUpdateSwitch(featureSwitch, conn); } // Remove any feature switches from database that aren't valid feature switches. DeleteUnlistedSwitches(featureSwitches, conn); } }