Add test for checking CreatedBy on basic record creation

This commit is contained in:
Pat Hartl 2025-03-16 21:04:24 -05:00
parent a47f3feeb7
commit 698ddc378e
7 changed files with 183 additions and 14 deletions

View file

@ -27,6 +27,7 @@ namespace LANCommander.SDK
private AuthToken Token;
private bool Connected = false;
private bool IgnoreVersion = false;
public Uri BaseUrl;
public string DefaultInstallDirectory;
@ -44,6 +45,7 @@ namespace LANCommander.SDK
public readonly LobbyService Lobbies;
public readonly ServerService Servers;
public readonly PlaySessionService PlaySessions;
public readonly TagService Tags;
private Settings _Settings { get; set; }
public Settings Settings
@ -79,6 +81,7 @@ namespace LANCommander.SDK
Lobbies = new LobbyService(this);
Servers = new ServerService(this);
PlaySessions = new PlaySessionService(this);
Tags = new TagService(this);
BaseCmdlet.Client = this;
@ -116,6 +119,7 @@ namespace LANCommander.SDK
Lobbies = new LobbyService(this, logger);
Servers = new ServerService(this, logger);
PlaySessions = new PlaySessionService(this, logger);
Tags = new TagService(this, logger);
BaseCmdlet.Client = this;
@ -142,6 +146,9 @@ namespace LANCommander.SDK
Lobbies = new LobbyService(this);
Servers = new ServerService(this);
PlaySessions = new PlaySessionService(this);
Tags = new TagService(this);
IgnoreVersion = true;
BaseCmdlet.Client = this;
}
@ -202,7 +209,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = ApiClient.Post<T>(request);
@ -228,7 +235,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = ApiClient.Post<T>(request);
@ -255,7 +262,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = await ApiClient.PostAsync<T>(request);
@ -281,7 +288,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = await ApiClient.PostAsync<T>(request);
@ -307,7 +314,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = await ApiClient.PutAsync<T>(request);
@ -333,7 +340,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = ApiClient.Get<T>(request);
@ -359,7 +366,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = await ApiClient.GetAsync<T>(request);
@ -385,7 +392,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = await ApiClient.DeleteAsync<T>(request);
@ -496,7 +503,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
request.AddFile(fileName, data, fileName);
@ -521,7 +528,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
request.AddFile(fileName, data, fileName);
@ -594,7 +601,7 @@ namespace LANCommander.SDK
Password = password
});
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
var response = await ApiClient.ExecuteAsync<AuthToken>(request);
@ -778,7 +785,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {Token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
if (String.IsNullOrEmpty(token.AccessToken) || String.IsNullOrEmpty(token.RefreshToken))
@ -829,7 +836,7 @@ namespace LANCommander.SDK
.AddHeader("Authorization", $"Bearer {token.AccessToken}")
.AddHeader("X-API-Version", GetCurrentVersion().ToString());
if (!ignoreVersion)
if (!ignoreVersion && !IgnoreVersion)
request.Interceptors = new List<Interceptor>() { new VersionInterceptor() };
if (String.IsNullOrEmpty(token.AccessToken) || String.IsNullOrEmpty(token.RefreshToken))

View file

@ -0,0 +1,58 @@
using Force.Crc32;
using LANCommander.SDK.Extensions;
using LANCommander.SDK.Helpers;
using LANCommander.SDK.Models;
using LANCommander.SDK.PowerShell;
using Microsoft.Extensions.Logging;
using RestSharp;
using SharpCompress.Archives;
using SharpCompress.Archives.Zip;
using SharpCompress.Common;
using SharpCompress.Readers;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace LANCommander.SDK.Services
{
public class TagService
{
private readonly ILogger Logger;
private readonly Client Client;
public TagService(Client client)
{
Client = client;
}
public TagService(Client client, ILogger logger)
{
Client = client;
Logger = logger;
}
public async Task<Tag> CreateAsync(Tag tag)
{
return await Client.PostRequestAsync<Tag>("/api/Tags", tag);
}
public async Task<Tag> UpdateAsync(Tag tag)
{
return await Client.PostRequestAsync<Tag>($"/api/Tags/{tag.Id}", tag);
}
public async Task DeleteAsync(Tag tag)
{
await Client.DeleteRequestAsync<Tag>($"/api/Tags/{tag.Id}");
}
}
}

View file

@ -26,7 +26,7 @@ namespace LANCommander.Server
CreateMap<Data.Models.ServerHttpPath, SDK.Models.ServerHttpPath>();
CreateMap<Data.Models.SavePath, SDK.Models.SavePath>();
CreateMap<Data.Models.Script, SDK.Models.Script>();
CreateMap<Data.Models.Tag, SDK.Models.Tag>();
CreateMap<Data.Models.Tag, SDK.Models.Tag>().ReverseMap();
CreateMap<Data.Models.User, SDK.Models.User>();
CreateMap<Data.Models.GameCustomField, SDK.Models.GameCustomField>();

View file

@ -0,0 +1,34 @@
using Shouldly;
using LANCommander.Server.Services;
namespace LANCommander.Server.Tests.Data;
[Collection("Application")]
public class VersioningTests(ApplicationFixture fixture) : BaseTest(fixture)
{
[Fact]
public async Task CreatedByShouldWork()
{
// Simple service that's not bound to change much
var tagService = GetService<TagService>();
var user = await EnsureAdminUserCreatedAsync();
await Client.AuthenticateAsync(TestConstants.AdminUserName, TestConstants.AdminInitialPassword);
var response = await Client.Tags.CreateAsync(new SDK.Models.Tag
{
Name = "Test Tag",
});
var tag = await tagService
.Include(t => t.CreatedBy)
.GetAsync(response.Id);
tag.Name.ShouldBe("Test Tag");
tag.CreatedById.ShouldBe(user.Id);
tag.CreatedBy.ShouldNotBeNull();
tag.CreatedBy.UserName.ShouldBe(user.UserName);
tag.CreatedBy.Id.ShouldBe(user.Id);
}
}

View file

@ -0,0 +1,64 @@
using AutoMapper;
using LANCommander.Server.Services;
using Microsoft.AspNetCore.Mvc;
namespace LANCommander.Server.Endpoints;
public static class TagEndpoints
{
public static void MapTagEndpoints(this IEndpointRouteBuilder routes)
{
var group = routes.MapGroup("/api/Tags");
group.MapPost("/", CreateAsync)
.RequireAuthorization("Administrator");
group.MapPost("/{id:guid}", UpdateAsync)
.RequireAuthorization("Administrator");
group.MapDelete("/{id:guid}", DeleteAsync)
.RequireAuthorization("Administrator");
}
internal static async Task<IResult> CreateAsync(
[FromBody] SDK.Models.Tag tag,
[FromServices] TagService tagService,
[FromServices] IMapper mapper)
{
var entity = await tagService.AddAsync(mapper.Map<Data.Models.Tag>(tag));
return TypedResults.Ok(entity);
}
internal static async Task<IResult> UpdateAsync(
Guid id,
[FromBody] SDK.Models.Tag tag,
[FromServices] TagService tagService,
[FromServices] IMapper mapper)
{
var existing = await tagService.GetAsync(id);
if (existing == null)
return TypedResults.NotFound();
tag.Id = existing.Id;
existing = await tagService.UpdateAsync(mapper.Map<Data.Models.Tag>(tag));
return TypedResults.Ok(existing);
}
internal static async Task<IResult> DeleteAsync(
[FromBody] SDK.Models.Tag tag,
[FromServices] TagService tagService)
{
var existing = await tagService.GetAsync(tag.Id);
if (existing == null)
return TypedResults.NotFound();
await tagService.DeleteAsync(existing);
return TypedResults.NoContent();
}
}

View file

@ -25,6 +25,7 @@ public static class Endpoints
{
endpoints.MapDownloadEndpoints();
endpoints.MapSaveEndpoints();
endpoints.MapTagEndpoints();
endpoints.MapControllers();
endpoints.MapFallbackToPage("/_Host");
});

View file

@ -52,6 +52,11 @@ public static class Identity
})
.AddAuthenticationProviders(settings)
.AddIdentityCookies();
builder.Services.AddAuthorizationBuilder()
.AddPolicy("Administrator", policy =>
policy
.RequireRole("Administrator"));
builder.Services.Configure<CookiePolicyOptions>(options =>
{