Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
da56f4e
Add dependency-review (#3)
mm-psy Dec 18, 2025
4739f08
Add Scorecard supply-chain security (#2)
mm-psy Dec 18, 2025
d809ee7
Create docker-publish.yml (#7)
mm-psy Dec 19, 2025
bea4743
Create dotnet (#6)
mm-psy Dec 19, 2025
a166826
Enhance Submodel Element request handling(#8)
mm-kgi Jan 6, 2026
0ca152b
Add dependabot-version-updates (#4)
mm-psy Jan 12, 2026
e4fe5a6
Enhancement of DataEngine Implementation (#12)
mm-kgi Jan 15, 2026
cf19f13
Added example folder With Dpp-plugin (#13)
mm-hsh Jan 16, 2026
69c50aa
Restructure Dockerfile for improved build process and clarity (#14)
mm-psy Jan 17, 2026
328dd9c
Added Test Plugin and Example for 3 submodels using Test plugin (#11)
mm-kgi Jan 19, 2026
6d9284a
#182: Test plugin review results (#17)
HolgerSantelmann Jan 21, 2026
d27c181
Add codeql (#5)
mm-psy Jan 21, 2026
adad264
Enhancement of DataEngine Implementation (#18)
mm-hsh Jan 22, 2026
46acc89
Add hotfix develop release branches to actions (#15)
mm-psy Jan 22, 2026
2b973bd
#257: Enhancement TestPlugin to verify access SubmodelElement inside …
HolgerSantelmann Jan 22, 2026
01d0222
README.md with detailed DataEngine overview and feature descriptions …
mm-kgi Jan 23, 2026
35e0d20
Refactor SyncShellDescriptorsAsync to log errors and return instead o…
mm-kgi Jan 23, 2026
c4b9591
Generate SBOM for Container & application (#23)
rkg-mm Jan 26, 2026
71ba1a8
Add groups dependabot (#24)
mm-psy Jan 26, 2026
b9eae85
Enhance example-Docker setup (#16)
mm-hsh Jan 27, 2026
ebeaef1
Add manual trigger capability to .NET pipeline (#21)
mm-psy Jan 27, 2026
4839155
Merge main branch and resolved the security issue (#27)
mm-kgi Jan 27, 2026
8112659
Dev fix trivy (#22)
mm-psy Jan 27, 2026
049a654
Dev fix trivy + tag rework (#23)
mm-psy Jan 29, 2026
5fa07e6
Psy test playwright (#35)
mm-psy Feb 10, 2026
d85b350
Merge branch 'main' into develop
mm-psy Feb 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 160 additions & 0 deletions .github/workflows/playwright-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
name: Playwright Tests

on:
workflow_dispatch:
pull_request:
branches:
- 'main'
- 'develop'
- 'release/**'
- 'hotfix/**'
push:
branches:
- 'main'
- 'develop'
- 'release/**'
- 'hotfix/**'

permissions:
contents: read

env:
BUILD_CONFIGURATION: "Release"
SOLUTION_PATH: source/AAS.TwinEngine.DataEngine.sln
PLAYWRIGHT_TEST_PROJECT: source/AAS.TwinEngine.Plugin.TestPlugin.PlaywrightTests/AAS.TwinEngine.Plugin.TestPlugin.PlaywrightTests.csproj
DOCKER_COMPOSE_PATH: source/AAS.TwinEngine.Plugin.TestPlugin/Example
BASE_URL: "http://localhost:8085"

jobs:
playwright-tests:
name: Run Playwright Tests
runs-on: ubuntu-latest
timeout-minutes: 30

permissions:
contents: read
checks: write
pull-requests: write

steps:
- name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1

- name: Setup .NET
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
with:
dotnet-version: "8.0.x"

- name: Restore dependencies
run: dotnet restore ${{ env.SOLUTION_PATH }} --locked-mode

- name: Build solution
run: dotnet build ${{ env.SOLUTION_PATH }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore

- name: Build Playwright test project
run: dotnet build ${{ env.PLAYWRIGHT_TEST_PROJECT }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore

- name: Start Docker Compose services
run: |
cd ${{ env.DOCKER_COMPOSE_PATH }}
docker compose up -d
env:
COMPOSE_HTTP_TIMEOUT: 200

- name: Wait for services to be healthy
run: |
cd ${{ env.DOCKER_COMPOSE_PATH }}

echo "Waiting for services to be healthy..."

MAX_WAIT=300
ELAPSED=0
INTERVAL=10

while [ $ELAPSED -lt $MAX_WAIT ]; do
# Check if all services are running
RUNNING=$(docker compose ps --status running --format json 2>/dev/null | jq -s 'length' 2>/dev/null || echo "0")
TOTAL=$(docker compose ps --format json 2>/dev/null | jq -s 'length' 2>/dev/null || echo "0")

echo "Running containers: $RUNNING/$TOTAL"

# Check for any unhealthy services
UNHEALTHY=$(docker compose ps --format json 2>/dev/null | jq -r 'select(.Health != "" and .Health != "healthy") | .Service' 2>/dev/null | wc -l)

if [ $RUNNING -ge 6 ] && [ $UNHEALTHY -eq 0 ]; then
echo "Services are up and running!"
docker compose ps
break
fi

echo "Waiting for services... ($ELAPSED/$MAX_WAIT seconds)"
sleep $INTERVAL
ELAPSED=$((ELAPSED + INTERVAL))
done

if [ $ELAPSED -ge $MAX_WAIT ]; then
echo "Timeout waiting for services to be ready"
echo "Current service status:"
docker compose ps
echo "Service logs:"
docker compose logs --tail=100
exit 1
fi

# Additional wait to ensure services are fully ready
echo "Waiting additional 20 seconds for services to stabilize..."
sleep 20

# Verify critical endpoints are responding
echo "Checking DataEngine endpoint..."
for i in {1..15}; do
if curl -f -s -o /dev/null ${{ env.BASE_URL }}/shell-descriptors 2>&1; then
echo "DataEngine is responding!"
break
fi
if [ $i -eq 15 ]; then
echo "DataEngine is not responding after 15 attempts"
docker compose logs twinengine-dataengine --tail=50
exit 1
fi
echo "Attempt $i: DataEngine not ready yet..."
sleep 5
done

echo "All services are ready for testing!"

- name: Show running containers
if: always()
run: |
cd ${{ env.DOCKER_COMPOSE_PATH }}
docker compose ps
echo "---"
docker compose logs --tail=50

- name: Run Playwright Tests
run: dotnet test ${{ env.PLAYWRIGHT_TEST_PROJECT }} --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --logger "trx;LogFileName=playwright_test_results.trx" --verbosity normal
env:
BASE_URL: ${{ env.BASE_URL }}

- name: Publish Test Results
uses: dorny/test-reporter@fe45e9537387dac839af0d33ba56eed8e24189e8 # v2.3.0
if: always()
with:
name: Playwright Test Results
path: "**/playwright_test_results.trx"
reporter: dotnet-trx
fail-on-error: true

- name: Capture Docker Compose Logs
if: always()
run: |
cd ${{ env.DOCKER_COMPOSE_PATH }}
mkdir -p logs
docker compose logs > logs/docker-compose-full.log 2>&1 || true
docker compose ps > logs/docker-compose-status.txt 2>&1 || true

- name: Stop Docker Compose services
if: always()
run: |
cd ${{ env.DOCKER_COMPOSE_PATH }}
docker compose down -v
1 change: 0 additions & 1 deletion example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ Before running the demonstrator, ensure you have installed:
1. **Clone or extract this repository:**
```bash
git clone https://github.com/AAS-TwinEngine/AAS.TwinEngine.DataEngine.git
cd AAS.TwinEngine.DataEngine
```
2. **Go Inside example Folder**

Expand Down
58 changes: 58 additions & 0 deletions source/AAS.TwinEngine.DataEngine.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,90 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AAS.TwinEngine.Plugin.TestP
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AAS.TwinEngine.Plugin.TestPlugin.UnitTests", "AAS.TwinEngine.Plugin.TestPlugin.UnitTests\AAS.TwinEngine.Plugin.TestPlugin.UnitTests.csproj", "{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AAS.TwinEngine.Plugin.TestPlugin.PlaywrightTests", "AAS.TwinEngine.Plugin.TestPlugin.PlaywrightTests\AAS.TwinEngine.Plugin.TestPlugin.PlaywrightTests.csproj", "{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{80387870-5B50-461A-B5E7-105B9D526F7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Debug|x64.ActiveCfg = Debug|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Debug|x64.Build.0 = Debug|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Debug|x86.ActiveCfg = Debug|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Debug|x86.Build.0 = Debug|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Release|Any CPU.Build.0 = Release|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Release|x64.ActiveCfg = Release|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Release|x64.Build.0 = Release|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Release|x86.ActiveCfg = Release|Any CPU
{80387870-5B50-461A-B5E7-105B9D526F7B}.Release|x86.Build.0 = Release|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Debug|x64.ActiveCfg = Debug|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Debug|x64.Build.0 = Debug|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Debug|x86.ActiveCfg = Debug|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Debug|x86.Build.0 = Debug|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Release|Any CPU.Build.0 = Release|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Release|x64.ActiveCfg = Release|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Release|x64.Build.0 = Release|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Release|x86.ActiveCfg = Release|Any CPU
{B24F4A6D-294A-4C4A-BAAC-A2D396E8C88A}.Release|x86.Build.0 = Release|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Debug|x64.ActiveCfg = Debug|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Debug|x64.Build.0 = Debug|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Debug|x86.ActiveCfg = Debug|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Debug|x86.Build.0 = Debug|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Release|Any CPU.Build.0 = Release|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Release|x64.ActiveCfg = Release|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Release|x64.Build.0 = Release|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Release|x86.ActiveCfg = Release|Any CPU
{D16C8CF8-6A29-4A40-971A-9A070A1817A9}.Release|x86.Build.0 = Release|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Debug|Any CPU.Build.0 = Debug|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Debug|x64.ActiveCfg = Debug|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Debug|x64.Build.0 = Debug|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Debug|x86.ActiveCfg = Debug|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Debug|x86.Build.0 = Debug|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Release|Any CPU.ActiveCfg = Release|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Release|Any CPU.Build.0 = Release|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Release|x64.ActiveCfg = Release|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Release|x64.Build.0 = Release|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Release|x86.ActiveCfg = Release|Any CPU
{455B960D-57D0-4D9B-805C-E1DEA05B9311}.Release|x86.Build.0 = Release|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Debug|x64.ActiveCfg = Debug|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Debug|x64.Build.0 = Debug|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Debug|x86.ActiveCfg = Debug|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Debug|x86.Build.0 = Debug|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Release|Any CPU.Build.0 = Release|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Release|x64.ActiveCfg = Release|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Release|x64.Build.0 = Release|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Release|x86.ActiveCfg = Release|Any CPU
{573F3A2B-8CC3-40D8-B543-74BF5DF7D4FF}.Release|x86.Build.0 = Release|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Debug|x64.ActiveCfg = Debug|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Debug|x64.Build.0 = Debug|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Debug|x86.ActiveCfg = Debug|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Debug|x86.Build.0 = Debug|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Release|Any CPU.Build.0 = Release|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Release|x64.ActiveCfg = Release|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Release|x64.Build.0 = Release|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Release|x86.ActiveCfg = Release|Any CPU
{147F5F77-EC38-4541-AF3C-5B4FAD15E1C4}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,17 @@ private async Task<string> SendGetRequestAndReadContentAsync(string url, Cancell
private async Task SendRequestWithBodyAsync(HttpMethod method, string url, ShellDescriptor data, CancellationToken cancellationToken)
{
var client = clientFactory.CreateClient(HttpClientName);
var content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");

var json = JsonSerializer.Serialize(data, JsonSerializationOptions.Serialization);
var content = new StringContent(json, Encoding.UTF8, "application/json");

logger.LogInformation("Sending HTTP {Method} request to {Url}", method, url);

using var request = new HttpRequestMessage(method, url);
request.Content = content;
using var request = new HttpRequestMessage(method, url)
{
Content = content
};

var response = await client.SendAsync(request, cancellationToken).ConfigureAwait(false);

await HandleResponseAsync(response, $"{method} ShellDescriptor", url, cancellationToken).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,11 @@ public static class JsonSerializationOptions
public static readonly JsonSerializerOptions Serialization = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = false
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};

public static readonly JsonSerializerOptions SerializationWithEnum = new()
{
WriteIndented = false,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) }
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<NoWarn>IDE1006, IDE0058</NoWarn>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="Microsoft.Playwright" Version="1.48.0" />
<PackageReference Include="Microsoft.Playwright.NUnit" Version="1.48.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>

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

<ItemGroup>
<None Update="AasRegistry\TestData\GetAllShellDescriptors_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="AasRegistry\TestData\GetShellDescriptorById_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="AasRepository\TestData\GetAssetInformationById_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="AasRepository\TestData\GetShellById_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="AasRepository\TestData\GetSubmodelRefById_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRegistry\TestData\GetSubmodelDescriptorById_Contact_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRegistry\TestData\GetSubmodelDescriptorById_Nameplate_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRegistry\TestData\GetSubmodelDescriptorById_Reliability_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRepository\TestData\GetSubmodelElement_ContactInfo_ContactInformation_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRepository\TestData\GetSubmodelElement_Nameplate_ManufacturerName_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRepository\TestData\GetSubmodelElement_Nameplate_Markings_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRepository\TestData\GetSubmodelElement_Reliability_ReliabilityCharacteristics_MTTF.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRepository\TestData\GetSubmodel_ContactInfo_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRepository\TestData\GetSubmodel_Nameplate_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SubmodelRepository\TestData\GetSubmodel_Reliability_Expected.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
Loading
Loading