352 lines
11 KiB
C#
352 lines
11 KiB
C#
using StellaOps.Scanner.Analyzers.Lang.Bun;
|
|
using Xunit;
|
|
using StellaOps.Scanner.Analyzers.Lang.Tests.Harness;
|
|
using StellaOps.Scanner.Analyzers.Lang.Tests.TestUtilities;
|
|
|
|
namespace StellaOps.Scanner.Analyzers.Lang.Bun.Tests;
|
|
|
|
public sealed class BunLanguageAnalyzerTests
|
|
{
|
|
[Fact]
|
|
public async Task StandardInstallProducesDeterministicOutputAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "standard");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task IsolatedLinkerInstallIsParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "isolated");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task LockfileOnlyIsParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "lockfile-only");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task BinaryLockfileEmitsRemediationAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "binary-lockfile");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task WorkspacesAreParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "workspaces");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task SymlinkSafetyIsEnforcedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "symlinks");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ScopedPackagesAreParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "scoped-packages");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GitDependenciesAreParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "git-dependencies");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task CustomRegistryIsParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "custom-registry");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task PatchedPackagesAreParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "patched-packages");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task PatchedMultiVersionIsParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "patched-multi-version");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task DeepDependencyTreeIsParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "deep-tree");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task MultiWorkspaceIsParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "multi-workspace");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task JsoncLockfileIsParsedAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "jsonc-lockfile");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task ContainerLayersAreDiscoveredAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "container-layers");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task BunfigOnlyEmitsDeclaredOnlyAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "bunfig-only");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task LockfileDevClassificationIsDeterministicAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "lockfile-dev-classification");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task NonConcreteVersionsUseExplicitKeyAsync()
|
|
{
|
|
var cancellationToken = TestContext.Current.CancellationToken;
|
|
var fixturePath = TestPaths.ResolveFixture("lang", "bun", "non-concrete-versions");
|
|
var goldenPath = Path.Combine(fixturePath, "expected.json");
|
|
|
|
var analyzers = new ILanguageAnalyzer[]
|
|
{
|
|
new BunLanguageAnalyzer()
|
|
};
|
|
|
|
await LanguageAnalyzerTestHarness.AssertDeterministicAsync(
|
|
fixturePath,
|
|
goldenPath,
|
|
analyzers,
|
|
cancellationToken);
|
|
}
|
|
}
|