Skip to content

Commit 32035d4

Browse files
Version 1.0.2 (#1)
* Remove RestSharp * Adding Example MVC Project * Remove NewtonSoft * Remove monitor task
1 parent 3054162 commit 32035d4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+23922
-173
lines changed

README.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ More info is available on [nuget](https://www.nuget.org/packages/Appconfi/)
1414

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

17-
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`.
17+
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`.
1818

1919
## How to use
2020

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

28-
//Access your application settings
29-
var color = manager.GetSetting("application.color");
28+
var setting = manager.GetSetting("my_good_setting");
3029

31-
//Check if your feature toggles are enable
32-
var status = manager.IsFeatureEnabled("you.feature");
30+
var isFeatureEnabled = manager.IsFeatureEnabled("my_awesome_feature");
3331

3432
```
3533

@@ -39,7 +37,7 @@ Change your environments:
3937

4038
```csharp
4139
var env = "PRODUCTION";
42-
var refreshInterval = TimeSpan.FromSeconds(10);
40+
var refreshInterval = TimeSpan.FromMinutes(1);
4341
var manager = Configuration.NewInstance(applicationId, apiKey, env, refreshInterval);
4442
```
4543

src/Appconfi.Example/Program.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@ class Program
77
{
88
static void Main(string[] args)
99
{
10-
var applicationId = "application_id_here";
11-
var apiKey = "application_secret_key";
10+
var applicationId = "dc97d669-1460-4602-8ae3-2a35b2708df71";
11+
var apiKey = "a7822a44-af94-4f0c-9337-7c31f2fe33af";
1212
var env = "[default]";
1313

14-
var manager = Configuration.NewInstance(applicationId, apiKey, env, TimeSpan.FromSeconds(10));
14+
var manager = Configuration.NewInstance(
15+
applicationId,
16+
apiKey,
17+
env,
18+
TimeSpan.FromMinutes(1), logger: new MyLogger());
19+
20+
1521
manager.StartMonitor();
1622

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

36-
await Task.Delay(2000);
42+
await Task.Delay(10000);
43+
}
44+
}
45+
46+
public class MyLogger : ILogger
47+
{
48+
public void Error(Exception e)
49+
{
50+
Console.WriteLine(e.Message);
3751
}
3852
}
3953
}

src/Appconfi.Test/AppconfiManagerSpec.cs

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ public void AppconfiManager_GetSetting_ValidKey_ReturnSetting()
4242
};
4343

4444
//Given a version
45-
configurationStoreMock.Setup(x => x.GetVersionAsync()).Returns(Task.FromResult("1"));
46-
45+
configurationStoreMock.Setup(x => x.GetVersion()).Returns("1");
46+
4747
//And given a valid configuration
48-
configurationStoreMock.Setup(x => x.GetConfigurationAsync()).Returns(Task.FromResult(configuration));
48+
configurationStoreMock.Setup(x => x.GetConfiguration()).Returns(configuration);
4949

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

5555
}
5656

57+
[TestMethod]
58+
public void AppconfiManager_ForceRefresh_GetSetting_AskForNewVersion()
59+
{
60+
var configurationStoreMock = new Mock<IConfigurationStore>();
61+
var configuration = new ApplicationConfiguration
62+
{
63+
Settings = new Dictionary<string, string> { { "setting", "value" } }
64+
};
65+
66+
var manager = new AppconfiManager(configurationStoreMock.Object);
67+
68+
manager.ForceRefresh();
69+
70+
configurationStoreMock.Verify(x => x.GetVersion(), Times.Once);
71+
72+
}
73+
74+
75+
[TestMethod]
76+
public void AppconfiManager_StartMonitoring_IsMonitoring_ReturnTrue()
77+
{
78+
var configurationStoreMock = new Mock<IConfigurationStore>();
79+
var manager = new AppconfiManager(configurationStoreMock.Object);
80+
81+
manager.StartMonitor();
82+
83+
Assert.IsTrue(manager.IsMonitoring);
84+
}
85+
86+
[TestMethod]
87+
public void AppconfiManager_StopMonitoring_IsMonitoring_ReturnFalse()
88+
{
89+
var configurationStoreMock = new Mock<IConfigurationStore>();
90+
var manager = new AppconfiManager(configurationStoreMock.Object);
91+
92+
manager.StartMonitor();
93+
manager.StopMonitor();
94+
95+
Assert.IsFalse(manager.IsMonitoring);
96+
}
97+
5798
[TestMethod]
5899
public void AppconfiManager_IsFeatureEnabled_ValidKey_ReturnToggle()
59100
{
@@ -64,10 +105,10 @@ public void AppconfiManager_IsFeatureEnabled_ValidKey_ReturnToggle()
64105
};
65106

66107
//Given a version
67-
configurationStoreMock.Setup(x => x.GetVersionAsync()).Returns(Task.FromResult("1"));
108+
configurationStoreMock.Setup(x => x.GetVersion()).Returns("1");
68109

69110
//And given a valid configuration
70-
configurationStoreMock.Setup(x => x.GetConfigurationAsync()).Returns(Task.FromResult(configuration));
111+
configurationStoreMock.Setup(x => x.GetConfiguration()).Returns(configuration);
71112

72113
var manager = new AppconfiManager(configurationStoreMock.Object);
73114
var isEnabled = manager.IsFeatureEnabled("feature.toggle");
@@ -81,11 +122,11 @@ public void AppconfiManager_IsFeatureEnabled_ValidKey_ReturnFromCache()
81122
{
82123
var configurationStoreMock = new Mock<IConfigurationStore>();
83124
var configuration = new ApplicationConfiguration();
84-
125+
85126
//Given a version
86-
configurationStoreMock.Setup(x => x.GetVersionAsync()).Returns(Task.FromResult("1"));
127+
configurationStoreMock.Setup(x => x.GetVersion()).Returns("1");
87128
//And given a cache
88-
Func<string,bool> cache = (key) => key == "feature.toggle";
129+
Func<string, bool> cache = (key) => key == "feature.toggle";
89130

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

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

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

110-
Assert.AreEqual("value",value);
151+
Assert.AreEqual("value", value);
111152
}
112153
}
113154
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Web.Mvc;
2+
using System.Web.Routing;
3+
4+
namespace Appconfi.Web.Example
5+
{
6+
public class RouteConfig
7+
{
8+
public static void RegisterRoutes(RouteCollection routes)
9+
{
10+
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
11+
12+
routes.MapRoute(
13+
name: "Default",
14+
url: "{controller}/{action}/{id}",
15+
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
16+
);
17+
}
18+
}
19+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
3+
using Unity;
4+
using Unity.Lifetime;
5+
6+
namespace Appconfi.Web.Example
7+
{
8+
/// <summary>
9+
/// Specifies the Unity configuration for the main container.
10+
/// </summary>
11+
public static class UnityConfig
12+
{
13+
#region Unity Container
14+
private static Lazy<IUnityContainer> container =
15+
new Lazy<IUnityContainer>(() =>
16+
{
17+
var container = new UnityContainer();
18+
RegisterTypes(container);
19+
return container;
20+
});
21+
22+
/// <summary>
23+
/// Configured Unity Container.
24+
/// </summary>
25+
public static IUnityContainer Container => container.Value;
26+
#endregion
27+
28+
public static void RegisterTypes(IUnityContainer container)
29+
{
30+
container.RegisterType<IFeatureManager, FeatureManager>(new ContainerControlledLifetimeManager());
31+
}
32+
}
33+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Linq;
2+
using System.Web.Mvc;
3+
4+
using Unity.AspNet.Mvc;
5+
6+
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Appconfi.Web.Example.UnityMvcActivator), nameof(Appconfi.Web.Example.UnityMvcActivator.Start))]
7+
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(Appconfi.Web.Example.UnityMvcActivator), nameof(Appconfi.Web.Example.UnityMvcActivator.Shutdown))]
8+
9+
namespace Appconfi.Web.Example
10+
{
11+
/// <summary>
12+
/// Provides the bootstrapping for integrating Unity with ASP.NET MVC.
13+
/// </summary>
14+
public static class UnityMvcActivator
15+
{
16+
/// <summary>
17+
/// Integrates Unity when the application starts.
18+
/// </summary>
19+
public static void Start()
20+
{
21+
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
22+
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(UnityConfig.Container));
23+
24+
DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfig.Container));
25+
26+
// TODO: Uncomment if you want to use PerRequestLifetimeManager
27+
// Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
28+
}
29+
30+
/// <summary>
31+
/// Disposes the Unity container when the application is shut down.
32+
/// </summary>
33+
public static void Shutdown()
34+
{
35+
UnityConfig.Container.Dispose();
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)