Headless CMS and Content Managment Hub
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

132 lines
4.0 KiB

// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using FakeItEasy;
using Squidex.Domain.Apps.Core.TestHelpers;
using Squidex.Infrastructure;
using Squidex.Shared.Users;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Backup
{
public class UserMappingTests
{
private readonly RefToken initiator = Subject("me");
private readonly UserMapping sut;
public UserMappingTests()
{
sut = new UserMapping(initiator);
}
[Fact]
public async Task Should_backup_users_but_no_clients()
{
sut.Backup("1");
sut.Backup(Subject("2"));
sut.Backup(Client("client"));
var user1 = UserMocks.User("1", "1@email.com");
var user2 = UserMocks.User("2", "1@email.com");
var users = new Dictionary<string, IUser>
{
[user1.Id] = user1,
[user2.Id] = user2
};
var userResolver = A.Fake<IUserResolver>();
A.CallTo(() => userResolver.QueryManyAsync(A<string[]>.That.Is(user1.Id, user2.Id)))
.Returns(users);
var writer = A.Fake<IBackupWriter>();
Dictionary<string, string>? storedUsers = null;
A.CallTo(() => writer.WriteJsonAsync(A<string>._, A<object>._))
.Invokes((string _, object json) => storedUsers = (Dictionary<string, string>)json);
await sut.StoreAsync(writer, userResolver);
Assert.Equal(new Dictionary<string, string>
{
[user1.Id] = user1.Email,
[user2.Id] = user2.Email
}, storedUsers);
}
[Fact]
public async Task Should_restore_users()
{
var user1 = UserMocks.User("1", "1@email.com");
var user2 = UserMocks.User("2", "2@email.com");
var reader = SetupReader(user1, user2);
var userResolver = A.Fake<IUserResolver>();
A.CallTo(() => userResolver.CreateUserIfNotExistsAsync(user1.Email, false))
.Returns((user1, false));
A.CallTo(() => userResolver.CreateUserIfNotExistsAsync(user2.Email, false))
.Returns((user2, true));
await sut.RestoreAsync(reader, userResolver);
Assert.True(sut.TryMap("1_old", out var mapped1));
Assert.True(sut.TryMap(Subject("2_old"), out var mapped2));
Assert.Equal(Subject("1"), mapped1);
Assert.Equal(Subject("2"), mapped2);
}
[Fact]
public void Should_return_initiator_if_user_not_found()
{
var user = Subject("user1");
Assert.False(sut.TryMap(user, out var mapped));
Assert.Same(initiator, mapped);
}
[Fact]
public void Should_create_same_token_if_mapping_client()
{
var client = Client("client1");
Assert.True(sut.TryMap(client, out var mapped));
Assert.Same(client, mapped);
}
private static IBackupReader SetupReader(params IUser[] users)
{
var storedUsers = users.ToDictionary(x => $"{x.Id}_old", x => x.Email);
var reader = A.Fake<IBackupReader>();
A.CallTo(() => reader.ReadJsonAsync<Dictionary<string, string>>(A<string>._))
.Returns(storedUsers);
return reader;
}
private static RefToken Client(string identifier)
{
return RefToken.Client(identifier);
}
private static RefToken Subject(string identifier)
{
return RefToken.User(identifier);
}
}
}