Skip to content

Commit

Permalink
Merge pull request #1 from ClydeDz/develop
Browse files Browse the repository at this point in the history
Add avatar generation functionality
  • Loading branch information
ClydeDz authored Dec 20, 2020
2 parents 0a021ba + 469ae04 commit 8abb37d
Show file tree
Hide file tree
Showing 14 changed files with 581 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/GiveMeAnAvatar.TestConsole/GiveMeAnAvatar.TestConsole.csproj
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>
27 changes: 27 additions & 0 deletions src/GiveMeAnAvatar.TestConsole/Program.cs
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();
}
}
}
26 changes: 26 additions & 0 deletions src/GiveMeAnAvatar.Tests/GiveMeAnAvatar.Tests.csproj
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>
37 changes: 37 additions & 0 deletions src/GiveMeAnAvatar.Tests/GiveMeAnAvatarTest.cs
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);
}
}
}
140 changes: 140 additions & 0 deletions src/GiveMeAnAvatar.Tests/Helpers/AvatarHelperTest.cs
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);
}
}
}
68 changes: 68 additions & 0 deletions src/GiveMeAnAvatar.Tests/MockData/AvatarHelperTestData.cs
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
}
};
}
}
}
37 changes: 37 additions & 0 deletions src/GiveMeAnAvatar.sln
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
Loading

0 comments on commit 8abb37d

Please sign in to comment.