Browse Source

Fix build.

pull/1301/head
Sebastian Stehle 6 months ago
parent
commit
c2a50a6fb7
  1. 4
      Dockerfile
  2. 1628
      backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260323154443_MigrateToNet10.Designer.cs
  3. 46
      backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260323154443_MigrateToNet10.cs
  4. 7
      backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/MySqlDbContextModelSnapshot.cs
  5. 1629
      backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260323155026_MigrateToNet10.Designer.cs
  6. 36
      backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260323155026_MigrateToNet10.cs
  7. 7
      backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/PostgresDbContextModelSnapshot.cs
  8. 2
      backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/PostgresAppDbContextDesignTimeFactory.cs
  9. 1631
      backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260323155035_MigrateToNet10.Designer.cs
  10. 36
      backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260323155035_MigrateToNet10.cs
  11. 7
      backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/SqlServerDbContextModelSnapshot.cs
  12. 2
      backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/SqlServerAppDbContextDesignTimeFactory.cs
  13. 4
      backend/src/Squidex.Data.EntityFramework/docker-compose.yml
  14. 11
      backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs
  15. 10
      backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs
  16. 8
      backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs
  17. 4
      backend/tests/Squidex.Data.Tests/MongoDb/Domain/Assets/AssetQueryTests.cs
  18. 6
      backend/tests/Squidex.Data.Tests/MongoDb/Domain/Contents/ContentQueryTests.cs
  19. 10
      backend/tests/Squidex.Data.Tests/MongoDb/Infrastructure/DomainIdSerializerTests.cs
  20. 13
      backend/tests/Squidex.Data.Tests/MongoDb/Infrastructure/NamedIdTests.cs
  21. 4
      backend/tests/Squidex.Data.Tests/MongoDb/Infrastructure/Queries/MongoQueryTests.cs
  22. 2
      backend/tests/Squidex.Data.Tests/MongoDb/TestHelpers/MongoTestUtils.cs
  23. 26
      backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs
  24. 19
      backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs

4
Dockerfile

@ -17,7 +17,7 @@ WORKDIR /source
# Copy nuget project files. # Copy nuget project files.
COPY backend/Directory.Build.props ./ COPY backend/Directory.Build.props ./
COPY backend/*.sln ./ COPY backend/*.slnx ./
# Copy the main source project files # Copy the main source project files
COPY backend/src/*/*.csproj ./ COPY backend/src/*/*.csproj ./
@ -79,7 +79,7 @@ RUN cp -a build /build/
# #
# Stage 3, Build runtime # Stage 3, Build runtime
# #
FROM mcr.microsoft.com/dotnet/aspnet:10.0-bookworm-slim FROM mcr.microsoft.com/dotnet/aspnet:10.0
ARG SQUIDEX__RUNTIME__VERSION=7.0.0 ARG SQUIDEX__RUNTIME__VERSION=7.0.0

1628
backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260323154443_MigrateToNet10.Designer.cs

File diff suppressed because it is too large

46
backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/20260323154443_MigrateToNet10.cs

@ -0,0 +1,46 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Squidex.Providers.MySql.App.Migrations
{
/// <inheritdoc />
public partial class MigrateToNet10 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "ApplicationId",
table: "OpenIddictAuthorizations",
type: "varchar(255)",
nullable: true,
oldClrType: typeof(string),
oldType: "varchar(255)")
.Annotation("MySql:CharSet", "utf8mb4")
.OldAnnotation("MySql:CharSet", "utf8mb4");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "OpenIddictAuthorizations",
keyColumn: "ApplicationId",
keyValue: null,
column: "ApplicationId",
value: "");
migrationBuilder.AlterColumn<string>(
name: "ApplicationId",
table: "OpenIddictAuthorizations",
type: "varchar(255)",
nullable: false,
oldClrType: typeof(string),
oldType: "varchar(255)",
oldNullable: true)
.Annotation("MySql:CharSet", "utf8mb4")
.OldAnnotation("MySql:CharSet", "utf8mb4");
}
}
}

7
backend/src/Squidex.Data.EntityFramework/Providers/MySql/App/Migrations/MySqlDbContextModelSnapshot.cs

@ -18,7 +18,7 @@ namespace Squidex.Providers.MySql.Migrations
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "8.0.16") .HasAnnotation("ProductVersion", "10.0.5")
.HasAnnotation("Relational:MaxIdentifierLength", 64); .HasAnnotation("Relational:MaxIdentifierLength", 64);
MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
@ -226,7 +226,6 @@ namespace Squidex.Providers.MySql.Migrations
.HasColumnType("varchar(255)"); .HasColumnType("varchar(255)");
b.Property<string>("ApplicationId") b.Property<string>("ApplicationId")
.IsRequired()
.HasColumnType("varchar(255)"); .HasColumnType("varchar(255)");
b.Property<string>("ConcurrencyToken") b.Property<string>("ConcurrencyToken")
@ -322,7 +321,7 @@ namespace Squidex.Providers.MySql.Migrations
b.ToTable("OpenIddictTokens", (string)null); b.ToTable("OpenIddictTokens", (string)null);
}); });
modelBuilder.Entity("Squidex.AI.Mongo.EFChatEntity", b => modelBuilder.Entity("Squidex.AI.EntityFramework.EFChatEntity", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id")
.HasMaxLength(255) .HasMaxLength(255)
@ -1103,7 +1102,7 @@ namespace Squidex.Providers.MySql.Migrations
b.Property<long>("EventStreamOffset") b.Property<long>("EventStreamOffset")
.HasColumnType("bigint"); .HasColumnType("bigint");
b.Property<string>("Events") b.PrimitiveCollection<string>("Events")
.IsRequired() .IsRequired()
.HasColumnType("longtext"); .HasColumnType("longtext");

1629
backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260323155026_MigrateToNet10.Designer.cs

File diff suppressed because it is too large

36
backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/20260323155026_MigrateToNet10.cs

@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Squidex.Providers.Postgres.App.Migrations
{
/// <inheritdoc />
public partial class MigrateToNet10 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "ApplicationId",
table: "OpenIddictAuthorizations",
type: "text",
nullable: true,
oldClrType: typeof(string),
oldType: "text");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "ApplicationId",
table: "OpenIddictAuthorizations",
type: "text",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "text",
oldNullable: true);
}
}
}

7
backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/Migrations/PostgresDbContextModelSnapshot.cs

@ -18,7 +18,7 @@ namespace Squidex.Providers.Postgres.Migrations
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "8.0.16") .HasAnnotation("ProductVersion", "10.0.5")
.HasAnnotation("Relational:MaxIdentifierLength", 63); .HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "postgis"); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "postgis");
@ -227,7 +227,6 @@ namespace Squidex.Providers.Postgres.Migrations
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("ApplicationId") b.Property<string>("ApplicationId")
.IsRequired()
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("ConcurrencyToken") b.Property<string>("ConcurrencyToken")
@ -323,7 +322,7 @@ namespace Squidex.Providers.Postgres.Migrations
b.ToTable("OpenIddictTokens", (string)null); b.ToTable("OpenIddictTokens", (string)null);
}); });
modelBuilder.Entity("Squidex.AI.Mongo.EFChatEntity", b => modelBuilder.Entity("Squidex.AI.EntityFramework.EFChatEntity", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id")
.HasMaxLength(255) .HasMaxLength(255)
@ -1104,7 +1103,7 @@ namespace Squidex.Providers.Postgres.Migrations
b.Property<long>("EventStreamOffset") b.Property<long>("EventStreamOffset")
.HasColumnType("bigint"); .HasColumnType("bigint");
b.Property<string[]>("Events") b.PrimitiveCollection<string[]>("Events")
.IsRequired() .IsRequired()
.HasColumnType("text[]"); .HasColumnType("text[]");

2
backend/src/Squidex.Data.EntityFramework/Providers/Postgres/App/PostgresAppDbContextDesignTimeFactory.cs

@ -16,7 +16,7 @@ public sealed class PostgresAppDbContextDesignTimeFactory : IDesignTimeDbContext
{ {
public PostgresAppDbContext CreateDbContext(string[] args) public PostgresAppDbContext CreateDbContext(string[] args)
{ {
const string ConnectionString = "Server=localhost;Port=54320;Database=test;User=postgres;Password=postgres"; const string ConnectionString = "Server=localhost;Port=54320;Database=test;Username=postgres;Password=postgres";
var builder = new DbContextOptionsBuilder<PostgresAppDbContext>() var builder = new DbContextOptionsBuilder<PostgresAppDbContext>()
.UseNpgsql(ConnectionString, options => .UseNpgsql(ConnectionString, options =>

1631
backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260323155035_MigrateToNet10.Designer.cs

File diff suppressed because it is too large

36
backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/20260323155035_MigrateToNet10.cs

@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Squidex.Providers.SqlServer.App.Migrations
{
/// <inheritdoc />
public partial class MigrateToNet10 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "ApplicationId",
table: "OpenIddictAuthorizations",
type: "nvarchar(450)",
nullable: true,
oldClrType: typeof(string),
oldType: "nvarchar(450)");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "ApplicationId",
table: "OpenIddictAuthorizations",
type: "nvarchar(450)",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "nvarchar(450)",
oldNullable: true);
}
}
}

7
backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/Migrations/SqlServerDbContextModelSnapshot.cs

@ -18,7 +18,7 @@ namespace Squidex.Providers.SqlServer.Migrations
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "8.0.16") .HasAnnotation("ProductVersion", "10.0.5")
.HasAnnotation("Relational:MaxIdentifierLength", 128); .HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
@ -228,7 +228,6 @@ namespace Squidex.Providers.SqlServer.Migrations
.HasColumnType("nvarchar(450)"); .HasColumnType("nvarchar(450)");
b.Property<string>("ApplicationId") b.Property<string>("ApplicationId")
.IsRequired()
.HasColumnType("nvarchar(450)"); .HasColumnType("nvarchar(450)");
b.Property<string>("ConcurrencyToken") b.Property<string>("ConcurrencyToken")
@ -325,7 +324,7 @@ namespace Squidex.Providers.SqlServer.Migrations
b.ToTable("OpenIddictTokens", (string)null); b.ToTable("OpenIddictTokens", (string)null);
}); });
modelBuilder.Entity("Squidex.AI.Mongo.EFChatEntity", b => modelBuilder.Entity("Squidex.AI.EntityFramework.EFChatEntity", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id")
.HasMaxLength(255) .HasMaxLength(255)
@ -1106,7 +1105,7 @@ namespace Squidex.Providers.SqlServer.Migrations
b.Property<long>("EventStreamOffset") b.Property<long>("EventStreamOffset")
.HasColumnType("bigint"); .HasColumnType("bigint");
b.Property<string>("Events") b.PrimitiveCollection<string>("Events")
.IsRequired() .IsRequired()
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");

2
backend/src/Squidex.Data.EntityFramework/Providers/SqlServer/App/SqlServerAppDbContextDesignTimeFactory.cs

@ -16,7 +16,7 @@ public sealed class SqlServerAppDbContextDesignTimeFactory : IDesignTimeDbContex
{ {
public SqlServerAppDbContext CreateDbContext(string[] args) public SqlServerAppDbContext CreateDbContext(string[] args)
{ {
const string ConnectionString = "Server=localhost;Port=14330;Database=test;User=sa;Password=sqlserver"; const string ConnectionString = "Server=localhost;Port=14330;Database=test;User=sa;Password=SqlServer2026!?";
var builder = new DbContextOptionsBuilder<SqlServerAppDbContext>() var builder = new DbContextOptionsBuilder<SqlServerAppDbContext>()
.UseSqlServer(ConnectionString, options => .UseSqlServer(ConnectionString, options =>

4
backend/src/Squidex.Data.EntityFramework/docker-compose.yml

@ -9,7 +9,7 @@ services:
- "54320:5432" - "54320:5432"
migration_mysql: migration_mysql:
image: mysql image: mysql:8
environment: environment:
- MYSQL_DATABASE=test - MYSQL_DATABASE=test
- MYSQL_USER=mysql - MYSQL_USER=mysql
@ -23,7 +23,7 @@ services:
migration_sqlserver: migration_sqlserver:
image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04 image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04
environment: environment:
- SA_PASSWORD=sqlserver - SA_PASSWORD=SqlServer2026!?
- ACCEPT_EULA=Y - ACCEPT_EULA=Y
ports: ports:
- "14330:1433" - "14330:1433"

11
backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs

@ -54,7 +54,7 @@ public sealed class JintScriptEngine(IMemoryCache cache, IOptions<JintScriptOpti
context.Complete(JsonMapper.Map(value)); context.Complete(JsonMapper.Map(value));
})); }));
var result = Execute(context, script); var result = await ExecuteAsync(context, script);
return await context.WaitForCompletionAsync(() => JsonMapper.Map(result)); return await context.WaitForCompletionAsync(() => JsonMapper.Map(result));
} }
@ -102,7 +102,7 @@ public sealed class JintScriptEngine(IMemoryCache cache, IOptions<JintScriptOpti
} }
})); }));
Execute(context, script); await ExecuteAsync(context, script);
return await context.WaitForCompletionAsync(() => data); return await context.WaitForCompletionAsync(() => data);
} }
@ -182,6 +182,13 @@ public sealed class JintScriptEngine(IMemoryCache cache, IOptions<JintScriptOpti
return context.Evaluate(parsed); return context.Evaluate(parsed);
} }
private Task<JsValue> ExecuteAsync(ScriptExecutionContext context, string script)
{
var parsed = parser.Parse(script);
return context.EvaluateAsync(parsed);
}
private static Exception MapException(Exception inner) private static Exception MapException(Exception inner)
{ {
static Exception BuildException(string errorKey, string message, Exception? inner = null) static Exception BuildException(string errorKey, string message, Exception? inner = null)

10
backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs

@ -18,6 +18,8 @@ public abstract class ScriptExecutionContext(Engine engine) : ScriptVars
public abstract JsValue Evaluate(Prepared<Script> script); public abstract JsValue Evaluate(Prepared<Script> script);
public abstract Task<JsValue> EvaluateAsync(Prepared<Script> script);
public abstract void Schedule(Func<IScheduler, CancellationToken, Task> action); public abstract void Schedule(Func<IScheduler, CancellationToken, Task> action);
} }
@ -47,8 +49,7 @@ public sealed class ScriptExecutionContext<T> : ScriptExecutionContext, ISchedul
{ {
TryComplete(); TryComplete();
var result = await tcs.Task.WithCancellation(cancellationToken); var result = await tcs.Task.WithCancellation(default);
if (result == null) if (result == null)
{ {
return fallback(); return fallback();
@ -67,6 +68,11 @@ public sealed class ScriptExecutionContext<T> : ScriptExecutionContext, ISchedul
return Engine.Evaluate(script); return Engine.Evaluate(script);
} }
public override Task<JsValue> EvaluateAsync(Prepared<Script> script)
{
return Engine.EvaluateAsync(script, cancellationToken);
}
public override void Schedule(Func<IScheduler, CancellationToken, Task> action) public override void Schedule(Func<IScheduler, CancellationToken, Task> action)
{ {
if (IsCompleted) if (IsCompleted)

8
backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs

@ -191,8 +191,14 @@ public sealed class ConstantWithTypeVisitor : QueryNodeVisitor<ClrValue>
return Instant.FromUtc(date.Year, date.Month, date.Day, 0, 0); return Instant.FromUtc(date.Year, date.Month, date.Day, 0, 0);
} }
var parseResult = InstantPattern.ExtendedIso.Parse(value.ToString()!); #pragma warning disable CS0618 // Type or member is obsolete
if (value is Date date2)
{
return Instant.FromUtc(date2.Year, date2.Month, date2.Day, 0, 0);
}
#pragma warning restore CS0618 // Type or member is obsolete
var parseResult = InstantPattern.ExtendedIso.Parse(value.ToString()!);
if (!parseResult.Success) if (!parseResult.Success)
{ {
throw new ODataException("Datetime is not in a valid format. Use ISO 8601"); throw new ODataException("Datetime is not in a valid format. Use ISO 8601");

4
backend/tests/Squidex.Data.Tests/MongoDb/Domain/Assets/AssetQueryTests.cs

@ -5,6 +5,8 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Driver; using MongoDB.Driver;
using NodaTime.Text; using NodaTime.Text;
@ -205,7 +207,7 @@ public class AssetQueryTests
new RenderArgs<MongoAssetEntity>( new RenderArgs<MongoAssetEntity>(
BsonSerializer.SerializerRegistry.GetSerializer<MongoAssetEntity>(), BsonSerializer.SerializerRegistry.GetSerializer<MongoAssetEntity>(),
BsonSerializer.SerializerRegistry)) BsonSerializer.SerializerRegistry))
.ToString(); .ToJson(new JsonWriterSettings { OutputMode = JsonOutputMode.Shell });
Assert.Equal(Cleanup(expected, arg), rendered); Assert.Equal(Cleanup(expected, arg), rendered);
} }

6
backend/tests/Squidex.Data.Tests/MongoDb/Domain/Contents/ContentQueryTests.cs

@ -5,6 +5,8 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Driver; using MongoDB.Driver;
using NodaTime.Text; using NodaTime.Text;
@ -228,7 +230,7 @@ public class ContentQueryTests : GivenContext
new RenderArgs<MongoContentEntity>( new RenderArgs<MongoContentEntity>(
BsonSerializer.SerializerRegistry.GetSerializer<MongoContentEntity>(), BsonSerializer.SerializerRegistry.GetSerializer<MongoContentEntity>(),
BsonSerializer.SerializerRegistry)) BsonSerializer.SerializerRegistry))
.ToString(); .ToJson(new JsonWriterSettings { OutputMode = JsonOutputMode.Shell });
Assert.Equal(Cleanup(expected, arg), rendered); Assert.Equal(Cleanup(expected, arg), rendered);
} }
@ -246,7 +248,7 @@ public class ContentQueryTests : GivenContext
new RenderArgs<MongoContentEntity>( new RenderArgs<MongoContentEntity>(
BsonSerializer.SerializerRegistry.GetSerializer<MongoContentEntity>(), BsonSerializer.SerializerRegistry.GetSerializer<MongoContentEntity>(),
BsonSerializer.SerializerRegistry)) BsonSerializer.SerializerRegistry))
.ToString(); .ToJson(new JsonWriterSettings { OutputMode = JsonOutputMode.Shell });
}); });
cursor.QuerySort(new ClrQuery { Sort = sort.ToList() }.AdjustToContentModel(AppId.Id)); cursor.QuerySort(new ClrQuery { Sort = sort.ToList() }.AdjustToContentModel(AppId.Id));

10
backend/tests/Squidex.Data.Tests/MongoDb/Infrastructure/DomainIdSerializerTests.cs

@ -26,6 +26,12 @@ public class DomainIdSerializerTests
public T Id { get; set; } public T Id { get; set; }
} }
private sealed class GuidEntity
{
[BsonGuidRepresentation(GuidRepresentation.Standard)]
public Guid Id { get; set; }
}
private sealed class IdEntity<T> private sealed class IdEntity<T>
{ {
public T Id { get; set; } public T Id { get; set; }
@ -54,9 +60,9 @@ public class DomainIdSerializerTests
[Fact] [Fact]
public void Should_deserialize_from_guid_bytes() public void Should_deserialize_from_guid_bytes()
{ {
var source = new IdEntity<Guid> { Id = Guid.NewGuid() }; var source = new GuidEntity { Id = Guid.NewGuid() };
var actual = MongoTestUtils.SerializeAndDeserializeBson<IdEntity<DomainId>, IdEntity<Guid>>(source); var actual = MongoTestUtils.SerializeAndDeserializeBson<IdEntity<DomainId>, GuidEntity>(source);
Assert.Equal(actual.Id.ToString(), source.Id.ToString()); Assert.Equal(actual.Id.ToString(), source.Id.ToString());
} }

13
backend/tests/Squidex.Data.Tests/MongoDb/Infrastructure/NamedIdTests.cs

@ -12,20 +12,15 @@ namespace Squidex.MongoDb.Infrastructure;
public class NamedIdTests public class NamedIdTests
{ {
[Fact] static NamedIdTests()
public void Should_serialize_and_deserialize_null_guid_token()
{ {
NamedId<Guid>? value = null; MongoTestUtils.SetupBson();
var serialized = value.SerializeAndDeserializeBson();
Assert.Equal(value, serialized);
} }
[Fact] [Fact]
public void Should_serialize_and_deserialize_valid_guid_token() public void Should_serialize_and_deserialize_null_guid_token()
{ {
var value = NamedId.Of(Guid.NewGuid(), "my-name"); NamedId<Guid>? value = null;
var serialized = value.SerializeAndDeserializeBson(); var serialized = value.SerializeAndDeserializeBson();

4
backend/tests/Squidex.Data.Tests/MongoDb/Infrastructure/Queries/MongoQueryTests.cs

@ -5,6 +5,8 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Driver; using MongoDB.Driver;
using NodaTime; using NodaTime;
@ -343,7 +345,7 @@ public class MongoQueryTests
new RenderArgs<TestEntity>( new RenderArgs<TestEntity>(
BsonSerializer.SerializerRegistry.GetSerializer<TestEntity>(), BsonSerializer.SerializerRegistry.GetSerializer<TestEntity>(),
BsonSerializer.SerializerRegistry)) BsonSerializer.SerializerRegistry))
.ToString(); .ToJson(new JsonWriterSettings { OutputMode = JsonOutputMode.Shell });
Assert.Equal(Cleanup(expected, arg), rendered); Assert.Equal(Cleanup(expected, arg), rendered);
} }

2
backend/tests/Squidex.Data.Tests/MongoDb/TestHelpers/MongoTestUtils.cs

@ -5,9 +5,11 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using MongoDB.Bson;
using MongoDB.Bson.IO; using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson.Serialization.Serializers;
using Squidex.Domain.Apps.Core.TestHelpers; using Squidex.Domain.Apps.Core.TestHelpers;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Json.Objects; using Squidex.Infrastructure.Json.Objects;

26
backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs

@ -725,30 +725,4 @@ public class JintScriptEngineTests : IClassFixture<TranslationsFixture>
Assert.Equal(42.0, result.Value); Assert.Equal(42.0, result.Value);
} }
[Fact]
public async Task Should_run_with_blocking_timeout_promises()
{
const string script = @"
function promiseMethod() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 1000)
});
}
// Jint 4.1.0 blocking (if you remove 'async', the timeout will not occur.)
async function asyncMethod() {
return promiseMethod();
}
(async () => {
await asyncMethod();
complete()
})()
";
await Assert.ThrowsAsync<ValidationException>(() => sut.ExecuteAsync(new ScriptVars(), script));
}
} }

19
backend/tests/Squidex.Domain.Users.Tests/DefaultUserServiceTests.cs

@ -9,6 +9,7 @@ using System.Globalization;
using System.Security.Claims; using System.Security.Claims;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Shared; using Squidex.Shared;
using Squidex.Shared.Identity; using Squidex.Shared.Identity;
@ -18,13 +19,29 @@ namespace Squidex.Domain.Users;
public class DefaultUserServiceTests public class DefaultUserServiceTests
{ {
private readonly UserManager<IdentityUser> userManager = A.Fake<UserManager<IdentityUser>>(); private readonly UserManager<IdentityUser> userManager;
private readonly IServiceProvider serviceProvider = A.Fake<IServiceProvider>();
private readonly IUserFactory userFactory = A.Fake<IUserFactory>(); private readonly IUserFactory userFactory = A.Fake<IUserFactory>();
private readonly IUserEvents userEvents = A.Fake<IUserEvents>(); private readonly IUserEvents userEvents = A.Fake<IUserEvents>();
private readonly DefaultUserService sut; private readonly DefaultUserService sut;
public DefaultUserServiceTests() public DefaultUserServiceTests()
{ {
A.CallTo(() => serviceProvider.GetService(A<Type>._))
.Returns(null);
userManager = A.Fake<UserManager<IdentityUser>>(x =>
x.WithArgumentsForConstructor(() => new UserManager<IdentityUser>(
A.Fake<IUserStore<IdentityUser>>(),
Options.Create(new IdentityOptions()),
A.Fake<IPasswordHasher<IdentityUser>>(),
Enumerable.Empty<IUserValidator<IdentityUser>>(),
Enumerable.Empty<IPasswordValidator<IdentityUser>>(),
A.Fake<ILookupNormalizer>(),
new IdentityErrorDescriber(),
serviceProvider,
A.Fake<ILogger<UserManager<IdentityUser>>>())));
A.CallTo(() => userFactory.IsId(A<string>._)) A.CallTo(() => userFactory.IsId(A<string>._))
.Returns(true); .Returns(true);

Loading…
Cancel
Save