Skip to content

Commit a6473bd

Browse files
author
Justin
committed
Refactoring to make unit tests and dependency injection possible and easier.
Added unit tests.
1 parent 9c5e389 commit a6473bd

37 files changed

Lines changed: 573 additions & 227 deletions

SteamWebAPI2.Net451/SteamWebAPI2.Net451.csproj

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -366,17 +366,17 @@
366366
<Compile Include="..\SteamWebAPI2\SteamStoreRequest.cs">
367367
<Link>SteamStoreRequest.cs</Link>
368368
</Compile>
369-
<Compile Include="..\SteamWebAPI2\SteamWebInterface.cs">
370-
<Link>SteamWebInterface.cs</Link>
369+
<Compile Include="..\SteamWebAPI2\Utilities\DateTimeExtensions.cs">
370+
<Link>Utilities\DateTimeExtensions.cs</Link>
371371
</Compile>
372-
<Compile Include="..\SteamWebAPI2\SteamWebRequest.cs">
373-
<Link>SteamWebRequest.cs</Link>
372+
<Compile Include="..\SteamWebAPI2\Utilities\ISteamWebHttpClient.cs">
373+
<Link>Utilities\ISteamWebHttpClient.cs</Link>
374374
</Compile>
375-
<Compile Include="..\SteamWebAPI2\SteamWebRequestParameter.cs">
376-
<Link>SteamWebRequestParameter.cs</Link>
375+
<Compile Include="..\SteamWebAPI2\Utilities\ISteamWebInterface.cs">
376+
<Link>Utilities\ISteamWebInterface.cs</Link>
377377
</Compile>
378-
<Compile Include="..\SteamWebAPI2\Utilities\DateTimeExtensions.cs">
379-
<Link>Utilities\DateTimeExtensions.cs</Link>
378+
<Compile Include="..\SteamWebAPI2\Utilities\ISteamWebRequest.cs">
379+
<Link>Utilities\ISteamWebRequest.cs</Link>
380380
</Compile>
381381
<Compile Include="..\SteamWebAPI2\Utilities\JsonConverters\AssetClassInfoJsonConverter.cs">
382382
<Link>Utilities\JsonConverters\AssetClassInfoJsonConverter.cs</Link>
@@ -396,6 +396,18 @@
396396
<Compile Include="..\SteamWebAPI2\Utilities\JsonConverters\UnixTimeJsonConverter.cs">
397397
<Link>Utilities\JsonConverters\UnixTimeJsonConverter.cs</Link>
398398
</Compile>
399+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebHttpClient.cs">
400+
<Link>Utilities\SteamWebHttpClient.cs</Link>
401+
</Compile>
402+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebInterface.cs">
403+
<Link>Utilities\SteamWebInterface.cs</Link>
404+
</Compile>
405+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebRequest.cs">
406+
<Link>Utilities\SteamWebRequest.cs</Link>
407+
</Compile>
408+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebRequestParameter.cs">
409+
<Link>Utilities\SteamWebRequestParameter.cs</Link>
410+
</Compile>
399411
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebRequestParameterExtensions.cs">
400412
<Link>Utilities\SteamWebRequestParameterExtensions.cs</Link>
401413
</Compile>

SteamWebAPI2.Net452/SteamWebAPI2.Net452.csproj

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -367,17 +367,17 @@
367367
<Compile Include="..\SteamWebAPI2\SteamStoreRequest.cs">
368368
<Link>SteamStoreRequest.cs</Link>
369369
</Compile>
370-
<Compile Include="..\SteamWebAPI2\SteamWebInterface.cs">
371-
<Link>SteamWebInterface.cs</Link>
370+
<Compile Include="..\SteamWebAPI2\Utilities\DateTimeExtensions.cs">
371+
<Link>Utilities\DateTimeExtensions.cs</Link>
372372
</Compile>
373-
<Compile Include="..\SteamWebAPI2\SteamWebRequest.cs">
374-
<Link>SteamWebRequest.cs</Link>
373+
<Compile Include="..\SteamWebAPI2\Utilities\ISteamWebHttpClient.cs">
374+
<Link>Utilities\ISteamWebHttpClient.cs</Link>
375375
</Compile>
376-
<Compile Include="..\SteamWebAPI2\SteamWebRequestParameter.cs">
377-
<Link>SteamWebRequestParameter.cs</Link>
376+
<Compile Include="..\SteamWebAPI2\Utilities\ISteamWebInterface.cs">
377+
<Link>Utilities\ISteamWebInterface.cs</Link>
378378
</Compile>
379-
<Compile Include="..\SteamWebAPI2\Utilities\DateTimeExtensions.cs">
380-
<Link>Utilities\DateTimeExtensions.cs</Link>
379+
<Compile Include="..\SteamWebAPI2\Utilities\ISteamWebRequest.cs">
380+
<Link>Utilities\ISteamWebRequest.cs</Link>
381381
</Compile>
382382
<Compile Include="..\SteamWebAPI2\Utilities\JsonConverters\AssetClassInfoJsonConverter.cs">
383383
<Link>Utilities\JsonConverters\AssetClassInfoJsonConverter.cs</Link>
@@ -397,6 +397,18 @@
397397
<Compile Include="..\SteamWebAPI2\Utilities\JsonConverters\UnixTimeJsonConverter.cs">
398398
<Link>Utilities\JsonConverters\UnixTimeJsonConverter.cs</Link>
399399
</Compile>
400+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebHttpClient.cs">
401+
<Link>Utilities\SteamWebHttpClient.cs</Link>
402+
</Compile>
403+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebInterface.cs">
404+
<Link>Utilities\SteamWebInterface.cs</Link>
405+
</Compile>
406+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebRequest.cs">
407+
<Link>Utilities\SteamWebRequest.cs</Link>
408+
</Compile>
409+
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebRequestParameter.cs">
410+
<Link>Utilities\SteamWebRequestParameter.cs</Link>
411+
</Compile>
400412
<Compile Include="..\SteamWebAPI2\Utilities\SteamWebRequestParameterExtensions.cs">
401413
<Link>Utilities\SteamWebRequestParameterExtensions.cs</Link>
402414
</Compile>
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
using System;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using SteamWebAPI2.Interfaces;
4+
using Moq;
5+
using SteamWebAPI2.Utilities;
6+
using SteamWebAPI2.Models.SteamPlayer;
7+
using System.Threading.Tasks;
8+
using SteamWebAPI2.Models.SteamCommunity;
9+
10+
namespace SteamWebAPI2.Tests
11+
{
12+
[TestClass]
13+
public class PlayerServiceTests
14+
{
15+
[TestMethod]
16+
[ExpectedException(typeof(ArgumentNullException))]
17+
public void PlayerService_Throw_Exception_If_Steam_API_Key_Is_Null_Or_Empty()
18+
{
19+
var playerService = new PlayerService(String.Empty);
20+
}
21+
22+
[TestMethod]
23+
public async Task PlayerService_IsPlayingSharedGameAsync_Return_Empty_String_If_Web_Interface_Returns_Null()
24+
{
25+
var mockSteamWebRequest = new Mock<ISteamWebInterface>();
26+
27+
mockSteamWebRequest.Setup(x => x.GetAsync<PlayingSharedGameResultContainer>(It.IsAny<string>(), It.IsAny<int>(), null))
28+
.ReturnsAsync((PlayingSharedGameResultContainer)null);
29+
30+
var service = new PlayerService(String.Empty, mockSteamWebRequest.Object);
31+
var result = await service.IsPlayingSharedGameAsync(0, 0);
32+
33+
Assert.IsNotNull(result);
34+
Assert.AreEqual(result, String.Empty);
35+
}
36+
37+
[TestMethod]
38+
public async Task PlayerService_IsPlayingSharedGameAsync_Return_Empty_String_If_Web_Interface_Result_Is_Null()
39+
{
40+
var mockSteamWebRequest = new Mock<ISteamWebInterface>();
41+
42+
mockSteamWebRequest.Setup(x => x.GetAsync<PlayingSharedGameResultContainer>(It.IsAny<string>(), It.IsAny<int>(), null))
43+
.ReturnsAsync(new PlayingSharedGameResultContainer()
44+
{
45+
Result = null
46+
});
47+
48+
var service = new PlayerService(String.Empty, mockSteamWebRequest.Object);
49+
var result = await service.IsPlayingSharedGameAsync(0, 0);
50+
51+
Assert.IsNotNull(result);
52+
Assert.AreEqual(result, String.Empty);
53+
}
54+
55+
[TestMethod]
56+
public async Task PlayerService_GetBadgesAsync_Return_New_If_Web_Request_Is_Null()
57+
{
58+
var mockSteamWebRequest = new Mock<ISteamWebInterface>();
59+
60+
mockSteamWebRequest.Setup(x => x.GetAsync<BadgesResultContainer>(It.IsAny<string>(), It.IsAny<int>(), null))
61+
.ReturnsAsync((BadgesResultContainer)null);
62+
63+
var service = new PlayerService(String.Empty, mockSteamWebRequest.Object);
64+
var result = await service.GetBadgesAsync(0);
65+
66+
Assert.IsNotNull(result);
67+
Assert.IsNull(result.Badges);
68+
}
69+
70+
[TestMethod]
71+
public async Task PlayerService_GetCommunityBadgeProgressAsync_Return_Empty_If_Web_Request_Is_Null()
72+
{
73+
var mockSteamWebRequest = new Mock<ISteamWebInterface>();
74+
75+
mockSteamWebRequest.Setup(x => x.GetAsync<CommunityBadgeProgressResultContainer>(It.IsAny<string>(), It.IsAny<int>(), null))
76+
.ReturnsAsync((CommunityBadgeProgressResultContainer)null);
77+
78+
var service = new PlayerService(String.Empty, mockSteamWebRequest.Object);
79+
var result = await service.GetCommunityBadgeProgressAsync(0, 0);
80+
81+
Assert.IsNotNull(result);
82+
Assert.AreEqual(result.Count, 0);
83+
}
84+
}
85+
}

SteamWebAPI2.Tests/SteamWebAPI2.Tests.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,15 @@
5959
</When>
6060
<Otherwise>
6161
<ItemGroup>
62-
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
62+
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework">
63+
<Private>False</Private>
64+
</Reference>
6365
</ItemGroup>
6466
</Otherwise>
6567
</Choose>
6668
<ItemGroup>
6769
<Compile Include="Properties\AssemblyInfo.cs" />
70+
<Compile Include="PlayerServiceTests.cs" />
6871
</ItemGroup>
6972
<ItemGroup>
7073
<ProjectReference Include="..\SteamWebAPI2\SteamWebAPI2.csproj">

SteamWebAPI2/Interfaces/CSGOServers.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,35 @@
22
using SteamWebAPI2.Models.CSGO;
33
using System.Threading.Tasks;
44
using System.Linq;
5+
using SteamWebAPI2.Utilities;
56

67
namespace SteamWebAPI2.Interfaces
78
{
89
/// <summary>
910
/// Represents a Steam Web API interface endpoint located at ICSGOServers_730
1011
/// </summary>
11-
public class CSGOServers : SteamWebInterface, ICSGOServers
12+
public class CSGOServers : ICSGOServers
1213
{
14+
private ISteamWebInterface steamWebInterface;
15+
1316
/// <summary>
1417
/// Default constructor established the Steam Web API key and initializes for subsequent method calls
1518
/// </summary>
1619
/// <param name="steamWebApiKey"></param>
17-
public CSGOServers(string steamWebApiKey)
18-
: base(steamWebApiKey, "ICSGOServers_730")
19-
{ }
20+
public CSGOServers(string steamWebApiKey, ISteamWebInterface steamWebInterface = null)
21+
{
22+
this.steamWebInterface = steamWebInterface == null
23+
? new SteamWebInterface(steamWebApiKey, "ICSGOServers_730")
24+
: steamWebInterface;
25+
}
2026

2127
/// <summary>
2228
/// Maps to the Steam Web API interface/method of ICSGOServers_730/GetGameServersStatus/v1
2329
/// </summary>
2430
/// <returns></returns>
2531
public async Task<ServerStatusModel> GetGameServerStatusAsync()
2632
{
27-
var gameServerStatus = await GetAsync<ServerStatusResultContainer>("GetGameServersStatus", 1);
33+
var gameServerStatus = await steamWebInterface.GetAsync<ServerStatusResultContainer>("GetGameServersStatus", 1);
2834

2935
var gameServerStatusModel = AutoMapperConfiguration.Mapper.Map<ServerStatusResult, ServerStatusModel>(gameServerStatus.Result);
3036

SteamWebAPI2/Interfaces/DOTA2Econ.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,19 @@ namespace SteamWebAPI2.Interfaces
1111
/// <summary>
1212
/// Represents a Steam Web API interface endpoint located at IDOTA2Econ
1313
/// </summary>
14-
public class DOTA2Econ : SteamWebInterface, IDOTA2Econ
14+
public class DOTA2Econ : IDOTA2Econ
1515
{
16+
private ISteamWebInterface steamWebInterface;
17+
1618
/// <summary>
1719
/// Default constructor established the Steam Web API key and initializes for subsequent method calls
1820
/// </summary>
1921
/// <param name="steamWebApiKey"></param>
20-
public DOTA2Econ(string steamWebApiKey)
21-
: base(steamWebApiKey, "IEconDOTA2_570")
22+
public DOTA2Econ(string steamWebApiKey, ISteamWebInterface steamWebInterface = null)
2223
{
24+
this.steamWebInterface = steamWebInterface == null
25+
? new SteamWebInterface(steamWebApiKey, "IEconDOTA2_570")
26+
: steamWebInterface;
2327
}
2428

2529
/// <summary>
@@ -33,7 +37,7 @@ public async Task<IReadOnlyCollection<GameItemModel>> GetGameItemsAsync(string l
3337

3438
parameters.AddIfHasValue(language, "language");
3539

36-
var gameItems = await GetAsync<GameItemResultContainer>("GetGameItems", 1, parameters);
40+
var gameItems = await steamWebInterface.GetAsync<GameItemResultContainer>("GetGameItems", 1, parameters);
3741

3842
var gameItemModels = AutoMapperConfiguration.Mapper.Map<IList<GameItem>, IReadOnlyCollection<GameItemModel>>(gameItems.Result.Items);
3943

@@ -55,7 +59,7 @@ public async Task<IReadOnlyCollection<HeroModel>> GetHeroesAsync(string language
5559
parameters.AddIfHasValue(language, "language");
5660
parameters.AddIfHasValue(itemizedOnlyValue, "itemizedonly");
5761

58-
var heroes = await GetAsync<HeroResultContainer>("GetHeroes", 1, parameters);
62+
var heroes = await steamWebInterface.GetAsync<HeroResultContainer>("GetHeroes", 1, parameters);
5963

6064
var heroModels = AutoMapperConfiguration.Mapper.Map<IList<Hero>, IReadOnlyCollection<HeroModel>>(heroes.Result.Heroes);
6165

@@ -80,7 +84,7 @@ public async Task<string> GetItemIconPathAsync(string iconName, string iconType
8084
parameters.AddIfHasValue(iconName, "iconname");
8185
parameters.AddIfHasValue(iconType, "icontype");
8286

83-
var itemIconPath = await GetAsync<ItemIconPathResultContainer>("GetItemIconPath", 1, parameters);
87+
var itemIconPath = await steamWebInterface.GetAsync<ItemIconPathResultContainer>("GetItemIconPath", 1, parameters);
8488
return itemIconPath.Result.Path;
8589
}
8690

@@ -95,7 +99,7 @@ public async Task<IReadOnlyCollection<RarityModel>> GetRaritiesAsync(string lang
9599

96100
parameters.AddIfHasValue(language, "language");
97101

98-
var raritiesContainer = await GetAsync<RarityResultContainer>("GetRarities", 1, parameters);
102+
var raritiesContainer = await steamWebInterface.GetAsync<RarityResultContainer>("GetRarities", 1, parameters);
99103

100104
var rarityModels = raritiesContainer.Result.Rarities.Select(x => new RarityModel()
101105
{
@@ -121,7 +125,7 @@ public async Task<int> GetTournamentPrizePoolAsync(int? leagueId = null)
121125

122126
parameters.AddIfHasValue(leagueId, "leagueid");
123127

124-
var raritiesContainer = await GetAsync<PrizePoolResultContainer>("GetTournamentPrizePool", 1, parameters);
128+
var raritiesContainer = await steamWebInterface.GetAsync<PrizePoolResultContainer>("GetTournamentPrizePool", 1, parameters);
125129
return raritiesContainer.Result.PrizePool;
126130
}
127131
}

SteamWebAPI2/Interfaces/DOTA2Fantasy.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,24 @@
44
using System.Threading.Tasks;
55
using System.Linq;
66
using System.Collections.ObjectModel;
7+
using SteamWebAPI2.Utilities;
78

89
namespace SteamWebAPI2.Interfaces
910
{
10-
public class DOTA2Fantasy : SteamWebInterface, IDOTA2Fantasy
11+
public class DOTA2Fantasy : IDOTA2Fantasy
1112
{
12-
public DOTA2Fantasy(string steamWebApiKey)
13-
: base(steamWebApiKey, "IDOTA2Fantasy_570")
14-
{ }
13+
private ISteamWebInterface steamWebInterface;
14+
15+
/// <summary>
16+
/// Default constructor established the Steam Web API key and initializes for subsequent method calls
17+
/// </summary>
18+
/// <param name="steamWebApiKey"></param>
19+
public DOTA2Fantasy(string steamWebApiKey, ISteamWebInterface steamWebInterface = null)
20+
{
21+
this.steamWebInterface = steamWebInterface == null
22+
? new SteamWebInterface(steamWebApiKey, "IDOTA2Fantasy_570")
23+
: steamWebInterface;
24+
}
1525

1626
/// <summary>
1727
/// Returns some official / league information for a Dota 2 player for fantasy sports purposes.
@@ -23,7 +33,7 @@ public async Task<PlayerOfficialInfoModel> GetPlayerOfficialInfo(long steamId)
2333
List<SteamWebRequestParameter> parameters = new List<SteamWebRequestParameter>();
2434
parameters.Add(new SteamWebRequestParameter("accountid", steamId.ToString()));
2535

26-
var playerOfficialInfo = await GetAsync<PlayerOfficialInfoResultContainer>("GetPlayerOfficialInfo", 1, parameters);
36+
var playerOfficialInfo = await steamWebInterface.GetAsync<PlayerOfficialInfoResultContainer>("GetPlayerOfficialInfo", 1, parameters);
2737

2838
var playerOfficialInfoModel = new PlayerOfficialInfoModel()
2939
{
@@ -43,7 +53,7 @@ public async Task<PlayerOfficialInfoModel> GetPlayerOfficialInfo(long steamId)
4353
/// <returns></returns>
4454
public async Task<ProPlayerDetailModel> GetProPlayerList()
4555
{
46-
var proPlayerList = await GetAsync<ProPlayerListResultContainer>("GetProPlayerList", 1);
56+
var proPlayerList = await steamWebInterface.GetAsync<ProPlayerListResultContainer>("GetProPlayerList", 1);
4757

4858
var proPlayerDetailModel = AutoMapperConfiguration.Mapper.Map<ProPlayerListResult, ProPlayerDetailModel>(proPlayerList.Result);
4959

0 commit comments

Comments
 (0)