Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion src/Aspire.Dashboard/Model/ExportHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public static ExportResult GetResourceAsJson(ResourceViewModel resource, IDictio
/// <returns>A result containing the .env file content and suggested file name.</returns>
public static ExportResult GetEnvironmentVariablesAsEnvFile(ResourceViewModel resource, IDictionary<string, ResourceViewModel> resourceByName)
{
var envContent = EnvHelpers.ConvertToEnvFormat(resource.Environment.Select(e => new KeyValuePair<string, string?>(e.Name, e.Value)));
var envContent = EnvHelpers.ConvertToEnvFormat(resource.Environment.Where(e => e.FromSpec).Select(e => new KeyValuePair<string, string?>(e.Name, e.Value)));
var fileName = $"{ResourceViewModel.GetResourceName(resource, resourceByName)}.env";
return new ExportResult(envContent, fileName);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Aspire.Dashboard/Model/ResourceMenuBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ await TextVisualizerDialog.OpenDialogAsync(new OpenTextVisualizerDialogOptions
}
});

if (resource.Environment.Length > 0)
if (resource.Environment.Any(e => e.FromSpec))
{
menuItems.Add(new MenuButtonItem
{
Expand Down
11 changes: 9 additions & 2 deletions tests/Aspire.Dashboard.Tests/Model/ExportHelpersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ public void GetEnvironmentVariablesAsEnvFile_ReturnsExpectedResult()
resourceType: "Container",
state: KnownResourceState.Running,
environment: [
new EnvironmentVariableViewModel("MY_VAR", "my-value", fromSpec: false)
new EnvironmentVariableViewModel("MY_VAR", "my-value", fromSpec: true),
new EnvironmentVariableViewModel("RUNTIME_VAR", "runtime-value", fromSpec: false)
]);

var resourceByName = new Dictionary<string, ResourceViewModel>(StringComparer.OrdinalIgnoreCase) { [resource.Name] = resource };
Expand All @@ -52,6 +53,12 @@ public void GetEnvironmentVariablesAsEnvFile_ReturnsExpectedResult()

// Assert
Assert.Equal("Test Resource.env", result.FileName);
Assert.Contains("MY_VAR=my-value", result.Content);
Assert.Equal(
"""
MY_VAR=my-value

""",
result.Content,
ignoreLineEndingDifferences: true);
}
}
67 changes: 67 additions & 0 deletions tests/Aspire.Dashboard.Tests/Model/ResourceMenuBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,73 @@ public void AddMenuItems_HasTelemetry_TelemetryItems()
e => Assert.Equal("Localized:ResourceActionMetricsText", e.Text));
}

[Fact]
public void AddMenuItems_WithFromSpecEnvVars_ExportEnvMenuItemShown()
{
// Arrange
var resource = ModelTestHelpers.CreateResource(
environment: [
new EnvironmentVariableViewModel("SPEC_VAR", "spec-value", fromSpec: true),
new EnvironmentVariableViewModel("RUNTIME_VAR", "runtime-value", fromSpec: false)
]);
var repository = TelemetryTestHelpers.CreateRepository();
var aiContextProvider = new TestAIContextProvider();
var resourceMenuBuilder = CreateResourceMenuBuilder(repository, aiContextProvider);

// Act
var menuItems = new List<MenuButtonItem>();
resourceMenuBuilder.AddMenuItems(
menuItems,
resource,
new Dictionary<string, ResourceViewModel>(StringComparer.OrdinalIgnoreCase) { [resource.Name] = resource },
EventCallback.Empty,
EventCallback<CommandViewModel>.Empty,
(_, _) => false,
showViewDetails: true,
showConsoleLogsItem: true,
showUrls: true);

// Assert
Assert.Collection(menuItems,
e => Assert.Equal("Localized:ActionViewDetailsText", e.Text),
e => Assert.Equal("Localized:ResourceActionConsoleLogsText", e.Text),
e => Assert.Equal("Localized:ExportJson", e.Text),
e => Assert.Equal("Localized:ExportEnv", e.Text));
}

[Fact]
public void AddMenuItems_WithoutFromSpecEnvVars_ExportEnvMenuItemNotShown()
{
// Arrange - only runtime env vars (fromSpec: false), no spec env vars
var resource = ModelTestHelpers.CreateResource(
environment: [
new EnvironmentVariableViewModel("RUNTIME_VAR1", "value1", fromSpec: false),
new EnvironmentVariableViewModel("RUNTIME_VAR2", "value2", fromSpec: false)
]);
var repository = TelemetryTestHelpers.CreateRepository();
var aiContextProvider = new TestAIContextProvider();
var resourceMenuBuilder = CreateResourceMenuBuilder(repository, aiContextProvider);

// Act
var menuItems = new List<MenuButtonItem>();
resourceMenuBuilder.AddMenuItems(
menuItems,
resource,
new Dictionary<string, ResourceViewModel>(StringComparer.OrdinalIgnoreCase) { [resource.Name] = resource },
EventCallback.Empty,
EventCallback<CommandViewModel>.Empty,
(_, _) => false,
showViewDetails: true,
showConsoleLogsItem: true,
showUrls: true);

// Assert - ExportEnv should NOT be in the menu
Assert.Collection(menuItems,
e => Assert.Equal("Localized:ActionViewDetailsText", e.Text),
e => Assert.Equal("Localized:ResourceActionConsoleLogsText", e.Text),
e => Assert.Equal("Localized:ExportJson", e.Text));
}

private sealed class TestNavigationManager : NavigationManager
{
}
Expand Down
Loading