主要完成: 补齐招生学校计划、投档审核、报到、扫码、补录等原生接口。 新增 SQLite/MySQL 空库初始化及默认审批流、号码规则。 删除 Node 兼容代理,未知 API 直接返回原生 404。 Docker、Compose、Gitea CI 全部切换到 Eis.Web.dll。 CKEditor 已固化到 Web 发布资源,不再依赖 node_modules。 新增纯 .NET 冒烟脚本:[smoke-dotnet-native.ps1 (line 1)](C:/Users/BI/Documents/EIS-dotnet/scripts/smoke-dotnet-native.ps1:1)。 迁移状态已更新:[MIGRATION.md (line 14)](C:/Users/BI/Documents/EIS-dotnet/MIGRATION.md:14)。 容器入口见 [Dockerfile (line 31)](C:/Users/BI/Documents/EIS-dotnet/Dockerfile:31)。
409 lines
18 KiB
C#
409 lines
18 KiB
C#
using Eis.Infrastructure.Administration;
|
|
|
|
namespace Eis.Infrastructure.Tests.Administration;
|
|
|
|
public sealed class AdminMigrationOptionsTests
|
|
{
|
|
[Fact]
|
|
public void DisabledByDefault()
|
|
{
|
|
WithEnvironment(null, null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: false,
|
|
sharesLegacySessions: false);
|
|
|
|
Assert.False(options.NativeReadsEnabled);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void RequiresNativeAuthentication()
|
|
{
|
|
WithEnvironment("true", null, "true", () =>
|
|
{
|
|
var exception = Assert.Throws<InvalidOperationException>(() =>
|
|
AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: false,
|
|
sharesLegacySessions: false));
|
|
|
|
Assert.Contains("AUTH_NATIVE_ENABLED=true", exception.Message);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void AllowsStandaloneMemorySessionsAfterLegacyBackendRemoval()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: false);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void AllowsSharedRedisSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void OrganizationWritesRequireNativeReads()
|
|
{
|
|
WithEnvironment("false", "true", null, () =>
|
|
{
|
|
var exception = Assert.Throws<InvalidOperationException>(() =>
|
|
AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true));
|
|
|
|
Assert.Contains("ADMIN_NATIVE_READS_ENABLED=true", exception.Message);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesOrganizationWritesWithReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", "true", null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeOrganizationWritesEnabled);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesAccountBatchesWithReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeAccountBatchesEnabled);
|
|
}, accountBatchesEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesAdminConfigurationWithReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeConfigurationEnabled);
|
|
}, configurationEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesNoticeManagementWithReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeNoticeManagementEnabled);
|
|
}, noticeManagementEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void AcceptsLegacyNoticeWritesEnvironmentVariable()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeNoticeManagementEnabled);
|
|
}, legacyNoticeWritesEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesCentersWithReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeCentersEnabled);
|
|
}, centersEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesOperationalReadsWithBaseReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeOperationalReadsEnabled);
|
|
}, operationalReadsEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void CandidateManagementRequiresOperationalReads()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var exception = Assert.Throws<InvalidOperationException>(() =>
|
|
AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true));
|
|
|
|
Assert.Contains("ADMIN_NATIVE_OPERATIONAL_READS_ENABLED=true", exception.Message);
|
|
}, candidateManagementEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesCandidateManagementWithOperationalReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeOperationalReadsEnabled);
|
|
Assert.True(options.NativeCandidateManagementEnabled);
|
|
}, operationalReadsEnabled: "true", candidateManagementEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void RegistrationPaymentWritesRequireOperationalReads()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var exception = Assert.Throws<InvalidOperationException>(() =>
|
|
AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true));
|
|
|
|
Assert.Contains("ADMIN_NATIVE_OPERATIONAL_READS_ENABLED=true", exception.Message);
|
|
}, registrationPaymentWritesEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesRegistrationPaymentWritesWithOperationalReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeOperationalReadsEnabled);
|
|
Assert.True(options.NativeRegistrationPaymentWritesEnabled);
|
|
}, operationalReadsEnabled: "true", registrationPaymentWritesEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesWorkflowOperationsWithBaseReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeWorkflowOperationsEnabled);
|
|
}, workflowOperationsEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesExamManagementWithBaseReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeExamManagementEnabled);
|
|
}, examManagementEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesArrangementsWithBaseReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeReadsEnabled);
|
|
Assert.True(options.NativeArrangementsEnabled);
|
|
}, arrangementsEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void ResultsRequireOperationalReads()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var exception = Assert.Throws<InvalidOperationException>(() =>
|
|
AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true));
|
|
|
|
Assert.Contains("ADMIN_NATIVE_OPERATIONAL_READS_ENABLED=true", exception.Message);
|
|
}, resultsEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesResultsWithOperationalReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeOperationalReadsEnabled);
|
|
Assert.True(options.NativeResultsEnabled);
|
|
}, operationalReadsEnabled: "true", resultsEnabled: "true");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnablesAdmissionsWithOperationalReadsAndSharedSessions()
|
|
{
|
|
WithEnvironment("true", null, null, () =>
|
|
{
|
|
var options = AdminMigrationOptions.FromEnvironment(
|
|
configuredNativeReadsEnabled: false,
|
|
authenticationNativeEnabled: true,
|
|
sharesLegacySessions: true);
|
|
|
|
Assert.True(options.NativeOperationalReadsEnabled);
|
|
Assert.True(options.NativeAdmissionsEnabled);
|
|
}, operationalReadsEnabled: "true", admissionsEnabled: "true");
|
|
}
|
|
|
|
private static void WithEnvironment(
|
|
string? nativeReadsEnabled,
|
|
string? nativeOrganizationWritesEnabled,
|
|
string? allowMemory,
|
|
Action test,
|
|
string? accountBatchesEnabled = null,
|
|
string? configurationEnabled = null,
|
|
string? noticeManagementEnabled = null,
|
|
string? legacyNoticeWritesEnabled = null,
|
|
string? centersEnabled = null,
|
|
string? operationalReadsEnabled = null,
|
|
string? candidateManagementEnabled = null,
|
|
string? registrationPaymentWritesEnabled = null,
|
|
string? workflowOperationsEnabled = null,
|
|
string? examManagementEnabled = null,
|
|
string? arrangementsEnabled = null,
|
|
string? resultsEnabled = null,
|
|
string? admissionsEnabled = null)
|
|
{
|
|
var previousNativeReadsEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_READS_ENABLED");
|
|
var previousNativeOrganizationWritesEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_ORGANIZATION_WRITES_ENABLED");
|
|
var previousAccountBatchesEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_ACCOUNT_BATCHES_ENABLED");
|
|
var previousConfigurationEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_CONFIGURATION_ENABLED");
|
|
var previousNoticeManagementEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_NOTICE_MANAGEMENT_ENABLED");
|
|
var previousLegacyNoticeWritesEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_NOTICE_WRITES_ENABLED");
|
|
var previousCentersEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_CENTERS_ENABLED");
|
|
var previousOperationalReadsEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_OPERATIONAL_READS_ENABLED");
|
|
var previousCandidateManagementEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_CANDIDATE_MANAGEMENT_ENABLED");
|
|
var previousRegistrationPaymentWritesEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_REGISTRATION_PAYMENT_WRITES_ENABLED");
|
|
var previousWorkflowOperationsEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_WORKFLOW_OPERATIONS_ENABLED");
|
|
var previousExamManagementEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_EXAM_MANAGEMENT_ENABLED");
|
|
var previousArrangementsEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_ARRANGEMENTS_ENABLED");
|
|
var previousResultsEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_RESULTS_ENABLED");
|
|
var previousAdmissionsEnabled = Environment.GetEnvironmentVariable("ADMIN_NATIVE_ADMISSIONS_ENABLED");
|
|
var previousAllowMemory = Environment.GetEnvironmentVariable("ADMIN_NATIVE_ALLOW_MEMORY");
|
|
try
|
|
{
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_READS_ENABLED", nativeReadsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ORGANIZATION_WRITES_ENABLED", nativeOrganizationWritesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ACCOUNT_BATCHES_ENABLED", accountBatchesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_CONFIGURATION_ENABLED", configurationEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_NOTICE_MANAGEMENT_ENABLED", noticeManagementEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_NOTICE_WRITES_ENABLED", legacyNoticeWritesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_CENTERS_ENABLED", centersEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_OPERATIONAL_READS_ENABLED", operationalReadsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_CANDIDATE_MANAGEMENT_ENABLED", candidateManagementEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_REGISTRATION_PAYMENT_WRITES_ENABLED", registrationPaymentWritesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_WORKFLOW_OPERATIONS_ENABLED", workflowOperationsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_EXAM_MANAGEMENT_ENABLED", examManagementEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ARRANGEMENTS_ENABLED", arrangementsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_RESULTS_ENABLED", resultsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ADMISSIONS_ENABLED", admissionsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ALLOW_MEMORY", allowMemory);
|
|
test();
|
|
}
|
|
finally
|
|
{
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_READS_ENABLED", previousNativeReadsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ORGANIZATION_WRITES_ENABLED", previousNativeOrganizationWritesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ACCOUNT_BATCHES_ENABLED", previousAccountBatchesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_CONFIGURATION_ENABLED", previousConfigurationEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_NOTICE_MANAGEMENT_ENABLED", previousNoticeManagementEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_NOTICE_WRITES_ENABLED", previousLegacyNoticeWritesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_CENTERS_ENABLED", previousCentersEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_OPERATIONAL_READS_ENABLED", previousOperationalReadsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_CANDIDATE_MANAGEMENT_ENABLED", previousCandidateManagementEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_REGISTRATION_PAYMENT_WRITES_ENABLED", previousRegistrationPaymentWritesEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_WORKFLOW_OPERATIONS_ENABLED", previousWorkflowOperationsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_EXAM_MANAGEMENT_ENABLED", previousExamManagementEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ARRANGEMENTS_ENABLED", previousArrangementsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_RESULTS_ENABLED", previousResultsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ADMISSIONS_ENABLED", previousAdmissionsEnabled);
|
|
Environment.SetEnvironmentVariable("ADMIN_NATIVE_ALLOW_MEMORY", previousAllowMemory);
|
|
}
|
|
}
|
|
}
|