Add test for checking CreatedBy on basic record creation
This commit is contained in:
parent
a47f3feeb7
commit
698ddc378e
7 changed files with 183 additions and 14 deletions
|
|
@ -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))
|
||||
|
|
|
|||
58
LANCommander.SDK/Services/TagService.cs
Normal file
58
LANCommander.SDK/Services/TagService.cs
Normal 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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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>();
|
||||
|
||||
|
|
|
|||
34
LANCommander.Server.Tests/Data/VersioningTests.cs
Normal file
34
LANCommander.Server.Tests/Data/VersioningTests.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
64
LANCommander.Server/Endpoints/TagEndpoints.cs
Normal file
64
LANCommander.Server/Endpoints/TagEndpoints.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
|
@ -25,6 +25,7 @@ public static class Endpoints
|
|||
{
|
||||
endpoints.MapDownloadEndpoints();
|
||||
endpoints.MapSaveEndpoints();
|
||||
endpoints.MapTagEndpoints();
|
||||
endpoints.MapControllers();
|
||||
endpoints.MapFallbackToPage("/_Host");
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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 =>
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue