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
58 changes: 46 additions & 12 deletions CosmosDBShell.Tests/CommandTests/WelcomeCommandTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ public void WelcomeScreen_LoadsEmbeddedAnsiContent()
{
var expectedVersion = ShellInterpreter.GetDisplayVersion(typeof(WelcomeScreen).Assembly);

Assert.Contains($"{MessageService.GetString("shell-welcome-preview")} {expectedVersion}", WelcomeScreen.Text, StringComparison.Ordinal);
Assert.Contains(expectedVersion, WelcomeScreen.Text, StringComparison.Ordinal);
Assert.Equal(
ShellInterpreter.IsPrereleaseVersion(expectedVersion),
WelcomeScreen.Text.Contains(MessageService.GetString("shell-welcome-preview"), StringComparison.Ordinal));
Assert.DoesNotContain("{{", WelcomeScreen.Text, StringComparison.Ordinal);
Assert.Contains(MessageService.GetString("shell-welcome-start"), WelcomeScreen.Text, StringComparison.Ordinal);
Assert.Contains(MessageService.GetString("shell-welcome-resources"), WelcomeScreen.Text, StringComparison.Ordinal);
Expand All @@ -34,7 +37,7 @@ public void WelcomeScreen_RenderUsesLocalizedTextAndPreservesCommands()
using var reader = new StreamReader(stream);
var keys = new HashSet<string>();

var rendered = WelcomeScreen.Render(reader.ReadToEnd(), "1.2.3", key =>
var rendered = WelcomeScreen.Render(reader.ReadToEnd(), "1.2.3-preview", key =>
{
keys.Add(key);
return "translated:" + key;
Expand All @@ -43,13 +46,38 @@ public void WelcomeScreen_RenderUsesLocalizedTextAndPreservesCommands()
Assert.Equal(15, keys.Count);
Assert.DoesNotContain("{{", rendered, StringComparison.Ordinal);
Assert.Contains("translated:shell-welcome-start", rendered, StringComparison.Ordinal);
Assert.Contains("translated:shell-welcome-preview 1.2.3", rendered, StringComparison.Ordinal);
Assert.Contains("translated:shell-welcome-preview 1.2.3-preview", rendered, StringComparison.Ordinal);
Assert.Contains("connect <endpoint>", rendered, StringComparison.Ordinal);
Assert.Contains("query \"SELECT * FROM c\"", rendered, StringComparison.Ordinal);
Assert.Contains("https://github.com/Azure/CosmosDBShell", rendered, StringComparison.Ordinal);
Assert.Contains("\u001b[", rendered, StringComparison.Ordinal);
}

[Theory]
[InlineData("1.2.3", false)]
[InlineData("1.2.3+preview", false)]
[InlineData("1.2.3-preview", true)]
[InlineData("1.2.3-preview.2+abc", true)]
[InlineData("1.2.3-beta.1", true)]
[InlineData("1.2.3-rc.1", true)]
[InlineData("unknown", false)]
public void WelcomeScreen_RenderShowsPreviewTextOnlyForPrereleases(string version, bool isPrerelease)
{
var assembly = typeof(WelcomeScreen).Assembly;
var resourceName = Assert.Single(assembly.GetManifestResourceNames(), name => name.EndsWith("cosmos_welcome.ans", StringComparison.Ordinal));
using var stream = assembly.GetManifestResourceStream(resourceName)!;
using var reader = new StreamReader(stream);

var rendered = WelcomeScreen.Render(reader.ReadToEnd(), version, key => MessageService.GetString(key));

Assert.DoesNotContain("{{", rendered, StringComparison.Ordinal);
Assert.Equal(isPrerelease, rendered.Contains(MessageService.GetString("shell-welcome-preview"), StringComparison.Ordinal));
Assert.Equal(isPrerelease, rendered.Contains(MessageService.GetString("shell-welcome-preview-warning"), StringComparison.Ordinal));
var lines = Regex.Replace(rendered, @"\x1b\[[0-9;]*m", string.Empty).ReplaceLineEndings("\n").Split('\n');
Assert.Contains(isPrerelease ? $"{MessageService.GetString("shell-welcome-preview")} {version}" : version, lines);
Assert.Contains(MessageService.GetString("shell-welcome-start"), rendered, StringComparison.Ordinal);
}

[Fact]
public void WelcomeScreen_LongTranslationsDoNotShiftCommandsOrResourceLinks()
{
Expand Down Expand Up @@ -133,8 +161,15 @@ public async Task WelcomeCommand_PrintsScreenAndReturnsSuccess()
}
}

[Fact]
public void PrintStartupStatus_PrintsPreviewWarningBelowVersion()
[Theory]
[InlineData("1.2.3", false)]
[InlineData("1.2.3+preview", false)]
[InlineData("1.2.3-preview", true)]
[InlineData("1.2.3-preview.2+abc", true)]
[InlineData("1.2.3-beta.1", true)]
[InlineData("1.2.3-rc.1", true)]
[InlineData("unknown", false)]
public void PrintStartupStatus_PrintsPreviewWarningOnlyForPrereleases(string version, bool isPrerelease)
{
var configPath = Path.Join(Path.GetTempPath(), $"cosmosshell-welcome-{Guid.NewGuid():N}");
var originalOut = Console.Out;
Expand All @@ -145,21 +180,20 @@ public void PrintStartupStatus_PrintsPreviewWarningBelowVersion()
Console.SetOut(output);
using var shell = new ShellInterpreter(configPath);

shell.PrintStartupStatus();
shell.PrintStartupStatus(version);

var status = output.ToString();
Assert.StartsWith(
MessageService.GetArgsString(
"shell-startup-status",
"version", ShellInterpreter.GetDisplayVersion(typeof(ShellInterpreter).Assembly),
"version", version,
"mcp_status", MessageService.GetString("shell-startup-mcp-off")),
status,
StringComparison.Ordinal);
Assert.Contains(
$"{Environment.NewLine}{MessageService.GetString("shell-startup-preview-warning")}{Environment.NewLine}",
status,
StringComparison.Ordinal);
Assert.Equal(2, status.Count(character => character == '\n'));
Assert.Equal(
isPrerelease,
status.Contains($"{Environment.NewLine}{MessageService.GetString("shell-startup-preview-warning")}{Environment.NewLine}", StringComparison.Ordinal));
Assert.Equal(isPrerelease ? 2 : 1, status.Count(character => character == '\n'));
}
finally
{
Expand Down
17 changes: 15 additions & 2 deletions CosmosDBShell/Azure.Data.Cosmos.Shell.Core/ShellInterpreter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ namespace Azure.Data.Cosmos.Shell.Core;
using global::Azure.Core;
using global::Azure.Identity;
using Microsoft.Azure.Cosmos;
using NuGet.Versioning;
using RadLine;
using Spectre.Console;

Expand Down Expand Up @@ -1014,6 +1015,11 @@ internal static string GetDisplayVersion(Assembly assembly)
return assembly.GetName().Version?.ToString() ?? "unknown";
}

internal static bool IsPrereleaseVersion(string version)
{
return NuGetVersion.TryParse(version, out var parsedVersion) && parsedVersion.IsPrerelease;
}

internal static string GetDisplayCommit(Assembly assembly)
{
return ExtractCommitMetadata(assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion);
Expand Down Expand Up @@ -1190,7 +1196,11 @@ internal bool ShowWelcomeOnFirstRun()

internal void PrintStartupStatus()
{
var version = GetDisplayVersion(typeof(VersionCommand).Assembly);
this.PrintStartupStatus(GetDisplayVersion(typeof(VersionCommand).Assembly));
}

internal void PrintStartupStatus(string version)
{
var mcpStatus = this.McpPort is int port
? MessageService.GetArgsString("shell-startup-mcp-port", "port", port.ToString())
: MessageService.GetString("shell-startup-mcp-off");
Expand All @@ -1200,7 +1210,10 @@ internal void PrintStartupStatus()
version,
"mcp_status",
mcpStatus));
WriteLine(MessageService.GetString("shell-startup-preview-warning"));
if (IsPrereleaseVersion(version))
{
WriteLine(MessageService.GetString("shell-startup-preview-warning"));
}
}

internal async Task<int> RunAsync()
Expand Down
6 changes: 6 additions & 0 deletions CosmosDBShell/Azure.Data.Cosmos.Shell.Core/WelcomeScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ internal static class WelcomeScreen

internal static string Render(string template, string version, Func<string, string> getString)
{
var isPrerelease = ShellInterpreter.IsPrereleaseVersion(version);
template = Regex.Replace(
template,
@"\{\{PREVIEW\}\}(.*?)\{\{END_PREVIEW\}\}",
match => isPrerelease ? match.Groups[1].Value : string.Empty,
RegexOptions.Singleline);
return Regex.Replace(
template,
@"\{\{(VERSION|shell-welcome-[a-z-]+)\}\}",
Expand Down
6 changes: 3 additions & 3 deletions CosmosDBShell/cosmos_welcome.ans
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@
{{shell-welcome-examples}}
https://github.com/Azure/CosmosDBShell/tree/main/examples

{{shell-welcome-preview}} {{VERSION}}
{{shell-welcome-preview-warning}}

{{PREVIEW}}{{shell-welcome-preview}} {{END_PREVIEW}}{{VERSION}}
{{PREVIEW}}{{shell-welcome-preview-warning}}
{{END_PREVIEW}}
2 changes: 2 additions & 0 deletions docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -1926,6 +1926,8 @@ Usage: welcome

The welcome screen is shown automatically on the first interactive startup. Later
startups show a compact line containing the shell version and MCP server status.
The welcome screen and startup status show preview warnings only when the running
version is a prerelease (for example, `-preview`, `-beta`, or `-rc`).

### cls

Expand Down
Loading