Skip to content

Commit aa26e45

Browse files
authored
v1.2.0 with ITimePeriodProvider support
Providers implement ITimePeriodProvider interface
2 parents 67b640c + 47640bc commit aa26e45

File tree

14 files changed

+335
-10
lines changed

14 files changed

+335
-10
lines changed

src/FeatureToggle.Azure.DocumentDB/FeatureToggle.Azure.DocumentDB.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
<Copyright>Copyright © 2018</Copyright>
1010
<RepositoryType>Git</RepositoryType>
1111
<RepositoryUrl>https://github.com/mikanyg/FeatureToggle.Azure.git</RepositoryUrl>
12-
<PackageReleaseNotes>1.1.0
12+
<PackageReleaseNotes>1.2.0
13+
- Provider implements ITimePeriodProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledBetweenDatesFeatureToggle.
14+
1.1.0
1315
- Provider implements IDateTimeToggleValueProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledOnOrAfterDateFeatureToggle or FeatureToggle.EnabledOnOrBeforeDateFeatureToggle.
1416
1.0.0
1517
- Initial release</PackageReleaseNotes>
1618
<PackageTags>FeatureToggle Toggle Azure DocumentDB DocDB CosmosDB NetStandard</PackageTags>
1719
<Description>FeatureToggle provider for storing feature toggles in Azure DocumentDB.</Description>
18-
<Version>1.1.0</Version>
20+
<Version>1.2.0</Version>
1921
</PropertyGroup>
2022

2123
<ItemGroup>

src/FeatureToggle.Azure.DocumentDB/Providers/DocumentDbProvider.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace FeatureToggle.Azure.Providers
99
{
10-
public class DocumentDbProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider
10+
public class DocumentDbProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider, ITimePeriodProvider
1111
{
1212
private static bool _collectionVerified;
1313

@@ -43,6 +43,13 @@ public DateTime EvaluateDateTimeToggleValue(IFeatureToggle toggle)
4343
return EvaluateToggleValue(toggle, document => document.ToggleTimestamp, toggleName => new DateTimeFeatureToggleDocument(toggleName));
4444
}
4545

46+
public Tuple<DateTime, DateTime> EvaluateTimePeriod(IFeatureToggle toggle)
47+
{
48+
return EvaluateToggleValue(toggle,
49+
document => new Tuple<DateTime, DateTime>(document.Start, document.End),
50+
toggleName => new TimePeriodFeatureToggleDocument(toggleName));
51+
}
52+
4653
private TValue EvaluateToggleValue<TDocument, TValue>(IFeatureToggle toggle, Func<TDocument, TValue> valueSelector, Func<string, TDocument> documentCreator) where TDocument : FeatureToggleDocument
4754
{
4855
var client = GetDocumentClient();
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
3+
namespace FeatureToggle.Azure.Providers
4+
{
5+
public class TimePeriodFeatureToggleDocument : FeatureToggleDocument
6+
{
7+
public TimePeriodFeatureToggleDocument() : base() { }
8+
9+
public TimePeriodFeatureToggleDocument(string toggleName) : base(toggleName)
10+
{
11+
Start = default(DateTime);
12+
End = default(DateTime);
13+
}
14+
15+
public DateTime Start { get; set; }
16+
public DateTime End { get; set; }
17+
}
18+
}

src/FeatureToggle.Azure.ServiceFabric/FeatureToggle.Azure.ServiceFabric.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
<Copyright>Copyright © 2018</Copyright>
1010
<RepositoryType>Git</RepositoryType>
1111
<RepositoryUrl>https://github.com/mikanyg/FeatureToggle.Azure.git</RepositoryUrl>
12-
<PackageReleaseNotes>1.1.0
12+
<PackageReleaseNotes>1.2.0
13+
- Provider implements ITimePeriodProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledBetweenDatesFeatureToggle.
14+
1.1.0
1315
- Provider implements IDateTimeToggleValueProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledOnOrAfterDateFeatureToggle or FeatureToggle.EnabledOnOrBeforeDateFeatureToggle.
1416
1.0.0
1517
- Initial release</PackageReleaseNotes>
1618
<PackageTags>FeatureToggle Toggle Azure ServiceFabric Fabric NetStandard</PackageTags>
1719
<Description>FeatureToggle provider for storing feature toggles in Service Fabric configuration packages.</Description>
18-
<Version>1.1.0</Version>
20+
<Version>1.2.0</Version>
1921
</PropertyGroup>
2022

2123
<ItemGroup>

src/FeatureToggle.Azure.ServiceFabric/Providers/ServiceFabricConfigProvider.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace FeatureToggle.Azure.Providers
66
{
7-
public class ServiceFabricConfigProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider
7+
public class ServiceFabricConfigProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider, ITimePeriodProvider
88
{
99
private const string KeyNotFoundInSettingsMessage = "The key '{0}' was not found in settings.xml";
1010

@@ -60,6 +60,26 @@ public DateTime EvaluateDateTimeToggleValue(IFeatureToggle toggle)
6060
return parser.ParseDateTimeConfigString(configValue, key);
6161
}
6262

63+
public Tuple<DateTime, DateTime> EvaluateTimePeriod(IFeatureToggle toggle)
64+
{
65+
var key = ExpectedAppSettingsKeyFor(toggle);
66+
67+
ValidateKeyExists(key);
68+
69+
var configValues = GetConfigValue(key).Split('|');
70+
71+
var parser = new ConfigurationDateParser();
72+
73+
var startDate = parser.ParseDateTimeConfigString(configValues[0].Trim(), key);
74+
var endDate = parser.ParseDateTimeConfigString(configValues[1].Trim(), key);
75+
76+
var v = new ConfigurationValidator();
77+
78+
v.ValidateStartAndEndDates(startDate, endDate, key);
79+
80+
return new Tuple<DateTime, DateTime>(startDate, endDate);
81+
}
82+
6383
private string ExpectedAppSettingsKeyFor(IFeatureToggle toggle)
6484
{
6585
var prefix = Configuration.UsePrefix ? ToggleConfigurationSettings.Prefix : string.Empty;
@@ -107,6 +127,6 @@ private string[] GetConfigKeysInSection()
107127

108128
var section = settings.Sections[Configuration.ConfigSectionName];
109129
return section.Parameters.Select(p => p.Name).ToArray();
110-
}
130+
}
111131
}
112132
}

src/FeatureToggle.Azure.TableStorage/FeatureToggle.Azure.TableStorage.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
<Copyright>Copyright © 2018</Copyright>
1010
<RepositoryType>Git</RepositoryType>
1111
<RepositoryUrl>https://github.com/mikanyg/FeatureToggle.Azure.git</RepositoryUrl>
12-
<PackageReleaseNotes>1.1.0
12+
<PackageReleaseNotes>1.2.0
13+
- Provider implements ITimePeriodProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledBetweenDatesFeatureToggle.
14+
1.1.0
1315
- Provider implements IDateTimeToggleValueProvider. Can be used as provider for feature toggles inheriting from FeatureToggle.EnabledOnOrAfterDateFeatureToggle or FeatureToggle.EnabledOnOrBeforeDateFeatureToggle.
1416
1.0.0
1517
- Initial release</PackageReleaseNotes>
1618
<PackageTags>FeatureToggle Toggle Azure TableStorage Table Storage NetStandard</PackageTags>
1719
<Description>FeatureToggle provider for storing feature toggles in Azure Table storage.</Description>
18-
<Version>1.1.0</Version>
20+
<Version>1.2.0</Version>
1921
</PropertyGroup>
2022

2123
<ItemGroup>

src/FeatureToggle.Azure.TableStorage/Providers/TableStorageProvider.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
namespace FeatureToggle.Azure.Providers
77
{
8-
public class TableStorageProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider
8+
public class TableStorageProvider : IBooleanToggleValueProvider, IDateTimeToggleValueProvider, ITimePeriodProvider
99
{
1010
private static bool _tableVerified;
1111

@@ -36,6 +36,13 @@ public DateTime EvaluateDateTimeToggleValue(IFeatureToggle toggle)
3636
return EvaluateToggleValue(toggle, entity => entity.ToggleTimestamp, (componentName, toggleName) => new DateTimeFeatureToggleEntity(componentName, toggleName));
3737
}
3838

39+
public Tuple<DateTime, DateTime> EvaluateTimePeriod(IFeatureToggle toggle)
40+
{
41+
return EvaluateToggleValue(toggle,
42+
entity => new Tuple<DateTime, DateTime>(entity.Start, entity.End),
43+
(componentName, toggleName) => new TimePeriodFeatureToggleEntity(componentName, toggleName));
44+
}
45+
3946
private TValue EvaluateToggleValue<TEntity, TValue>(IFeatureToggle toggle, Func<TEntity, TValue> valueSelector, Func<string, string, TEntity> entityCreator) where TEntity : FeatureToggleEntity
4047
{
4148
var table = GetCloudTable();
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
3+
namespace FeatureToggle.Azure.Providers
4+
{
5+
public class TimePeriodFeatureToggleEntity : FeatureToggleEntity
6+
{
7+
public TimePeriodFeatureToggleEntity() : base() { }
8+
9+
public TimePeriodFeatureToggleEntity(string componentName, string toggleName) : base(componentName, toggleName)
10+
{
11+
// Table Storage does not support DateTime.Min
12+
Start = new DateTime(1900, 1, 1);
13+
End = new DateTime(1900, 1, 1);
14+
}
15+
16+
public DateTime Start { get; set; }
17+
public DateTime End { get; set; }
18+
}
19+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using FeatureToggle.Azure.DocumentDB.Test.Toggles;
2+
using FeatureToggle.Azure.Providers;
3+
using NUnit.Framework;
4+
using Shouldly;
5+
using System;
6+
using System.Threading.Tasks;
7+
8+
namespace FeatureToggle.Azure.DocumentDB.Test
9+
{
10+
[TestFixture]
11+
public class TimePeriodToggleTest : DocumentDbTestFixture
12+
{
13+
[Test]
14+
public async Task FeatureEnabled_LimitedTimeOfferFeatureToggleSetToEnabledTomorrow_ToggleValueIsFalse()
15+
{
16+
// Arrange
17+
AutoCreateToggle<LimitedTimeOfferFeatureToggle>();
18+
await UpdateToggleDocument(new TimePeriodFeatureToggleDocument(nameof(LimitedTimeOfferFeatureToggle)) { Start = DateTime.Now.AddDays(1), End = DateTime.Now.AddDays(2) });
19+
20+
var toggle = new LimitedTimeOfferFeatureToggle();
21+
// Act
22+
var toggleValue = toggle.FeatureEnabled;
23+
// Assert
24+
toggleValue.ShouldBeFalse();
25+
}
26+
27+
[Test]
28+
public async Task FeatureEnabled_LimitedTimeOfferFeatureToggleSetToExpiredYesterday_ToggleValueIsFalse()
29+
{
30+
// Arrange
31+
AutoCreateToggle<LimitedTimeOfferFeatureToggle>();
32+
await UpdateToggleDocument(new TimePeriodFeatureToggleDocument(nameof(LimitedTimeOfferFeatureToggle)) { Start = DateTime.Now.AddDays(-2), End = DateTime.Now.AddDays(-1) });
33+
34+
var toggle = new LimitedTimeOfferFeatureToggle();
35+
// Act
36+
var toggleValue = toggle.FeatureEnabled;
37+
// Assert
38+
toggleValue.ShouldBeFalse();
39+
}
40+
41+
[Test]
42+
public async Task FeatureEnabled_LimitedTimeOfferFeatureToggleSetToEnabledYesterday_ToggleValueIsTrue()
43+
{
44+
// Arrange
45+
AutoCreateToggle<LimitedTimeOfferFeatureToggle>();
46+
await UpdateToggleDocument(new TimePeriodFeatureToggleDocument(nameof(LimitedTimeOfferFeatureToggle)) { Start = DateTime.Now.AddDays(-1), End = DateTime.Now.AddDays(1) });
47+
48+
var toggle = new LimitedTimeOfferFeatureToggle();
49+
// Act
50+
var toggleValue = toggle.FeatureEnabled;
51+
// Assert
52+
toggleValue.ShouldBeTrue();
53+
}
54+
}
55+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using FeatureToggle.Azure.Providers;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
6+
namespace FeatureToggle.Azure.DocumentDB.Test.Toggles
7+
{
8+
public class LimitedTimeOfferFeatureToggle : EnabledBetweenDatesFeatureToggle
9+
{
10+
public LimitedTimeOfferFeatureToggle()
11+
{
12+
this.ToggleValueProvider = new DocumentDbProvider();
13+
}
14+
}
15+
}

0 commit comments

Comments
 (0)