-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from ClydeDz/develop
Add avatar generation functionality
- Loading branch information
Showing
14 changed files
with
581 additions
and
0 deletions.
There are no files selected for viewing
12 changes: 12 additions & 0 deletions
12
src/GiveMeAnAvatar.TestConsole/GiveMeAnAvatar.TestConsole.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
<TargetFramework>netcoreapp3.1</TargetFramework> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<ProjectReference Include="..\GiveMeAnAvatar\GiveMeAnAvatar.csproj" /> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
using System; | ||
|
||
namespace GiveMeAnAvatar.TestConsole | ||
{ | ||
class Program | ||
{ | ||
static void Main(string[] args) | ||
{ | ||
const string packageName = @" | ||
_____ _ __ __ _ | ||
/ ____(_) | \/ | /\ | | | ||
| | __ ___ _____ | \ / | ___ __ _ _ __ / \__ ____ _| |_ __ _ _ __ | ||
| | |_ | \ \ / / _ \ | |\/| |/ _ \ / _` | '_ \ / /\ \ \ / / _` | __/ _` | '__| | ||
| |__| | |\ V | __/ | | | | __/ | (_| | | | | / ____ \ V | (_| | || (_| | | | ||
\_____|_| \_/ \___| |_| |_|\___| \__,_|_| |_| /_/ \_\_/ \__,_|\__\__,_|_| | ||
"; | ||
|
||
Console.WriteLine(packageName); | ||
Console.WriteLine($"Avatar URL generated without passing any settings: {GiveMeAnAvatar.GetAvatarURL()}"); | ||
var settings = new AvatarSettings() { Name = "Axel Drew", Size = 124 }; | ||
Console.WriteLine($"Avatar URL generated after passing settings: {GiveMeAnAvatar.GetAvatarURL(settings)}"); | ||
Console.ReadLine(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<TargetFramework>net5.0</TargetFramework> | ||
|
||
<IsPackable>false</IsPackable> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" /> | ||
<PackageReference Include="xunit" Version="2.4.1" /> | ||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> | ||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||
<PrivateAssets>all</PrivateAssets> | ||
</PackageReference> | ||
<PackageReference Include="coverlet.collector" Version="1.3.0"> | ||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||
<PrivateAssets>all</PrivateAssets> | ||
</PackageReference> | ||
</ItemGroup> | ||
|
||
<ItemGroup> | ||
<ProjectReference Include="..\GiveMeAnAvatar\GiveMeAnAvatar.csproj" /> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
using Xunit; | ||
|
||
namespace GiveMeAnAvatar.Tests | ||
{ | ||
public class GiveMeAnAvatarTest | ||
{ | ||
[Fact] | ||
public void GetAvatarURL_Returns_URL() | ||
{ | ||
var avatarURL = GiveMeAnAvatar.GetAvatarURL(); | ||
Assert.NotEmpty(avatarURL); | ||
} | ||
|
||
[Fact] | ||
public void GetAvatarURL_PassNull_Returns_URL() | ||
{ | ||
var avatarURL = GiveMeAnAvatar.GetAvatarURL(null); | ||
Assert.NotEmpty(avatarURL); | ||
} | ||
|
||
[Fact] | ||
public void GetAvatarURL_PassSettings_Returns_URL() | ||
{ | ||
var settings = new AvatarSettings() { Name = "John Echo", Size = 148 }; | ||
var avatarURL = GiveMeAnAvatar.GetAvatarURL(settings); | ||
Assert.NotEmpty(avatarURL); | ||
} | ||
|
||
[Fact] | ||
public void GetAvatarURL_PassPartialSettings_Returns_URL() | ||
{ | ||
var settings = new AvatarSettings() { Name = "John Echo" }; | ||
var avatarURL = GiveMeAnAvatar.GetAvatarURL(settings); | ||
Assert.NotEmpty(avatarURL); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
using Xunit; | ||
using GiveMeAnAvatar.Helpers; | ||
using GiveMeAnAvatar.Constants; | ||
using System.Linq; | ||
using GiveMeAnAvatar.Tests.MockData; | ||
|
||
namespace GiveMeAnAvatar.Tests.Helpers | ||
{ | ||
public class AvatarHelperTest | ||
{ | ||
[Fact] | ||
public void GetDefaultAvatarSettings_Returns_ValidDefaultSettings() | ||
{ | ||
var defaultAvatarSettings = AvatarHelper.GetDefaultAvatarSettings(); | ||
Assert.NotNull(defaultAvatarSettings); | ||
Assert.NotEmpty(defaultAvatarSettings.Name); | ||
Assert.NotNull(defaultAvatarSettings.Size); | ||
Assert.Empty(defaultAvatarSettings.ExtraFilter); | ||
Assert.InRange(defaultAvatarSettings.Size.Value, AvatarConstants.AvatarSize.Min, AvatarConstants.AvatarSize.Max-1); | ||
} | ||
|
||
[Fact] | ||
public void GetDefaultName_Returns_ValidUserInitials() | ||
{ | ||
var defaultName = AvatarHelper.GetDefaultName(); | ||
Assert.NotEmpty(defaultName); | ||
var containsFirstNameInitial = AvatarConstants.Alphabets.Any(x => x.Contains(defaultName.Split("%20")[0])); | ||
var containsLastNameIntial = AvatarConstants.Alphabets.Any(x => x.Contains(defaultName.Split("%20")[1])); | ||
Assert.True(containsFirstNameInitial); | ||
Assert.True(containsLastNameIntial); | ||
} | ||
|
||
[Fact] | ||
public void GetDefaultSize_Returns_ValueWithinRange() | ||
{ | ||
var defaultSize = AvatarHelper.GetDefaultSize(); | ||
Assert.IsType<int>(defaultSize); | ||
Assert.InRange(defaultSize, AvatarConstants.AvatarSize.Min, AvatarConstants.AvatarSize.Max - 1); | ||
} | ||
|
||
[Fact] | ||
public void GetRandomAvatarService_Returns_ValidAvatar() | ||
{ | ||
var avatar = AvatarHelper.GetRandomAvatarService(); | ||
Assert.NotNull(avatar); | ||
Assert.NotEmpty(avatar.Key); | ||
Assert.NotEmpty(avatar.URL); | ||
} | ||
|
||
[Theory] | ||
[MemberData(nameof(AvatarHelperTestData.ProcessAvatarTemplate_ExpectValidOutput), MemberType = typeof(AvatarHelperTestData))] | ||
public void ProcessAvatarTemplate_Returns_ValidAvatarURL(string template, AvatarSettings settings, string expectedOutput) | ||
{ | ||
var avatar = AvatarHelper.ProcessAvatarTemplate(template, settings); | ||
Assert.NotNull(avatar); | ||
Assert.Equal(expectedOutput, avatar); | ||
} | ||
|
||
[Theory] | ||
[MemberData(nameof(AvatarHelperTestData.ProcessAvatarTemplate_ExpectException_Data), MemberType = typeof(AvatarHelperTestData))] | ||
public void ProcessAvatarTemplate_Expects_Error(string template, AvatarSettings settings) | ||
{ | ||
Assert.Throws<System.NullReferenceException>(() => | ||
AvatarHelper.ProcessAvatarTemplate(template, settings)); | ||
} | ||
|
||
[Fact] | ||
public void ValidateAndCleanSettings_OnlySizePassed_ReturnsValidSettings() | ||
{ | ||
var settings = new AvatarSettings() { Size = 148 }; | ||
var avatarKey = "placeimg.com"; | ||
var avatarSettings = AvatarHelper.ValidateAndCleanSettings(settings, avatarKey); | ||
Assert.NotNull(avatarSettings); | ||
Assert.NotEmpty(avatarSettings.Name); | ||
Assert.Equal(settings.Size, avatarSettings.Size); | ||
} | ||
|
||
[Fact] | ||
public void ValidateAndCleanSettings_OnlyNamePassed_ReturnsValidSettings() | ||
{ | ||
var settings = new AvatarSettings() { Name = "Elton John" }; | ||
var avatarKey = "placeimg.com"; | ||
var avatarSettings = AvatarHelper.ValidateAndCleanSettings(settings, avatarKey); | ||
Assert.NotNull(avatarSettings); | ||
Assert.IsType<int>(avatarSettings.Size); | ||
Assert.Equal("Elton%20John", avatarSettings.Name); | ||
} | ||
|
||
[Fact] | ||
public void ValidateAndCleanSettings_NameWithWhitespacePassed_ReturnsValidSettings() | ||
{ | ||
var settings = new AvatarSettings() { Name = "John David Smith" }; | ||
var avatarKey = "placeimg.com"; | ||
var avatarSettings = AvatarHelper.ValidateAndCleanSettings(settings, avatarKey); | ||
Assert.NotNull(avatarSettings); | ||
Assert.IsType<int>(avatarSettings.Size); | ||
Assert.Equal("John%20David%20Smith", avatarSettings.Name); | ||
} | ||
|
||
|
||
[Fact] | ||
public void ValidateAndCleanSettings_NullAvatarKeyPassed_ReturnsValidSettings() | ||
{ | ||
var settings = new AvatarSettings() { Size = 148 }; | ||
var avatarSettings = AvatarHelper.ValidateAndCleanSettings(settings, null); | ||
Assert.NotNull(avatarSettings); | ||
Assert.IsType<int>(avatarSettings.Size); | ||
Assert.NotEmpty(avatarSettings.Name); | ||
Assert.Equal("", avatarSettings.ExtraFilter); | ||
} | ||
|
||
[Theory] | ||
[MemberData(nameof(AvatarHelperTestData.ValidateAndCleanSettings_ExpectException_Data), MemberType = typeof(AvatarHelperTestData))] | ||
public void ValidateAndCleanSettings_Expects_Error(AvatarSettings settings, string avatarKey) | ||
{ | ||
Assert.Throws<System.NullReferenceException>(() => | ||
AvatarHelper.ValidateAndCleanSettings(settings, avatarKey)); | ||
} | ||
|
||
|
||
[Theory] | ||
[InlineData("placeimg.com")] | ||
[InlineData("this_service_does_not_exist")] | ||
[InlineData(null)] | ||
public void ApplyExtraFiltersToAvatarURL_DifferentKeyScenarios_ReturnsValidResults(string avatarKey) | ||
{ | ||
var extraFilters = AvatarHelper.ApplyExtraFiltersToAvatarURL(avatarKey); | ||
Assert.Empty(extraFilters); | ||
} | ||
|
||
[Fact] | ||
public void ApplyExtraFiltersToAvatarURL_KeyPassed_ExpectExtraFilterForThatKey() | ||
{ | ||
var robohashExtraFilterSet = AvatarConstants.ExtraFilterCollection["robohash.org"]; | ||
var robohashExtraFilter = AvatarHelper.ApplyExtraFiltersToAvatarURL("robohash.org"); | ||
Assert.NotEmpty(robohashExtraFilter); | ||
Assert.Contains(robohashExtraFilter, robohashExtraFilterSet); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
using System.Collections.Generic; | ||
|
||
namespace GiveMeAnAvatar.Tests.MockData | ||
{ | ||
class AvatarHelperTestData | ||
{ | ||
public static IEnumerable<object[]> ProcessAvatarTemplate_ExpectValidOutput() | ||
{ | ||
return new List<object[]> | ||
{ | ||
new object[] { | ||
"https://placeimg.com/${this.Size}/${this.Size}/people", | ||
new AvatarSettings() { Name = "John Echo", Size = 148 }, | ||
"https://placeimg.com/148/148/people" | ||
}, | ||
new object[] { | ||
"https://robohash.org/${this.Name}?size=${this.Size}x${this.Size}${this.ExtraFilter}", | ||
new AvatarSettings() { Name = "Paul", Size = 786, ExtraFilter = "&set=set1"}, | ||
"https://robohash.org/Paul?size=786x786&set=set1" | ||
}, | ||
new object[] { | ||
"https://placeimg.com/${this.Size}/${this.Size}/people", | ||
new AvatarSettings(), | ||
"https://placeimg.com///people" | ||
}, | ||
new object[] { | ||
"", | ||
new AvatarSettings() { Name = "John Echo", Size = 148 }, | ||
"" | ||
} | ||
}; | ||
} | ||
|
||
public static IEnumerable<object[]> ProcessAvatarTemplate_ExpectException_Data() | ||
{ | ||
return new List<object[]> | ||
{ | ||
new object[] { | ||
"https://placeimg.com/${this.Size}/${this.Size}/people", | ||
null, | ||
}, | ||
new object[] { | ||
null, | ||
new AvatarSettings() { Name = "Paul", Size = 786, ExtraFilter = "&set=set1"} | ||
}, | ||
new object[] { | ||
null, | ||
null | ||
} | ||
}; | ||
} | ||
|
||
public static IEnumerable<object[]> ValidateAndCleanSettings_ExpectException_Data() | ||
{ | ||
return new List<object[]> | ||
{ | ||
new object[] { | ||
null, | ||
"placeimg.com" | ||
}, | ||
new object[] { | ||
null, | ||
null | ||
} | ||
}; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
|
||
Microsoft Visual Studio Solution File, Format Version 12.00 | ||
# Visual Studio Version 16 | ||
VisualStudioVersion = 16.0.30804.86 | ||
MinimumVisualStudioVersion = 10.0.40219.1 | ||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GiveMeAnAvatar", "GiveMeAnAvatar\GiveMeAnAvatar.csproj", "{E6E85C84-BA11-41DF-A80D-9F6CC43673AF}" | ||
EndProject | ||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GiveMeAnAvatar.Tests", "GiveMeAnAvatar.Tests\GiveMeAnAvatar.Tests.csproj", "{CF26D4C2-1725-4A37-B336-1C9F47DFC149}" | ||
EndProject | ||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GiveMeAnAvatar.TestConsole", "GiveMeAnAvatar.TestConsole\GiveMeAnAvatar.TestConsole.csproj", "{13A0E688-92D3-48BC-910D-C0E14CAF0E29}" | ||
EndProject | ||
Global | ||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
Debug|Any CPU = Debug|Any CPU | ||
Release|Any CPU = Release|Any CPU | ||
EndGlobalSection | ||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
{E6E85C84-BA11-41DF-A80D-9F6CC43673AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
{E6E85C84-BA11-41DF-A80D-9F6CC43673AF}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
{E6E85C84-BA11-41DF-A80D-9F6CC43673AF}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
{E6E85C84-BA11-41DF-A80D-9F6CC43673AF}.Release|Any CPU.Build.0 = Release|Any CPU | ||
{CF26D4C2-1725-4A37-B336-1C9F47DFC149}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
{CF26D4C2-1725-4A37-B336-1C9F47DFC149}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
{CF26D4C2-1725-4A37-B336-1C9F47DFC149}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
{CF26D4C2-1725-4A37-B336-1C9F47DFC149}.Release|Any CPU.Build.0 = Release|Any CPU | ||
{13A0E688-92D3-48BC-910D-C0E14CAF0E29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
{13A0E688-92D3-48BC-910D-C0E14CAF0E29}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
{13A0E688-92D3-48BC-910D-C0E14CAF0E29}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
{13A0E688-92D3-48BC-910D-C0E14CAF0E29}.Release|Any CPU.Build.0 = Release|Any CPU | ||
EndGlobalSection | ||
GlobalSection(SolutionProperties) = preSolution | ||
HideSolutionNode = FALSE | ||
EndGlobalSection | ||
GlobalSection(ExtensibilityGlobals) = postSolution | ||
SolutionGuid = {134DCE31-D119-4DB4-9369-37FDDF359D1D} | ||
EndGlobalSection | ||
EndGlobal |
Oops, something went wrong.