Browse Source

Fix tests.

pull/1301/head
Sebastian Stehle 6 months ago
parent
commit
06016d46de
  1. 75
      backend/src/Squidex.Data.MongoDb/Domain/Users/MongoUserStore.cs
  2. 2
      backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj
  3. 4
      backend/src/Squidex.Web/Pipeline/UsagePipeWriter.cs
  4. 1
      backend/src/Squidex/Config/Web/WebServices.cs
  5. 2
      tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj

75
backend/src/Squidex.Data.MongoDb/Domain/Users/MongoUserStore.cs

@ -35,6 +35,7 @@ public sealed class MongoUserStore(IMongoDatabase database) :
private const string InternalLoginProvider = "[AspNetUserStore]"; private const string InternalLoginProvider = "[AspNetUserStore]";
private const string AuthenticatorKeyTokenName = "AuthenticatorKey"; private const string AuthenticatorKeyTokenName = "AuthenticatorKey";
private const string RecoveryCodeTokenName = "RecoveryCodes"; private const string RecoveryCodeTokenName = "RecoveryCodes";
private IMongoCollection<IdentityUser> queryableCollection;
static MongoUserStore() static MongoUserStore()
{ {
@ -51,11 +52,11 @@ public sealed class MongoUserStore(IMongoDatabase database) :
parameters[1].Name == "value" && parameters[1].Name == "value" &&
parameters[1].ParameterType == typeof(string); parameters[1].ParameterType == typeof(string);
})) }))
.SetArguments(new[] .SetArguments(
{ [
nameof(Claim.Type), nameof(Claim.Type),
nameof(Claim.Value), nameof(Claim.Value),
}); ]);
cm.MapMember(x => x.Type); cm.MapMember(x => x.Type);
cm.MapMember(x => x.Value); cm.MapMember(x => x.Value);
@ -70,12 +71,12 @@ public sealed class MongoUserStore(IMongoDatabase database) :
return parameters.Length == 3; return parameters.Length == 3;
})) }))
.SetArguments(new[] .SetArguments(
{ [
nameof(UserLogin.LoginProvider), nameof(UserLogin.LoginProvider),
nameof(UserLogin.ProviderKey), nameof(UserLogin.ProviderKey),
nameof(UserLogin.ProviderDisplayName), nameof(UserLogin.ProviderDisplayName),
}); ]);
cm.AutoMap(); cm.AutoMap();
}); });
@ -121,6 +122,8 @@ public sealed class MongoUserStore(IMongoDatabase database) :
cm.MapMember(x => x.TwoFactorEnabled) cm.MapMember(x => x.TwoFactorEnabled)
.SetIgnoreIfDefault(true); .SetIgnoreIfDefault(true);
}); });
BsonSerializer.TryRegisterSerializer(new IdentityUserForwardingSerializer());
} }
protected override string CollectionName() protected override string CollectionName()
@ -165,7 +168,7 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public IQueryable<IdentityUser> Users public IQueryable<IdentityUser> Users
{ {
get => Collection.AsQueryable(); get => (queryableCollection ??= Database.GetCollection<IdentityUser>(CollectionName())).AsQueryable();
} }
public bool IsId(string id) public bool IsId(string id)
@ -181,7 +184,9 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IdentityUser?> FindByIdAsync(string userId, public async Task<IdentityUser?> FindByIdAsync(string userId,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var result = await Collection.Find(x => x.Id == userId).FirstOrDefaultAsync(cancellationToken); var result =
await Collection.Find(x => x.Id == userId)
.FirstOrDefaultAsync(cancellationToken);
return result; return result;
} }
@ -189,7 +194,9 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IdentityUser?> FindByEmailAsync(string normalizedEmail, public async Task<IdentityUser?> FindByEmailAsync(string normalizedEmail,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var result = await Collection.Find(x => x.NormalizedEmail == normalizedEmail).FirstOrDefaultAsync(cancellationToken); var result =
await Collection.Find(x => x.NormalizedEmail == normalizedEmail)
.FirstOrDefaultAsync(cancellationToken);
return result; return result;
} }
@ -197,7 +204,9 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IdentityUser?> FindByNameAsync(string normalizedUserName, public async Task<IdentityUser?> FindByNameAsync(string normalizedUserName,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var result = await Collection.Find(x => x.NormalizedEmail == normalizedUserName).FirstOrDefaultAsync(cancellationToken); var result =
await Collection.Find(x => x.NormalizedEmail == normalizedUserName)
.FirstOrDefaultAsync(cancellationToken);
return result; return result;
} }
@ -205,7 +214,9 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IdentityUser?> FindByLoginAsync(string loginProvider, string providerKey, public async Task<IdentityUser?> FindByLoginAsync(string loginProvider, string providerKey,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var result = await Collection.Find(Filter.ElemMatch(x => x.Logins, BuildFilter(loginProvider, providerKey))).FirstOrDefaultAsync(cancellationToken); var result =
await Collection.Find(Filter.ElemMatch(x => x.Logins, BuildFilter(loginProvider, providerKey)))
.FirstOrDefaultAsync(cancellationToken);
return result; return result;
} }
@ -213,7 +224,9 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IList<IdentityUser>> GetUsersForClaimAsync(Claim claim, public async Task<IList<IdentityUser>> GetUsersForClaimAsync(Claim claim,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var result = await Collection.Find(x => x.Claims.Exists(y => y.Type == claim.Type && y.Value == claim.Value)).ToListAsync(cancellationToken); var result =
await Collection.Find(x => x.Claims.Exists(y => y.Type == claim.Type && y.Value == claim.Value))
.ToListAsync(cancellationToken);
return result.OfType<IdentityUser>().ToList(); return result.OfType<IdentityUser>().ToList();
} }
@ -221,7 +234,9 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IList<IdentityUser>> GetUsersInRoleAsync(string roleName, public async Task<IList<IdentityUser>> GetUsersInRoleAsync(string roleName,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var result = await Collection.Find(x => x.Roles.Contains(roleName)).ToListAsync(cancellationToken); var result =
await Collection.Find(x => x.Roles.Contains(roleName))
.ToListAsync(cancellationToken);
return result.OfType<IdentityUser>().ToList(); return result.OfType<IdentityUser>().ToList();
} }
@ -231,7 +246,8 @@ public sealed class MongoUserStore(IMongoDatabase database) :
{ {
user.Id = ObjectId.GenerateNewId().ToString(); user.Id = ObjectId.GenerateNewId().ToString();
await Collection.InsertOneAsync((MongoUser)user, null, cancellationToken); await Collection.InsertOneAsync((MongoUser)user, null,
cancellationToken);
return IdentityResult.Success; return IdentityResult.Success;
} }
@ -239,7 +255,8 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IdentityResult> UpdateAsync(IdentityUser user, public async Task<IdentityResult> UpdateAsync(IdentityUser user,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
await Collection.ReplaceOneAsync(x => x.Id == user.Id, (MongoUser)user, cancellationToken: cancellationToken); await Collection.ReplaceOneAsync(x => x.Id == user.Id, (MongoUser)user,
cancellationToken: cancellationToken);
return IdentityResult.Success; return IdentityResult.Success;
} }
@ -247,7 +264,8 @@ public sealed class MongoUserStore(IMongoDatabase database) :
public async Task<IdentityResult> DeleteAsync(IdentityUser user, public async Task<IdentityResult> DeleteAsync(IdentityUser user,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
await Collection.DeleteOneAsync(x => x.Id == user.Id, null, cancellationToken); await Collection.DeleteOneAsync(x => x.Id == user.Id, null,
cancellationToken);
return IdentityResult.Success; return IdentityResult.Success;
} }
@ -654,4 +672,29 @@ public sealed class MongoUserStore(IMongoDatabase database) :
filter.Eq(x => x.LoginProvider, loginProvider), filter.Eq(x => x.LoginProvider, loginProvider),
filter.Eq(x => x.ProviderKey, providerKey)); filter.Eq(x => x.ProviderKey, providerKey));
} }
private sealed class IdentityUserForwardingSerializer
: SerializerBase<IdentityUser>, IBsonDocumentSerializer
{
private static readonly IBsonSerializer<MongoUser> MongoUserSerializer =
BsonSerializer.LookupSerializer<MongoUser>();
public override IdentityUser Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
args.NominalType = typeof(MongoUser);
return MongoUserSerializer.Deserialize(context, args);
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, IdentityUser value)
{
args.NominalType = typeof(MongoUser);
MongoUserSerializer.Serialize(context, args, (MongoUser)value);
}
public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
{
return ((IBsonDocumentSerializer)MongoUserSerializer)
.TryGetMemberSerializationInfo(memberName, out serializationInfo);
}
}
} }

2
backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj

@ -30,7 +30,7 @@
<PackageReference Include="Squidex.Flows.Mongo" Version="8.0.0" /> <PackageReference Include="Squidex.Flows.Mongo" Version="8.0.0" />
<PackageReference Include="Squidex.Hosting" Version="8.0.0" /> <PackageReference Include="Squidex.Hosting" Version="8.0.0" />
<PackageReference Include="Squidex.Messaging.Mongo" Version="8.0.0" /> <PackageReference Include="Squidex.Messaging.Mongo" Version="8.0.0" />
<PackageReference Include="Squidex.OpenIddict.MongoDb" Version="7.2.0" /> <PackageReference Include="Squidex.OpenIddict.MongoDb" Version="7.2.1" />
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="all" /> <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="all" />
<PackageReference Include="System.ValueTuple" Version="4.6.2" /> <PackageReference Include="System.ValueTuple" Version="4.6.2" />
<PackageReference Include="YDotNet.Server.MongoDB" Version="0.6.0" /> <PackageReference Include="YDotNet.Server.MongoDB" Version="0.6.0" />

4
backend/src/Squidex.Web/Pipeline/UsagePipeWriter.cs

@ -13,6 +13,10 @@ public sealed class UsagePipeWriter(PipeWriter inner) : PipeWriter
{ {
private long bytesWritten; private long bytesWritten;
public override bool CanGetUnflushedBytes => inner.CanGetUnflushedBytes;
public override long UnflushedBytes => inner.UnflushedBytes;
public long BytesWritten public long BytesWritten
{ {
get => bytesWritten; get => bytesWritten;

1
backend/src/Squidex/Config/Web/WebServices.cs

@ -9,6 +9,7 @@ using GraphQL;
using GraphQL.DI; using GraphQL.DI;
using GraphQL.Server.Transports.AspNetCore; using GraphQL.Server.Transports.AspNetCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.ResponseCompression; using Microsoft.AspNetCore.ResponseCompression;

2
tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj

@ -21,7 +21,7 @@
<PackageReference Include="Squidex.ClientLibrary" Version="22.2.0" /> <PackageReference Include="Squidex.ClientLibrary" Version="22.2.0" />
<PackageReference Include="Squidex.ClientLibrary.ServiceExtensions" Version="22.2.0" /> <PackageReference Include="Squidex.ClientLibrary.ServiceExtensions" Version="22.2.0" />
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="all" /> <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="all" />
<PackageReference Include="Verify" Version="31.13.5" /> <PackageReference Include="Verify" Version="31.12.5" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

Loading…
Cancel
Save