Skip to content

Commit

Permalink
Version 1.0.2 (#1)
Browse files Browse the repository at this point in the history
* Remove RestSharp

* Adding Example MVC Project

* Remove NewtonSoft

* Remove monitor task
  • Loading branch information
AppConfiAdmin committed Jul 30, 2019
1 parent 3054162 commit 32035d4
Show file tree
Hide file tree
Showing 46 changed files with 23,922 additions and 173 deletions.
10 changes: 4 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ More info is available on [nuget](https://www.nuget.org/packages/Appconfi/)

In order to use the Appconfi you will need to [create an account](https://appconfi.com/account/register).

From there you can create your first application and setup your configuration. To use the Appconfi API to access your configuration go to `/accesskeys` there you can find the `application_id` and your `application_secret`.
From there you can create your first application and setup your configuration. To use the Appconfi API to access your configuration go to `/accesskeys` there you can find the `application_id` and your `application_key`.

## How to use

Expand All @@ -25,11 +25,9 @@ var manager = Configuration.NewInstance(applicationId, apiKey);
//Start monitoring changes in your application settings and features toggles.
manager.StartMonitor();

//Access your application settings
var color = manager.GetSetting("application.color");
var setting = manager.GetSetting("my_good_setting");

//Check if your feature toggles are enable
var status = manager.IsFeatureEnabled("you.feature");
var isFeatureEnabled = manager.IsFeatureEnabled("my_awesome_feature");

```

Expand All @@ -39,7 +37,7 @@ Change your environments:

```csharp
var env = "PRODUCTION";
var refreshInterval = TimeSpan.FromSeconds(10);
var refreshInterval = TimeSpan.FromMinutes(1);
var manager = Configuration.NewInstance(applicationId, apiKey, env, refreshInterval);
```

Expand Down
22 changes: 18 additions & 4 deletions src/Appconfi.Example/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@ class Program
{
static void Main(string[] args)
{
var applicationId = "application_id_here";
var apiKey = "application_secret_key";
var applicationId = "dc97d669-1460-4602-8ae3-2a35b2708df71";
var apiKey = "a7822a44-af94-4f0c-9337-7c31f2fe33af";
var env = "[default]";

var manager = Configuration.NewInstance(applicationId, apiKey, env, TimeSpan.FromSeconds(10));
var manager = Configuration.NewInstance(
applicationId,
apiKey,
env,
TimeSpan.FromMinutes(1), logger: new MyLogger());


manager.StartMonitor();

var task = Task.Factory.StartNew(() =>
Expand All @@ -33,7 +39,15 @@ public static async Task CheckSetting(AppconfiManager manager)
Console.WriteLine($"is_enabled: {status.ToString().ToLower()}");
Console.WriteLine($"color: {color}");

await Task.Delay(2000);
await Task.Delay(10000);
}
}

public class MyLogger : ILogger
{
public void Error(Exception e)
{
Console.WriteLine(e.Message);
}
}
}
Expand Down
63 changes: 52 additions & 11 deletions src/Appconfi.Test/AppconfiManagerSpec.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ public void AppconfiManager_GetSetting_ValidKey_ReturnSetting()
};

//Given a version
configurationStoreMock.Setup(x => x.GetVersionAsync()).Returns(Task.FromResult("1"));
configurationStoreMock.Setup(x => x.GetVersion()).Returns("1");

//And given a valid configuration
configurationStoreMock.Setup(x => x.GetConfigurationAsync()).Returns(Task.FromResult(configuration));
configurationStoreMock.Setup(x => x.GetConfiguration()).Returns(configuration);

var manager = new AppconfiManager(configurationStoreMock.Object);
var value = manager.GetSetting("setting");
Expand All @@ -54,6 +54,47 @@ public void AppconfiManager_GetSetting_ValidKey_ReturnSetting()

}

[TestMethod]
public void AppconfiManager_ForceRefresh_GetSetting_AskForNewVersion()
{
var configurationStoreMock = new Mock<IConfigurationStore>();
var configuration = new ApplicationConfiguration
{
Settings = new Dictionary<string, string> { { "setting", "value" } }
};

var manager = new AppconfiManager(configurationStoreMock.Object);

manager.ForceRefresh();

configurationStoreMock.Verify(x => x.GetVersion(), Times.Once);

}


[TestMethod]
public void AppconfiManager_StartMonitoring_IsMonitoring_ReturnTrue()
{
var configurationStoreMock = new Mock<IConfigurationStore>();
var manager = new AppconfiManager(configurationStoreMock.Object);

manager.StartMonitor();

Assert.IsTrue(manager.IsMonitoring);
}

[TestMethod]
public void AppconfiManager_StopMonitoring_IsMonitoring_ReturnFalse()
{
var configurationStoreMock = new Mock<IConfigurationStore>();
var manager = new AppconfiManager(configurationStoreMock.Object);

manager.StartMonitor();
manager.StopMonitor();

Assert.IsFalse(manager.IsMonitoring);
}

[TestMethod]
public void AppconfiManager_IsFeatureEnabled_ValidKey_ReturnToggle()
{
Expand All @@ -64,10 +105,10 @@ public void AppconfiManager_IsFeatureEnabled_ValidKey_ReturnToggle()
};

//Given a version
configurationStoreMock.Setup(x => x.GetVersionAsync()).Returns(Task.FromResult("1"));
configurationStoreMock.Setup(x => x.GetVersion()).Returns("1");

//And given a valid configuration
configurationStoreMock.Setup(x => x.GetConfigurationAsync()).Returns(Task.FromResult(configuration));
configurationStoreMock.Setup(x => x.GetConfiguration()).Returns(configuration);

var manager = new AppconfiManager(configurationStoreMock.Object);
var isEnabled = manager.IsFeatureEnabled("feature.toggle");
Expand All @@ -81,11 +122,11 @@ public void AppconfiManager_IsFeatureEnabled_ValidKey_ReturnFromCache()
{
var configurationStoreMock = new Mock<IConfigurationStore>();
var configuration = new ApplicationConfiguration();

//Given a version
configurationStoreMock.Setup(x => x.GetVersionAsync()).Returns(Task.FromResult("1"));
configurationStoreMock.Setup(x => x.GetVersion()).Returns("1");
//And given a cache
Func<string,bool> cache = (key) => key == "feature.toggle";
Func<string, bool> cache = (key) => key == "feature.toggle";

var manager = new AppconfiManager(configurationStoreMock.Object, TimeSpan.FromSeconds(1), null, cache);
var isEnabled = manager.IsFeatureEnabled("feature.toggle");
Expand All @@ -100,14 +141,14 @@ public void AppconfiManager_GetSetting_ValidKey_ReturnFromCache()
var configuration = new ApplicationConfiguration();

//Given a version
configurationStoreMock.Setup(x => x.GetVersionAsync()).Returns(Task.FromResult("1"));
configurationStoreMock.Setup(x => x.GetVersion()).Returns("1");
//And given a cache
Func<string, string> cache = (key) => key == "cache-setting"? "value": "invalid";
Func<string, string> cache = (key) => key == "cache-setting" ? "value" : "invalid";

var manager = new AppconfiManager(configurationStoreMock.Object, TimeSpan.FromSeconds(1), cache, null);
var value = manager.GetSetting("cache-setting");

Assert.AreEqual("value",value);
Assert.AreEqual("value", value);
}
}
}
19 changes: 19 additions & 0 deletions src/Appconfi.Web.Example/App_Start/RouteConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.Web.Mvc;
using System.Web.Routing;

namespace Appconfi.Web.Example
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
33 changes: 33 additions & 0 deletions src/Appconfi.Web.Example/App_Start/UnityConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;

using Unity;
using Unity.Lifetime;

namespace Appconfi.Web.Example
{
/// <summary>
/// Specifies the Unity configuration for the main container.
/// </summary>
public static class UnityConfig
{
#region Unity Container
private static Lazy<IUnityContainer> container =
new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
});

/// <summary>
/// Configured Unity Container.
/// </summary>
public static IUnityContainer Container => container.Value;
#endregion

public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IFeatureManager, FeatureManager>(new ContainerControlledLifetimeManager());
}
}
}
38 changes: 38 additions & 0 deletions src/Appconfi.Web.Example/App_Start/UnityMvcActivator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System.Linq;
using System.Web.Mvc;

using Unity.AspNet.Mvc;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Appconfi.Web.Example.UnityMvcActivator), nameof(Appconfi.Web.Example.UnityMvcActivator.Start))]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(Appconfi.Web.Example.UnityMvcActivator), nameof(Appconfi.Web.Example.UnityMvcActivator.Shutdown))]

namespace Appconfi.Web.Example
{
/// <summary>
/// Provides the bootstrapping for integrating Unity with ASP.NET MVC.
/// </summary>
public static class UnityMvcActivator
{
/// <summary>
/// Integrates Unity when the application starts.
/// </summary>
public static void Start()
{
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(UnityConfig.Container));

DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfig.Container));

// TODO: Uncomment if you want to use PerRequestLifetimeManager
// Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
}

/// <summary>
/// Disposes the Unity container when the application is shut down.
/// </summary>
public static void Shutdown()
{
UnityConfig.Container.Dispose();
}
}
}
Loading

0 comments on commit 32035d4

Please sign in to comment.