Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions LinkAce.sln
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinkAce.NET", "src\LinkAce.
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestClient", "src\TestClient\TestClient.csproj", "{97052387-BAA1-40E8-A861-C412B373FBDC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinkAce.NET.Tests", "tests\LinkAce.NET.Tests\LinkAce.NET.Tests.csproj", "{671997C6-2DA3-45AB-87C2-4A335C976685}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -33,10 +35,15 @@ Global
{97052387-BAA1-40E8-A861-C412B373FBDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97052387-BAA1-40E8-A861-C412B373FBDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97052387-BAA1-40E8-A861-C412B373FBDC}.Release|Any CPU.Build.0 = Release|Any CPU
{671997C6-2DA3-45AB-87C2-4A335C976685}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{671997C6-2DA3-45AB-87C2-4A335C976685}.Debug|Any CPU.Build.0 = Debug|Any CPU
{671997C6-2DA3-45AB-87C2-4A335C976685}.Release|Any CPU.ActiveCfg = Release|Any CPU
{671997C6-2DA3-45AB-87C2-4A335C976685}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{7E05B1B4-5625-4A84-A2B2-4D66C8059904} = {E1115509-DC42-44D8-A031-A207EF90073F}
{6C83B6FB-E141-46BA-A446-8346BB11A7E3} = {22C844A6-ACCE-4473-9C7B-D53D613DA802}
{97052387-BAA1-40E8-A861-C412B373FBDC} = {22C844A6-ACCE-4473-9C7B-D53D613DA802}
{671997C6-2DA3-45AB-87C2-4A335C976685} = {66EB4E20-E8C9-43B5-9B51-B3BB962AEEF2}
EndGlobalSection
EndGlobal
3 changes: 3 additions & 0 deletions src/LinkAce.NET/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("LinkAce.NET.Tests")]
31 changes: 31 additions & 0 deletions tests/LinkAce.NET.Tests/ApiResponses/SearchLinkResponseTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using LinkAce.NET.ApiResponses;
using LinkAce.NET.Tests.Helpers;

namespace LinkAce.NET.Tests.ApiResponses;

[TestClass]
public class SearchLinkResponseTests
{
[TestMethod]
public void SearchLinkResponse_HasProperties()
{
// Arrange
SearchLinkResponse obj = new();
const int expectedCount = 12;

// Assert
Assert.AreEqual(expectedCount, obj.PropertyCount());
Assert.IsTrue(obj.HasProperty("CurrentPage"));
Assert.IsTrue(obj.HasProperty("Data"));
Assert.IsTrue(obj.HasProperty("FirstPageUrl"));
Assert.IsTrue(obj.HasProperty("From"));
Assert.IsTrue(obj.HasProperty("LastPage"));
Assert.IsTrue(obj.HasProperty("LastPageUrl"));
Assert.IsTrue(obj.HasProperty("NextPageUrl"));
Assert.IsTrue(obj.HasProperty("Path"));
Assert.IsTrue(obj.HasProperty("PerPage"));
Assert.IsTrue(obj.HasProperty("PreviousPageUrl"));
Assert.IsTrue(obj.HasProperty("To"));
Assert.IsTrue(obj.HasProperty("Total"));
}
}
40 changes: 40 additions & 0 deletions tests/LinkAce.NET.Tests/Entities/TagTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using LinkAce.NET.Entites;
using LinkAce.NET.Tests.Helpers;

namespace LinkAce.NET.Tests.Entities;

[TestClass]
public class TagTests
{
[TestMethod]
public void Tag_HasProperties()
{
// Arrange
Tag obj = new();
const int expectedCount = 8;

// Act
Assert.AreEqual(expectedCount, obj.PropertyCount());
Assert.IsTrue(obj.HasProperty("CreatedAt"));
Assert.IsTrue(obj.HasProperty("DeletedAt"));
Assert.IsTrue(obj.HasProperty("Id"));
Assert.IsTrue(obj.HasProperty("IsPrivate"));
Assert.IsTrue(obj.HasProperty("Name"));
Assert.IsTrue(obj.HasProperty("Pivot"));
Assert.IsTrue(obj.HasProperty("UpdatedAt"));
Assert.IsTrue(obj.HasProperty("UserId"));
}

[TestMethod]
public void ImplicitConversion_String_To_Tag()
{
// Arrange
const string expectedName = "TestTag";

// Act
Tag tag = expectedName;

// Assert
Assert.AreEqual(expectedName, tag.Name);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using LinkAce.NET.Entites;
using LinkAce.NET.Extensions;

namespace LinkAce.NET.Tests.Extensions;

[TestClass]
public class StringArrayExtensionsTests
{

[TestMethod]
public void ToTagArray_Success()
{
// Arrange
string[] expectedNames = { "TestTag1", "TestTag2", "TestTag3" };

// Act
Tag[] tags = expectedNames.ToTagArray();

// Assert
Assert.AreEqual(expectedNames.Length, tags.Length);
for (int i = 0; i < expectedNames.Length; i++)
{
Assert.AreEqual(expectedNames[i], tags[i].Name);
}
}
}
1 change: 1 addition & 0 deletions tests/LinkAce.NET.Tests/GlobalUsings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
global using Microsoft.VisualStudio.TestTools.UnitTesting;
23 changes: 23 additions & 0 deletions tests/LinkAce.NET.Tests/Helpers/EntityTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Reflection;

namespace LinkAce.NET.Tests.Helpers;

public static class EntityTests
{
public static bool HasMethod(this object obj, string methodName)
{
var type = obj.GetType();
try
{
return type.GetMethod(methodName) is not null;
}
catch (AmbiguousMatchException)
{
return true;
}
}
public static bool HasProperty(this object obj, string propertyName)
=> obj.GetType().GetProperty(propertyName) is not null;
public static int PropertyCount(this object obj)
=> obj.GetType().GetProperties().Length;
}
24 changes: 24 additions & 0 deletions tests/LinkAce.NET.Tests/LinkAce.NET.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="MSTest.TestAdapter" Version="3.0.4" />
<PackageReference Include="MSTest.TestFramework" Version="3.0.4" />
<PackageReference Include="coverlet.collector" Version="6.0.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\LinkAce.NET\LinkAce.NET.csproj" />
</ItemGroup>

</Project>
66 changes: 66 additions & 0 deletions tests/LinkAce.NET.Tests/LinkAceClientTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using System.Net;
using LinkAce.NET.Entites;
using LinkAce.NET.Extensions;
using Moq;
using Moq.Protected;

namespace LinkAce.NET.Tests;

[TestClass]
public class LinkAceClientTests
{
private LinkAceClient _client;
private Mock<HttpMessageHandler> _mockHttpMessageHandler;
[TestInitialize]
public void Init()
{
_mockHttpMessageHandler = new Mock<HttpMessageHandler>();
var httpClient = new HttpClient(_mockHttpMessageHandler.Object);
_client = new LinkAceClient("https://links.example.com", TestData.TestApiKey, httpClient);
}
[TestMethod]
public async Task SearchLinksByUrl_Success()
{
// Arrange
_mockHttpMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(TestData.SearchLinkResponseJson)
});

// Act
var result = await _client.SearchLinksByUrl("jrgnsn.net");

// Assert
Assert.IsNotNull(result);
}
[TestMethod]
public async Task CreateLink_Success()
{
// Arrange
_mockHttpMessageHandler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(TestData.CreateLinkResponseJson)
});

// Act
var result = await _client.CreateLink(new Link()
{
Title = "Test Link",
Url = "https://jrgnsn.net",
Description = "A test link",
Tags = new[]{ "test" }.ToTagArray()
});

// Assert
Assert.IsNotNull(result);

}
}
36 changes: 36 additions & 0 deletions tests/LinkAce.NET.Tests/MetaTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Net.Http.Headers;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace LinkAce.NET.Tests
{
[TestClass]
public class MetaTests
{
[TestMethod]
public void UserAgent_ShouldContainCorrectNameAndVersion()
{
// Arrange
var expectedName = "LinkAce.NET";
var expectedVersion = Assembly.GetEntryAssembly()!.GetName().Version!.ToString();
var expectedUserAgent = new ProductInfoHeaderValue(expectedName, expectedVersion);

// Act
var actualUserAgent = Meta.UserAgent;

// Assert
Assert.AreEqual(expectedUserAgent.Product.Name, actualUserAgent.Product.Name);
Assert.AreEqual(expectedUserAgent.Product.Version, actualUserAgent.Product.Version);
}

[TestMethod]
public void AssemblyVersion_ShouldNotBeNullOrEmpty()
{
// Act
var assemblyVersion = Meta.AssemblyVersion;

// Assert
Assert.IsFalse(string.IsNullOrEmpty(assemblyVersion));
}
}
}
Loading