|
|
@ -6,14 +6,18 @@ |
|
|
// ==========================================================================
|
|
|
// ==========================================================================
|
|
|
|
|
|
|
|
|
using System; |
|
|
using System; |
|
|
|
|
|
using System.IO; |
|
|
using System.Security.Claims; |
|
|
using System.Security.Claims; |
|
|
|
|
|
using System.Text; |
|
|
using System.Threading; |
|
|
using System.Threading; |
|
|
using System.Threading.Tasks; |
|
|
using System.Threading.Tasks; |
|
|
using FakeItEasy; |
|
|
using FakeItEasy; |
|
|
using Microsoft.Extensions.Caching.Memory; |
|
|
using Microsoft.Extensions.Caching.Memory; |
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
using Microsoft.Extensions.Options; |
|
|
using Microsoft.Extensions.Options; |
|
|
|
|
|
using Squidex.Assets; |
|
|
using Squidex.Domain.Apps.Core.Contents; |
|
|
using Squidex.Domain.Apps.Core.Contents; |
|
|
|
|
|
using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; |
|
|
using Squidex.Domain.Apps.Core.Scripting; |
|
|
using Squidex.Domain.Apps.Core.Scripting; |
|
|
using Squidex.Domain.Apps.Core.TestHelpers; |
|
|
using Squidex.Domain.Apps.Core.TestHelpers; |
|
|
using Squidex.Domain.Apps.Entities.TestHelpers; |
|
|
using Squidex.Domain.Apps.Entities.TestHelpers; |
|
|
@ -26,6 +30,7 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
public class AssetsJintExtensionTests : IClassFixture<TranslationsFixture> |
|
|
public class AssetsJintExtensionTests : IClassFixture<TranslationsFixture> |
|
|
{ |
|
|
{ |
|
|
private readonly IAssetQueryService assetQuery = A.Fake<IAssetQueryService>(); |
|
|
private readonly IAssetQueryService assetQuery = A.Fake<IAssetQueryService>(); |
|
|
|
|
|
private readonly IAssetFileStore assetFileStore = A.Fake<IAssetFileStore>(); |
|
|
private readonly IAppProvider appProvider = A.Fake<IAppProvider>(); |
|
|
private readonly IAppProvider appProvider = A.Fake<IAppProvider>(); |
|
|
private readonly NamedId<DomainId> appId = NamedId.Of(DomainId.NewGuid(), "my-app"); |
|
|
private readonly NamedId<DomainId> appId = NamedId.Of(DomainId.NewGuid(), "my-app"); |
|
|
private readonly JintScriptEngine sut; |
|
|
private readonly JintScriptEngine sut; |
|
|
@ -36,6 +41,7 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
new ServiceCollection() |
|
|
new ServiceCollection() |
|
|
.AddSingleton(appProvider) |
|
|
.AddSingleton(appProvider) |
|
|
.AddSingleton(assetQuery) |
|
|
.AddSingleton(assetQuery) |
|
|
|
|
|
.AddSingleton(assetFileStore) |
|
|
.BuildServiceProvider(); |
|
|
.BuildServiceProvider(); |
|
|
|
|
|
|
|
|
var extensions = new IJintExtension[] |
|
|
var extensions = new IJintExtension[] |
|
|
@ -78,7 +84,7 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
var result1 = `Text: ${assets[0].fileName}`; |
|
|
var result1 = `Text: ${assets[0].fileName}`; |
|
|
|
|
|
|
|
|
complete(`${result1}`); |
|
|
complete(`${result1}`); |
|
|
})";
|
|
|
});";
|
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
var expected = @"
|
|
|
Text: file1.jpg |
|
|
Text: file1.jpg |
|
|
@ -117,7 +123,7 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
var result2 = `Text: ${assets[1].fileName}`; |
|
|
var result2 = `Text: ${assets[1].fileName}`; |
|
|
|
|
|
|
|
|
complete(`${result1}\n${result2}`); |
|
|
complete(`${result1}\n${result2}`); |
|
|
})";
|
|
|
});";
|
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
var expected = @"
|
|
|
Text: file1.jpg |
|
|
Text: file1.jpg |
|
|
@ -129,9 +135,177 @@ namespace Squidex.Domain.Apps.Entities.Assets |
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static IEnrichedAssetEntity CreateAsset(DomainId assetId, int index) |
|
|
[Fact] |
|
|
|
|
|
public async Task Should_resolve_asset_text() |
|
|
|
|
|
{ |
|
|
|
|
|
var assetId = DomainId.NewGuid(); |
|
|
|
|
|
var asset = CreateAsset(assetId, 1); |
|
|
|
|
|
|
|
|
|
|
|
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)); |
|
|
|
|
|
|
|
|
|
|
|
A.CallTo(() => assetFileStore.DownloadAsync(appId.Id, assetId, asset.FileVersion, A<Stream>._, A<BytesRange>._, A<CancellationToken>._)) |
|
|
|
|
|
.Invokes(x => |
|
|
|
|
|
{ |
|
|
|
|
|
var stream = x.GetArgument<Stream>(3)!; |
|
|
|
|
|
|
|
|
|
|
|
stream.Write(Encoding.UTF8.GetBytes("Hello Asset")); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
var vars = new ScriptVars { Data = data, AppId = appId.Id, User = user }; |
|
|
|
|
|
|
|
|
|
|
|
var script = @"
|
|
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
|
|
getAssetText(assets[0], function (text) { |
|
|
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
|
|
|
|
complete(result); |
|
|
|
|
|
}); |
|
|
|
|
|
});";
|
|
|
|
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
|
|
|
Text: Hello Asset |
|
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
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 assetId = DomainId.NewGuid(); |
|
|
|
|
|
var asset = CreateAsset(assetId, 1, 1_000_000); |
|
|
|
|
|
|
|
|
|
|
|
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 }; |
|
|
|
|
|
|
|
|
|
|
|
var script = @"
|
|
|
|
|
|
getAssets(data.assets.iv, function (assets) { |
|
|
|
|
|
getAssetText(assets[0], function (text) { |
|
|
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
|
|
|
|
complete(result); |
|
|
|
|
|
}); |
|
|
|
|
|
});";
|
|
|
|
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
|
|
|
Text: ErrorTooBig |
|
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
|
|
|
|
|
|
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
|
|
|
|
|
|
|
|
|
A.CallTo(() => assetFileStore.DownloadAsync(A<DomainId>._, A<DomainId>._, A<long>._, A<Stream>._, A<BytesRange>._, A<CancellationToken>._)) |
|
|
|
|
|
.MustNotHaveHappened(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Fact] |
|
|
|
|
|
public async Task Should_resolve_asset_text_from_event() |
|
|
{ |
|
|
{ |
|
|
return new AssetEntity { FileName = $"file{index}.jpg", Id = assetId }; |
|
|
var @event = new EnrichedAssetEvent |
|
|
|
|
|
{ |
|
|
|
|
|
Id = DomainId.NewGuid(), |
|
|
|
|
|
FileVersion = 0, |
|
|
|
|
|
FileSize = 100, |
|
|
|
|
|
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")); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
var vars = new ScriptVars |
|
|
|
|
|
{ |
|
|
|
|
|
["event"] = @event |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var script = @"
|
|
|
|
|
|
getAssetText(event, function (text) { |
|
|
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
|
|
|
|
complete(result); |
|
|
|
|
|
});";
|
|
|
|
|
|
|
|
|
|
|
|
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_from_event_if_too_big() |
|
|
|
|
|
{ |
|
|
|
|
|
var @event = new EnrichedAssetEvent |
|
|
|
|
|
{ |
|
|
|
|
|
Id = DomainId.NewGuid(), |
|
|
|
|
|
FileVersion = 0, |
|
|
|
|
|
FileSize = 1_000_000, |
|
|
|
|
|
AppId = appId |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var vars = new ScriptVars |
|
|
|
|
|
{ |
|
|
|
|
|
["event"] = @event |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var script = @"
|
|
|
|
|
|
getAssetText(event, function (text) { |
|
|
|
|
|
var result = `Text: ${text}`; |
|
|
|
|
|
|
|
|
|
|
|
complete(result); |
|
|
|
|
|
});";
|
|
|
|
|
|
|
|
|
|
|
|
var expected = @"
|
|
|
|
|
|
Text: ErrorTooBig |
|
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
var result = (await sut.ExecuteAsync(vars, script)).ToString(); |
|
|
|
|
|
|
|
|
|
|
|
Assert.Equal(Cleanup(expected), Cleanup(result)); |
|
|
|
|
|
|
|
|
|
|
|
A.CallTo(() => assetFileStore.DownloadAsync(A<DomainId>._, A<DomainId>._, A<long>._, A<Stream>._, A<BytesRange>._, A<CancellationToken>._)) |
|
|
|
|
|
.MustNotHaveHappened(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private IEnrichedAssetEntity CreateAsset(DomainId assetId, int index, int fileSize = 100) |
|
|
|
|
|
{ |
|
|
|
|
|
return new AssetEntity |
|
|
|
|
|
{ |
|
|
|
|
|
AppId = appId, |
|
|
|
|
|
Id = assetId, |
|
|
|
|
|
FileSize = fileSize, |
|
|
|
|
|
FileName = $"file{index}.jpg", |
|
|
|
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static string Cleanup(string text) |
|
|
private static string Cleanup(string text) |
|
|
|