|
|
|
@ -62,32 +62,40 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
[Fact] |
|
|
|
public async Task Should_resolve_asset() |
|
|
|
{ |
|
|
|
var assetId1 = DomainId.NewGuid(); |
|
|
|
var asset1 = CreateAsset(assetId1, 1); |
|
|
|
var (vars, asset) = SetupAssetVars(); |
|
|
|
|
|
|
|
var user = new ClaimsPrincipal(); |
|
|
|
var script = @"
|
|
|
|
getAsset(data.assets.iv[0], function (assets) { |
|
|
|
var result1 = `Text: ${assets[0].fileName} ${assets[0].id}`; |
|
|
|
|
|
|
|
var data = |
|
|
|
new ContentData() |
|
|
|
.AddField("assets", |
|
|
|
new ContentFieldData() |
|
|
|
.AddInvariant(JsonValue.Array(assetId1))); |
|
|
|
complete(`${result1}`); |
|
|
|
});";
|
|
|
|
|
|
|
|
A.CallTo(() => assetQuery.QueryAsync( |
|
|
|
A<Context>.That.Matches(x => x.App.Id == appId.Id && x.User == user), null, A<Q>.That.HasIds(assetId1), A<CancellationToken>._)) |
|
|
|
.Returns(ResultList.CreateFrom(1, asset1)); |
|
|
|
var expected = $@"
|
|
|
|
Text: {asset.FileName} {asset.Id} |
|
|
|
";
|
|
|
|
|
|
|
|
var vars = new ScriptVars { Data = data, AppId = appId.Id, User = user }; |
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
|
|
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_resolve_assets() |
|
|
|
{ |
|
|
|
var (vars, assets) = SetupAssetsVars(); |
|
|
|
|
|
|
|
var script = @"
|
|
|
|
getAsset(data.assets.iv[0], function (assets) { |
|
|
|
var result1 = `Text: ${assets[0].fileName}`; |
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
var result1 = `Text: ${assets[0].fileName} ${assets[0].id}`; |
|
|
|
var result2 = `Text: ${assets[1].fileName} ${assets[1].id}`; |
|
|
|
|
|
|
|
complete(`${result1}`); |
|
|
|
complete(`${result1}\n${result2}`); |
|
|
|
});";
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
|
Text: file1.jpg |
|
|
|
var expected = $@"
|
|
|
|
Text: {assets[0].FileName} {assets[0].Id} |
|
|
|
Text: {assets[1].FileName} {assets[1].Id} |
|
|
|
";
|
|
|
|
|
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
@ -96,38 +104,48 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_resolve_assets() |
|
|
|
public async Task Should_resolve_asset_text() |
|
|
|
{ |
|
|
|
var assetId1 = DomainId.NewGuid(); |
|
|
|
var asset1 = CreateAsset(assetId1, 1); |
|
|
|
var assetId2 = DomainId.NewGuid(); |
|
|
|
var asset2 = CreateAsset(assetId1, 2); |
|
|
|
var (vars, asset) = SetupAssetVars(); |
|
|
|
|
|
|
|
var user = new ClaimsPrincipal(); |
|
|
|
SetupText(asset.Id, Encoding.UTF8.GetBytes("Hello Asset")); |
|
|
|
|
|
|
|
var data = |
|
|
|
new ContentData() |
|
|
|
.AddField("assets", |
|
|
|
new ContentFieldData() |
|
|
|
.AddInvariant(JsonValue.Array(assetId1, assetId2))); |
|
|
|
var script = @"
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
getAssetText(assets[0], function (text) { |
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
A.CallTo(() => assetQuery.QueryAsync( |
|
|
|
A<Context>.That.Matches(x => x.App.Id == appId.Id && x.User == user), null, A<Q>.That.HasIds(assetId1, assetId2), A<CancellationToken>._)) |
|
|
|
.Returns(ResultList.CreateFrom(2, asset1, asset2)); |
|
|
|
complete(result); |
|
|
|
}); |
|
|
|
});";
|
|
|
|
|
|
|
|
var vars = new ScriptVars { Data = data, AppId = appId.Id, User = user }; |
|
|
|
var expected = @"
|
|
|
|
Text: Hello Asset |
|
|
|
";
|
|
|
|
|
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
|
|
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_resolve_asset_text_with_utf8() |
|
|
|
{ |
|
|
|
var (vars, asset) = SetupAssetVars(); |
|
|
|
|
|
|
|
SetupText(asset.Id, Encoding.UTF8.GetBytes("Hello Asset")); |
|
|
|
|
|
|
|
var script = @"
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
var result1 = `Text: ${assets[0].fileName}`; |
|
|
|
var result2 = `Text: ${assets[1].fileName}`; |
|
|
|
getAssetText(assets[0], function (text) { |
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
complete(`${result1}\n${result2}`); |
|
|
|
complete(result); |
|
|
|
}, 'utf8'); |
|
|
|
});";
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
|
Text: file1.jpg |
|
|
|
Text: file2.jpg |
|
|
|
Text: Hello Asset |
|
|
|
";
|
|
|
|
|
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
@ -136,32 +154,36 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_resolve_asset_text() |
|
|
|
public async Task Should_resolve_asset_text_with_unicode() |
|
|
|
{ |
|
|
|
var assetId = DomainId.NewGuid(); |
|
|
|
var asset = CreateAsset(assetId, 1); |
|
|
|
var (vars, asset) = SetupAssetVars(); |
|
|
|
|
|
|
|
var user = new ClaimsPrincipal(); |
|
|
|
SetupText(asset.Id, Encoding.Unicode.GetBytes("Hello Asset")); |
|
|
|
|
|
|
|
var data = |
|
|
|
new ContentData() |
|
|
|
.AddField("assets", |
|
|
|
new ContentFieldData() |
|
|
|
.AddInvariant(JsonValue.Array(assetId))); |
|
|
|
var script = @"
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
getAssetText(assets[0], function (text) { |
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
A.CallTo(() => assetQuery.QueryAsync( |
|
|
|
A<Context>.That.Matches(x => x.App.Id == appId.Id && x.User == user), null, A<Q>.That.HasIds(assetId), A<CancellationToken>._)) |
|
|
|
.Returns(ResultList.CreateFrom(2, asset)); |
|
|
|
complete(result); |
|
|
|
}, 'unicode'); |
|
|
|
});";
|
|
|
|
|
|
|
|
A.CallTo(() => assetFileStore.DownloadAsync(appId.Id, assetId, asset.FileVersion, A<Stream>._, A<BytesRange>._, A<CancellationToken>._)) |
|
|
|
.Invokes(x => |
|
|
|
{ |
|
|
|
var stream = x.GetArgument<Stream>(3)!; |
|
|
|
var expected = @"
|
|
|
|
Text: Hello Asset |
|
|
|
";
|
|
|
|
|
|
|
|
stream.Write(Encoding.UTF8.GetBytes("Hello Asset")); |
|
|
|
}); |
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
|
|
|
|
var vars = new ScriptVars { Data = data, AppId = appId.Id, User = user }; |
|
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_resolve_asset_text_with_ascii() |
|
|
|
{ |
|
|
|
var (vars, asset) = SetupAssetVars(); |
|
|
|
|
|
|
|
SetupText(asset.Id, Encoding.ASCII.GetBytes("Hello Asset")); |
|
|
|
|
|
|
|
var script = @"
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
@ -169,7 +191,7 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
complete(result); |
|
|
|
}); |
|
|
|
}, 'ascii'); |
|
|
|
});";
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
|
@ -182,24 +204,34 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_not_resolve_asset_text_if_too_big() |
|
|
|
public async Task Should_resolve_asset_text_with_base64() |
|
|
|
{ |
|
|
|
var assetId = DomainId.NewGuid(); |
|
|
|
var asset = CreateAsset(assetId, 1, 1_000_000); |
|
|
|
var (vars, asset) = SetupAssetVars(); |
|
|
|
|
|
|
|
var user = new ClaimsPrincipal(); |
|
|
|
SetupText(asset.Id, Encoding.UTF8.GetBytes("Hello Asset")); |
|
|
|
|
|
|
|
var data = |
|
|
|
new ContentData() |
|
|
|
.AddField("assets", |
|
|
|
new ContentFieldData() |
|
|
|
.AddInvariant(JsonValue.Array(assetId))); |
|
|
|
var script = @"
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
getAssetText(assets[0], function (text) { |
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
A.CallTo(() => assetQuery.QueryAsync( |
|
|
|
A<Context>.That.Matches(x => x.App.Id == appId.Id && x.User == user), null, A<Q>.That.HasIds(assetId), A<CancellationToken>._)) |
|
|
|
.Returns(ResultList.CreateFrom(2, asset)); |
|
|
|
complete(result); |
|
|
|
}, 'base64'); |
|
|
|
});";
|
|
|
|
|
|
|
|
var vars = new ScriptVars { Data = data, AppId = appId.Id, User = user }; |
|
|
|
var expected = @"
|
|
|
|
Text: SGVsbG8gQXNzZXQ= |
|
|
|
";
|
|
|
|
|
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
|
|
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_not_resolve_asset_text_if_too_big() |
|
|
|
{ |
|
|
|
var (vars, _) = SetupAssetVars(1_000_000); |
|
|
|
|
|
|
|
var script = @"
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
@ -233,13 +265,7 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
AppId = appId |
|
|
|
}; |
|
|
|
|
|
|
|
A.CallTo(() => assetFileStore.DownloadAsync(appId.Id, @event.Id, @event.FileVersion, A<Stream>._, A<BytesRange>._, A<CancellationToken>._)) |
|
|
|
.Invokes(x => |
|
|
|
{ |
|
|
|
var stream = x.GetArgument<Stream>(3)!; |
|
|
|
|
|
|
|
stream.Write(Encoding.UTF8.GetBytes("Hello Asset")); |
|
|
|
}); |
|
|
|
SetupText(@event.Id, Encoding.UTF8.GetBytes("Hello Asset")); |
|
|
|
|
|
|
|
var vars = new ScriptVars |
|
|
|
{ |
|
|
|
@ -263,7 +289,7 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public async Task Should_resolve_asset_text_from_event_if_too_big() |
|
|
|
public async Task Should_not_resolve_asset_text_from_event_if_too_big() |
|
|
|
{ |
|
|
|
var @event = new EnrichedAssetEvent |
|
|
|
{ |
|
|
|
@ -297,6 +323,63 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
|
.MustNotHaveHappened(); |
|
|
|
} |
|
|
|
|
|
|
|
private void SetupText(DomainId id, byte[] bytes) |
|
|
|
{ |
|
|
|
A.CallTo(() => assetFileStore.DownloadAsync(appId.Id, id, 0, A<Stream>._, A<BytesRange>._, A<CancellationToken>._)) |
|
|
|
.Invokes(x => |
|
|
|
{ |
|
|
|
var stream = x.GetArgument<Stream>(3)!; |
|
|
|
|
|
|
|
stream.Write(bytes); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private (ScriptVars, IAssetEntity) SetupAssetVars(int fileSize = 100) |
|
|
|
{ |
|
|
|
var assetId = DomainId.NewGuid(); |
|
|
|
var asset = CreateAsset(assetId, 1, fileSize); |
|
|
|
|
|
|
|
var user = new ClaimsPrincipal(); |
|
|
|
|
|
|
|
var data = |
|
|
|
new ContentData() |
|
|
|
.AddField("assets", |
|
|
|
new ContentFieldData() |
|
|
|
.AddInvariant(JsonValue.Array(assetId))); |
|
|
|
|
|
|
|
A.CallTo(() => assetQuery.QueryAsync( |
|
|
|
A<Context>.That.Matches(x => x.App.Id == appId.Id && x.User == user), null, A<Q>.That.HasIds(assetId), A<CancellationToken>._)) |
|
|
|
.Returns(ResultList.CreateFrom(2, asset)); |
|
|
|
|
|
|
|
var vars = new ScriptVars { Data = data, AppId = appId.Id, User = user }; |
|
|
|
|
|
|
|
return (vars, asset); |
|
|
|
} |
|
|
|
|
|
|
|
private (ScriptVars, IAssetEntity[]) SetupAssetsVars(int fileSize = 100) |
|
|
|
{ |
|
|
|
var assetId1 = DomainId.NewGuid(); |
|
|
|
var asset1 = CreateAsset(assetId1, 1, fileSize); |
|
|
|
var assetId2 = DomainId.NewGuid(); |
|
|
|
var asset2 = CreateAsset(assetId1, 2, fileSize); |
|
|
|
|
|
|
|
var user = new ClaimsPrincipal(); |
|
|
|
|
|
|
|
var data = |
|
|
|
new ContentData() |
|
|
|
.AddField("assets", |
|
|
|
new ContentFieldData() |
|
|
|
.AddInvariant(JsonValue.Array(assetId1, assetId2))); |
|
|
|
|
|
|
|
A.CallTo(() => assetQuery.QueryAsync( |
|
|
|
A<Context>.That.Matches(x => x.App.Id == appId.Id && x.User == user), null, A<Q>.That.HasIds(assetId1, assetId2), A<CancellationToken>._)) |
|
|
|
.Returns(ResultList.CreateFrom(2, asset1, asset2)); |
|
|
|
|
|
|
|
var vars = new ScriptVars { Data = data, AppId = appId.Id, User = user }; |
|
|
|
|
|
|
|
return (vars, new[] { asset1, asset2 }); |
|
|
|
} |
|
|
|
|
|
|
|
private IEnrichedAssetEntity CreateAsset(DomainId assetId, int index, int fileSize = 100) |
|
|
|
{ |
|
|
|
return new AssetEntity |
|
|
|
|