Skip to content

Commit

Permalink
Make context mockable
Browse files Browse the repository at this point in the history
  • Loading branch information
svegiraju-microsoft committed Oct 10, 2024
1 parent c47e650 commit a1abfdc
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 13 deletions.
7 changes: 7 additions & 0 deletions all.sln
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dapr.E2E.Test.Actors.Genera
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cryptography", "examples\Client\Cryptography\Cryptography.csproj", "{C74FBA78-13E8-407F-A173-4555AEE41FF3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dapr.Workflow.Test", "test\Dapr.Workflows.Test\Dapr.Workflow.Test.csproj", "{7CA93D67-C551-430E-AA2C-BC64B77F7908}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -290,6 +292,10 @@ Global
{C74FBA78-13E8-407F-A173-4555AEE41FF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C74FBA78-13E8-407F-A173-4555AEE41FF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C74FBA78-13E8-407F-A173-4555AEE41FF3}.Release|Any CPU.Build.0 = Release|Any CPU
{7CA93D67-C551-430E-AA2C-BC64B77F7908}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7CA93D67-C551-430E-AA2C-BC64B77F7908}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7CA93D67-C551-430E-AA2C-BC64B77F7908}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7CA93D67-C551-430E-AA2C-BC64B77F7908}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -343,6 +349,7 @@ Global
{AF89083D-4715-42E6-93E9-38497D12A8A6} = {DD020B34-460F-455F-8D17-CF4A949F100B}
{B5CDB0DC-B26D-48F1-B934-FE5C1C991940} = {DD020B34-460F-455F-8D17-CF4A949F100B}
{C74FBA78-13E8-407F-A173-4555AEE41FF3} = {A7F41094-8648-446B-AECD-DCC2CC871F73}
{7CA93D67-C551-430E-AA2C-BC64B77F7908} = {DD020B34-460F-455F-8D17-CF4A949F100B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40}
Expand Down
37 changes: 37 additions & 0 deletions src/Dapr.Workflow/DaprWorkflowActivityContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// ------------------------------------------------------------------------
// Copyright 2022 The Dapr Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ------------------------------------------------------------------------

namespace Dapr.Workflow
{
using System;
using Microsoft.DurableTask;

/// <summary>
/// Defines properties and methods for task activity context objects.
/// </summary>
public class DaprWorkflowActivityContext : WorkflowActivityContext
{
readonly TaskActivityContext innerContext;

internal DaprWorkflowActivityContext(TaskActivityContext innerContext)
{
this.innerContext = innerContext ?? throw new ArgumentNullException(nameof(innerContext));
}

/// <inheritdoc/>
public override TaskName Name => this.innerContext.Name;

/// <inheritdoc/>
public override string InstanceId => this.innerContext.InstanceId;
}
}
14 changes: 3 additions & 11 deletions src/Dapr.Workflow/WorkflowActivityContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,21 @@

namespace Dapr.Workflow
{
using System;
using Microsoft.DurableTask;

/// <summary>
/// Defines properties and methods for task activity context objects.
/// </summary>
public class WorkflowActivityContext
public abstract class WorkflowActivityContext
{
readonly TaskActivityContext innerContext;

internal WorkflowActivityContext(TaskActivityContext innerContext)
{
this.innerContext = innerContext ?? throw new ArgumentNullException(nameof(innerContext));
}

/// <summary>
/// Gets the name of the activity.
/// </summary>
public TaskName Name => this.innerContext.Name;
public abstract TaskName Name { get; }

/// <summary>
/// Gets the unique ID of the current workflow instance.
/// </summary>
public string InstanceId => this.innerContext.InstanceId;
public abstract string InstanceId { get; }
}
}
4 changes: 2 additions & 2 deletions src/Dapr.Workflow/WorkflowRuntimeOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public void RegisterActivity<TInput, TOutput>(string name, Func<WorkflowActivity
{
registry.AddActivityFunc<TInput, TOutput>(name, (innerContext, input) =>
{
WorkflowActivityContext activityContext = new(innerContext);
WorkflowActivityContext activityContext = new DaprWorkflowActivityContext(innerContext);
return implementation(activityContext, input);
});
WorkflowLoggingService.LogActivityName(name);
Expand Down Expand Up @@ -167,7 +167,7 @@ public ActivityWrapper(IWorkflowActivity activity)

public Task<object?> RunAsync(TaskActivityContext context, object? input)
{
return this.activity.RunAsync(new WorkflowActivityContext(context), input);
return this.activity.RunAsync(new DaprWorkflowActivityContext(context), input);
}
}
}
Expand Down
25 changes: 25 additions & 0 deletions test/Dapr.Workflow.Test/Dapr.Workflow.Test.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RootNamespace>Dapr.Workflow.Tests</RootNamespace>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.msbuild" Version="6.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="FluentAssertions" Version="5.9.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
<PackageReference Include="Moq" Version="4.20.70" />
<PackageReference Include="xunit" Version="2.8.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\Dapr.Workflow\Dapr.Workflow.csproj" />
</ItemGroup>
</Project>
51 changes: 51 additions & 0 deletions test/Dapr.Workflow.Test/WorkflowActivityTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// ------------------------------------------------------------------------
// Copyright 2021 The Dapr Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ------------------------------------------------------------------------

namespace Dapr.Workflow.Test
{
using Moq;
using System.Threading.Tasks;
using Xunit;

/// <summary>
/// Contains tests for WorkflowActivityContext.
/// </summary>
public class WorkflowActivityTest
{
private IWorkflowActivity workflowActivity;

private Mock<WorkflowActivityContext> workflowActivityContextMock;

[Fact]
public async Task RunAsync_ShouldReturnCorrectContextInstanceId()
{
this.workflowActivity = new TestDaprWorkflowActivity();
this.workflowActivityContextMock = new Mock<WorkflowActivityContext>();

this.workflowActivityContextMock.Setup((x) => x.InstanceId).Returns("instanceId");

string result = (string) await this.workflowActivity.RunAsync(this.workflowActivityContextMock.Object, "input");

Assert.Equal("instanceId", result);
}


public class TestDaprWorkflowActivity : WorkflowActivity<string, string>
{
public override Task<string> RunAsync(WorkflowActivityContext context, string input)
{
return Task.FromResult(context.InstanceId);
}
}
}
}

0 comments on commit a1abfdc

Please sign in to comment.