Fix lodestone character id extraction
This commit is contained in:
@@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronosServer", "Mar
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronos.API", "..\MareAPI\MareSynchronosAPI\MareSynchronos.API.csproj", "{326BFB1B-5571-47A6-8513-1FFDB32D53B0}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronos.API", "..\MareAPI\MareSynchronosAPI\MareSynchronos.API.csproj", "{326BFB1B-5571-47A6-8513-1FFDB32D53B0}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MareSynchronosServerTest", "MareSynchronosServerTest\MareSynchronosServerTest.csproj", "{25A82A2A-35C2-4EE0-A0E8-DFDD77978DDA}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -21,6 +23,10 @@ Global
|
|||||||
{326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Release|Any CPU.Build.0 = Release|Any CPU
|
{326BFB1B-5571-47A6-8513-1FFDB32D53B0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{25A82A2A-35C2-4EE0-A0E8-DFDD77978DDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{25A82A2A-35C2-4EE0-A0E8-DFDD77978DDA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{25A82A2A-35C2-4EE0-A0E8-DFDD77978DDA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{25A82A2A-35C2-4EE0-A0E8-DFDD77978DDA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -302,14 +302,16 @@ namespace MareSynchronosServer.Discord
|
|||||||
return auth;
|
return auth;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int? ParseCharacterIdFromLodestoneUrl(string lodestoneUrl)
|
private int? ParseCharacterIdFromLodestoneUrl(string lodestoneUrl)
|
||||||
{
|
{
|
||||||
var isLodestoneUrl = Regex.Match(lodestoneUrl, @"https:\/\/(na|eu|de|fr|jp)\.finalfantasyxiv\.com\/lodestone\/character\/\d+").Success;
|
var regex = new Regex(@"https:\/\/(na|eu|de|fr|jp)\.finalfantasyxiv\.com\/lodestone\/character\/\d+");
|
||||||
if (!isLodestoneUrl) return null;
|
var matches = regex.Match(lodestoneUrl);
|
||||||
|
var isLodestoneUrl = matches.Success;
|
||||||
|
if (!isLodestoneUrl || matches.Groups.Count < 1) return null;
|
||||||
|
|
||||||
lodestoneUrl = lodestoneUrl.Split('/', StringSplitOptions.RemoveEmptyEntries).Last();
|
lodestoneUrl = matches.Groups[0].ToString();
|
||||||
if (!int.TryParse(lodestoneUrl, out int lodestoneId))
|
var stringId = lodestoneUrl.Split('/', StringSplitOptions.RemoveEmptyEntries).Last();
|
||||||
{
|
if (!int.TryParse(stringId, out int lodestoneId)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
using FluentAssertions;
|
||||||
|
using MareSynchronosServer.Discord;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Primitives;
|
||||||
|
using Moq;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MareSynchronosServerTest.Discord {
|
||||||
|
public class DiscordBotTest {
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[TestCase("", null)]
|
||||||
|
[TestCase("abcd", null)]
|
||||||
|
[TestCase("www.google.de", null)]
|
||||||
|
[TestCase("https://www.google.de", null)]
|
||||||
|
[TestCase("de.finalfantasyxiv.com/lodestone/character/1234", null)]
|
||||||
|
[TestCase("https://cn.finalfantasyxiv.com/lodestone/character/1234", null)]
|
||||||
|
[TestCase("http://jp.finalfantasyxiv.com/lodestone/character/1234", null)]
|
||||||
|
[TestCase("https://jp.finalfantasyxiv.com/character/1234", null)]
|
||||||
|
[TestCase("https://jp.finalfantasyxiv.com/lodestone/1234", null)]
|
||||||
|
[TestCase("https://www.finalfantasyxiv.com/lodestone/character/1234", null)]
|
||||||
|
[TestCase("https://jp.finalfantasyxiv.com/lodestone/character/1234", 1234)]
|
||||||
|
[TestCase("https://fr.finalfantasyxiv.com/lodestone/character/1234", 1234)]
|
||||||
|
[TestCase("https://eu.finalfantasyxiv.com/lodestone/character/1234/", 1234)]
|
||||||
|
[TestCase("https://eu.finalfantasyxiv.com/lodestone/character/1234?myurlparameter=500", 1234)]
|
||||||
|
[TestCase("https://de.finalfantasyxiv.com/lodestone/character/1234/whatever/3456", 1234)]
|
||||||
|
[TestCase("https://na.finalfantasyxiv.com/lodestone/character/1234abcd4321/whatever/3456", 1234)]
|
||||||
|
public void Test1(string url, int? expectedId) {
|
||||||
|
var inMemorySettings = new Dictionary<string, string> {
|
||||||
|
{"DiscordBotToken", "1234"}
|
||||||
|
};
|
||||||
|
|
||||||
|
IConfiguration configuration = new ConfigurationBuilder()
|
||||||
|
.AddInMemoryCollection(inMemorySettings)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var spMock = new Mock<IServiceProvider>();
|
||||||
|
var loggerMock = new Mock<ILogger<DiscordBot>>();
|
||||||
|
|
||||||
|
var sut = new DiscordBot(spMock.Object, configuration, loggerMock.Object);
|
||||||
|
MethodInfo methodInfo = sut.GetType().GetMethod("ParseCharacterIdFromLodestoneUrl", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||||
|
var actualId = methodInfo.Invoke(sut, new object[] { url });
|
||||||
|
|
||||||
|
actualId.Should().Be(expectedId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="FluentAssertions" Version="6.7.0" />
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
||||||
|
<PackageReference Include="Moq" Version="4.18.2" />
|
||||||
|
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||||
|
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||||
|
<PackageReference Include="NUnit.Analyzers" Version="3.3.0" />
|
||||||
|
<PackageReference Include="coverlet.collector" Version="3.1.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\MareSynchronosServer\MareSynchronosServer.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
1
MareSynchronosServer/MareSynchronosServerTest/Usings.cs
Normal file
1
MareSynchronosServer/MareSynchronosServerTest/Usings.cs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
global using NUnit.Framework;
|
||||||
Reference in New Issue
Block a user