Files
jdescopingtool/PLANS/2026-01-01-test-project-alignment-implementation.md
T
Joseph Doherty 26ff8d9b4f Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
2026-01-02 07:43:29 -05:00

13 KiB

Test Project Alignment Implementation Plan

For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

Goal: Restructure test projects to achieve 1:1 mapping with source projects.

Architecture: Create 5 new test projects, move existing tests from the generic JdeScoping.Tests to their proper homes, and delete the catch-all project.

Tech Stack: .NET 10, xUnit, NSubstitute, Shouldly


Phase 1: Create New Test Projects

Task 1.1: Create JdeScoping.Core.Tests project

Files:

  • Create: tests/JdeScoping.Core.Tests/JdeScoping.Core.Tests.csproj
  • Create: tests/JdeScoping.Core.Tests/Unit/ directory

Step 1: Create directory structure

Run:

mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Core.Tests/Unit

Step 2: Create .csproj file

Create tests/JdeScoping.Core.Tests/JdeScoping.Core.Tests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.4" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
    <PackageReference Include="NSubstitute" Version="5.3.0" />
    <PackageReference Include="Shouldly" Version="4.3.0" />
    <PackageReference Include="xunit" Version="2.9.3" />
    <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
  </ItemGroup>

  <ItemGroup>
    <Using Include="Xunit" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\src\JdeScoping.Core\JdeScoping.Core.csproj" />
  </ItemGroup>

</Project>

Task 1.2: Create JdeScoping.Infrastructure.Tests project

Files:

  • Create: tests/JdeScoping.Infrastructure.Tests/JdeScoping.Infrastructure.Tests.csproj
  • Create: tests/JdeScoping.Infrastructure.Tests/Unit/ directory

Step 1: Create directory structure

Run:

mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Infrastructure.Tests/Unit

Step 2: Create .csproj file

Create tests/JdeScoping.Infrastructure.Tests/JdeScoping.Infrastructure.Tests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.4" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
    <PackageReference Include="NSubstitute" Version="5.3.0" />
    <PackageReference Include="Shouldly" Version="4.3.0" />
    <PackageReference Include="xunit" Version="2.9.3" />
    <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
  </ItemGroup>

  <ItemGroup>
    <Using Include="Xunit" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\src\JdeScoping.Infrastructure\JdeScoping.Infrastructure.csproj" />
    <ProjectReference Include="..\..\src\JdeScoping.Core\JdeScoping.Core.csproj" />
  </ItemGroup>

</Project>

Task 1.3: Create JdeScoping.Client.Tests project (placeholder)

Files:

  • Create: tests/JdeScoping.Client.Tests/JdeScoping.Client.Tests.csproj
  • Create: tests/JdeScoping.Client.Tests/Placeholder.cs

Step 1: Create directory structure

Run:

mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Client.Tests

Step 2: Create .csproj file

Create tests/JdeScoping.Client.Tests/JdeScoping.Client.Tests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.4" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
    <PackageReference Include="NSubstitute" Version="5.3.0" />
    <PackageReference Include="Shouldly" Version="4.3.0" />
    <PackageReference Include="xunit" Version="2.9.3" />
    <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
  </ItemGroup>

  <ItemGroup>
    <Using Include="Xunit" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\src\JdeScoping.Client\JdeScoping.Client.csproj" />
  </ItemGroup>

</Project>

Step 3: Create placeholder file

Create tests/JdeScoping.Client.Tests/Placeholder.cs:

// This file exists to ensure the test project compiles.
// Add tests here as needed.
namespace JdeScoping.Client.Tests;

public class Placeholder
{
    // Tests will be added here
}

Task 1.4: Create JdeScoping.Database.Tests project (placeholder)

Files:

  • Create: tests/JdeScoping.Database.Tests/JdeScoping.Database.Tests.csproj
  • Create: tests/JdeScoping.Database.Tests/Placeholder.cs

Step 1: Create directory structure

Run:

mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Database.Tests

Step 2: Create .csproj file

Create tests/JdeScoping.Database.Tests/JdeScoping.Database.Tests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.4" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
    <PackageReference Include="NSubstitute" Version="5.3.0" />
    <PackageReference Include="Shouldly" Version="4.3.0" />
    <PackageReference Include="xunit" Version="2.9.3" />
    <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
  </ItemGroup>

  <ItemGroup>
    <Using Include="Xunit" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\src\JdeScoping.Database\JdeScoping.Database.csproj" />
  </ItemGroup>

</Project>

Step 3: Create placeholder file

Create tests/JdeScoping.Database.Tests/Placeholder.cs:

// This file exists to ensure the test project compiles.
// Add tests here as needed.
namespace JdeScoping.Database.Tests;

public class Placeholder
{
    // Tests will be added here
}

Task 1.5: Create JdeScoping.Host.Tests project (placeholder)

Files:

  • Create: tests/JdeScoping.Host.Tests/JdeScoping.Host.Tests.csproj
  • Create: tests/JdeScoping.Host.Tests/Placeholder.cs

Step 1: Create directory structure

Run:

mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Host.Tests

Step 2: Create .csproj file

Create tests/JdeScoping.Host.Tests/JdeScoping.Host.Tests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.4" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
    <PackageReference Include="NSubstitute" Version="5.3.0" />
    <PackageReference Include="Shouldly" Version="4.3.0" />
    <PackageReference Include="xunit" Version="2.9.3" />
    <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
  </ItemGroup>

  <ItemGroup>
    <Using Include="Xunit" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\src\JdeScoping.Host\JdeScoping.Host.csproj" />
  </ItemGroup>

</Project>

Step 3: Create placeholder file

Create tests/JdeScoping.Host.Tests/Placeholder.cs:

// This file exists to ensure the test project compiles.
// Add tests here as needed.
namespace JdeScoping.Host.Tests;

public class Placeholder
{
    // Tests will be added here
}

Phase 2: Move Test Files

Task 2.1: Move JdeDateConverterTests to Core.Tests

Files:

  • Move: tests/JdeScoping.Tests/Unit/JdeDateConverterTests.cstests/JdeScoping.Core.Tests/Unit/

Step 1: Copy file to new location

Run:

cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Tests/Unit/JdeDateConverterTests.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Core.Tests/Unit/

Step 2: Update namespace

In tests/JdeScoping.Core.Tests/Unit/JdeDateConverterTests.cs, change:

namespace JdeScoping.Tests.Unit;

to:

namespace JdeScoping.Core.Tests.Unit;

Task 2.2: Move QueryTypesTests to Core.Tests

Files:

  • Move: tests/JdeScoping.Tests/Unit/QueryTypesTests.cstests/JdeScoping.Core.Tests/Unit/

Step 1: Copy file to new location

Run:

cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Tests/Unit/QueryTypesTests.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Core.Tests/Unit/

Step 2: Update namespace

In tests/JdeScoping.Core.Tests/Unit/QueryTypesTests.cs, change:

namespace JdeScoping.Tests.Unit;

to:

namespace JdeScoping.Core.Tests.Unit;

Task 2.3: Move FakeAuthServiceTests to Infrastructure.Tests

Files:

  • Move: tests/JdeScoping.Tests/Unit/FakeAuthServiceTests.cstests/JdeScoping.Infrastructure.Tests/Unit/

Step 1: Copy file to new location

Run:

cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Tests/Unit/FakeAuthServiceTests.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Infrastructure.Tests/Unit/

Step 2: Update namespace

In tests/JdeScoping.Infrastructure.Tests/Unit/FakeAuthServiceTests.cs, change:

namespace JdeScoping.Tests.Unit;

to:

namespace JdeScoping.Infrastructure.Tests.Unit;

Phase 3: Update Solution File

Task 3.1: Update JdeScoping.slnx

Files:

  • Modify: JdeScoping.slnx

Step 1: Read current solution file

Run:

cat /Users/dohertj2/Desktop/JdeScopingTool/NEW/JdeScoping.slnx

Step 2: Add new test projects and remove old one

Add these project entries:

<Project Path="tests/JdeScoping.Core.Tests/JdeScoping.Core.Tests.csproj" />
<Project Path="tests/JdeScoping.Infrastructure.Tests/JdeScoping.Infrastructure.Tests.csproj" />
<Project Path="tests/JdeScoping.Client.Tests/JdeScoping.Client.Tests.csproj" />
<Project Path="tests/JdeScoping.Database.Tests/JdeScoping.Database.Tests.csproj" />
<Project Path="tests/JdeScoping.Host.Tests/JdeScoping.Host.Tests.csproj" />

Remove this project entry:

<Project Path="tests/JdeScoping.Tests/JdeScoping.Tests.csproj" />

Phase 4: Delete Old Test Project

Task 4.1: Delete JdeScoping.Tests directory

Step 1: Remove the old test project directory

Run:

rm -rf /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.Tests

Phase 5: Verification

Task 5.1: Build the solution

Step 1: Run build

Run:

cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet build

Expected: Build succeeded with 0 errors.


Task 5.2: Run all tests

Step 1: Execute test suite

Run:

cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet test --verbosity quiet

Expected: All tests pass.

Step 2: Verify test count

Run:

cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet test --list-tests 2>/dev/null | grep -c "^\s" || dotnet test --verbosity normal 2>&1 | grep "Passed\|Failed" | tail -20

Expected:

  • JdeScoping.Core.Tests: ~77 tests (JdeDateConverter + QueryTypes)
  • JdeScoping.Infrastructure.Tests: ~4 tests (FakeAuthService)
  • Placeholder projects: 0 tests each

Task 5.3: Verify project structure

Step 1: List test projects

Run:

ls -1 /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/

Expected output:

JdeScoping.Api.IntegrationTests
JdeScoping.Api.Tests
JdeScoping.Client.Tests
JdeScoping.Core.Tests
JdeScoping.DataAccess.Tests
JdeScoping.Database.Tests
JdeScoping.DataSync.Tests
JdeScoping.ExcelExport.Tests
JdeScoping.Host.Tests
JdeScoping.Infrastructure.Tests

Summary

Total Tasks: 14 tasks across 5 phases

  • Phase 1: Create 5 new test projects (5 tasks)
  • Phase 2: Move 3 test files with namespace updates (3 tasks)
  • Phase 3: Update solution file (1 task)
  • Phase 4: Delete old test project (1 task)
  • Phase 5: Verification (3 tasks)