Skip to content

Commit 612200d

Browse files
nohwndrjmholtTylerLeonhardt
authored
Run single test in Pester v5 (#1167)
* Run single test in Pester v5 * Add opt-in for Pester v5 code lens * Fix code quality issues * Fix nitpicky new line * Update src/PowerShellEditorServices/Services/CodeLens/PesterCodeLensProvider.cs Co-Authored-By: Robert Holt <[email protected]> * Update src/PowerShellEditorServices/Services/Workspace/LanguageServerSettings.cs Co-Authored-By: Robert Holt <[email protected]> * Address PR feedback * Rename option to EnableLegacyCodeLens * Flip the option because it defaults to true * pass in config service to provider * add new ConfigurationService to tests * add new test * change to use Co-authored-by: Robert Holt <[email protected]> Co-authored-by: Tyler Leonhardt <[email protected]>
1 parent 575932d commit 612200d

File tree

7 files changed

+170
-24
lines changed

7 files changed

+170
-24
lines changed

src/PowerShellEditorServices/Services/CodeLens/PesterCodeLensProvider.cs

+17-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
44
//
55

6+
using System;
67
using System.Collections.Generic;
8+
using Microsoft.PowerShell.EditorServices.Services;
79
using Microsoft.PowerShell.EditorServices.Services.Symbols;
810
using Microsoft.PowerShell.EditorServices.Services.TextDocument;
911
using Microsoft.PowerShell.EditorServices.Utility;
@@ -14,6 +16,7 @@ namespace Microsoft.PowerShell.EditorServices.CodeLenses
1416
{
1517
internal class PesterCodeLensProvider : ICodeLensProvider
1618
{
19+
private readonly ConfigurationService _configurationService;
1720

1821
/// <summary>
1922
/// The symbol provider to get symbols from to build code lenses with.
@@ -29,8 +32,9 @@ internal class PesterCodeLensProvider : ICodeLensProvider
2932
/// <summary>
3033
/// Create a new Pester CodeLens provider for a given editor session.
3134
/// </summary>
32-
public PesterCodeLensProvider()
35+
public PesterCodeLensProvider(ConfigurationService configurationService)
3336
{
37+
_configurationService = configurationService;
3438
_symbolProvider = new PesterDocumentSymbolProvider();
3539
}
3640

@@ -42,7 +46,7 @@ public PesterCodeLensProvider()
4246
/// <returns>All CodeLenses for the given Pester symbol.</returns>
4347
private CodeLens[] GetPesterLens(PesterSymbolReference pesterSymbol, ScriptFile scriptFile)
4448
{
45-
49+
string word = pesterSymbol.Command == PesterCommandType.It ? "test" : "tests";
4650
var codeLensResults = new CodeLens[]
4751
{
4852
new CodeLens()
@@ -55,7 +59,7 @@ private CodeLens[] GetPesterLens(PesterSymbolReference pesterSymbol, ScriptFile
5559
Command = new Command()
5660
{
5761
Name = "PowerShell.RunPesterTests",
58-
Title = "Run tests",
62+
Title = $"Run {word}",
5963
Arguments = JArray.FromObject(new object[] {
6064
scriptFile.DocumentUri,
6165
false /* No debug */,
@@ -74,7 +78,7 @@ private CodeLens[] GetPesterLens(PesterSymbolReference pesterSymbol, ScriptFile
7478
Command = new Command()
7579
{
7680
Name = "PowerShell.RunPesterTests",
77-
Title = "Debug tests",
81+
Title = $"Debug {word}",
7882
Arguments = JArray.FromObject(new object[] {
7983
scriptFile.DocumentUri,
8084
true /* No debug */,
@@ -97,15 +101,18 @@ public CodeLens[] ProvideCodeLenses(ScriptFile scriptFile)
97101
var lenses = new List<CodeLens>();
98102
foreach (SymbolReference symbol in _symbolProvider.ProvideDocumentSymbols(scriptFile))
99103
{
100-
if (symbol is PesterSymbolReference pesterSymbol)
104+
if (!(symbol is PesterSymbolReference pesterSymbol))
101105
{
102-
if (pesterSymbol.Command != PesterCommandType.Describe)
103-
{
104-
continue;
105-
}
106+
continue;
107+
}
106108

107-
lenses.AddRange(GetPesterLens(pesterSymbol, scriptFile));
109+
if (_configurationService.CurrentSettings.Pester.UseLegacyCodeLens
110+
&& pesterSymbol.Command != PesterCommandType.Describe)
111+
{
112+
continue;
108113
}
114+
115+
lenses.AddRange(GetPesterLens(pesterSymbol, scriptFile));
109116
}
110117

111118
return lenses.ToArray();

src/PowerShellEditorServices/Services/Symbols/SymbolsService.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ internal class SymbolsService
5151
public SymbolsService(
5252
ILoggerFactory factory,
5353
PowerShellContextService powerShellContextService,
54-
WorkspaceService workspaceService)
54+
WorkspaceService workspaceService,
55+
ConfigurationService configurationService)
5556
{
5657
_logger = factory.CreateLogger<SymbolsService>();
5758
_powerShellContextService = powerShellContextService;
@@ -61,7 +62,7 @@ public SymbolsService(
6162
var codeLensProviders = new ICodeLensProvider[]
6263
{
6364
new ReferencesCodeLensProvider(_workspaceService, this),
64-
new PesterCodeLensProvider(),
65+
new PesterCodeLensProvider(configurationService),
6566
};
6667
foreach (ICodeLensProvider codeLensProvider in codeLensProviders)
6768
{

src/PowerShellEditorServices/Services/TextDocument/Handlers/CodeLensHandlers.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ internal class CodeLensHandlers : ICodeLensHandler, ICodeLensResolveHandler
3030

3131
private CodeLensCapability _capability;
3232

33-
public CodeLensHandlers(ILoggerFactory factory, SymbolsService symbolsService, WorkspaceService workspaceService)
33+
public CodeLensHandlers(ILoggerFactory factory, SymbolsService symbolsService, WorkspaceService workspaceService, ConfigurationService configurationService)
3434
{
3535
_logger = factory.CreateLogger<FoldingRangeHandler>();
3636
_workspaceService = workspaceService;

src/PowerShellEditorServices/Services/Workspace/LanguageServerSettings.cs

+24
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ internal class LanguageServerSettings
2626

2727
public CodeFoldingSettings CodeFolding { get; set; }
2828

29+
public PesterSettings Pester { get; set; }
30+
2931
public LanguageServerSettings()
3032
{
3133
this.ScriptAnalysis = new ScriptAnalysisSettings();
3234
this.CodeFormatting = new CodeFormattingSettings();
3335
this.CodeFolding = new CodeFoldingSettings();
36+
this.Pester = new PesterSettings();
3437
}
3538

3639
public void Update(
@@ -49,6 +52,7 @@ public void Update(
4952
logger);
5053
this.CodeFormatting = new CodeFormattingSettings(settings.CodeFormatting);
5154
this.CodeFolding.Update(settings.CodeFolding, logger);
55+
this.Pester = new PesterSettings(settings.Pester);
5256
}
5357
}
5458
}
@@ -356,6 +360,26 @@ public void Update(
356360
}
357361
}
358362

363+
/// <summary>
364+
/// Pester settings
365+
/// </summary>
366+
public class PesterSettings
367+
{
368+
public PesterSettings()
369+
{
370+
}
371+
372+
public PesterSettings(PesterSettings settings)
373+
{
374+
UseLegacyCodeLens = settings.UseLegacyCodeLens;
375+
}
376+
377+
/// <summary>
378+
/// Whether integration features specific to Pester v5 are enabled
379+
/// </summary>
380+
public bool UseLegacyCodeLens { get; set; }
381+
}
382+
359383
/// <summary>
360384
/// Additional settings from the Language Client that affect Language Server operations but
361385
/// do not exist under the 'powershell' section

test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public async override Task CustomInitializeAsync(
3232
// Make sure Script Analysis is enabled because we'll need it in the tests.
3333
LanguageClient.Workspace.DidChangeConfiguration(JObject.Parse(@"
3434
{
35-
""PowerShell"": {
36-
""ScriptAnalysis"": {
37-
""Enable"": true
35+
""powershell"": {
36+
""scriptAnalysis"": {
37+
""enable"": true
3838
}
3939
}
4040
}

test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs

+121-7
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,9 @@ public async Task CanReceiveDiagnosticsFromConfigurationChange()
198198
{
199199
Settings = JToken.Parse(@"
200200
{
201-
""PowerShell"": {
202-
""ScriptAnalysis"": {
203-
""Enable"": false
201+
""powershell"": {
202+
""scriptAnalysis"": {
203+
""enable"": false
204204
}
205205
}
206206
}
@@ -216,9 +216,9 @@ public async Task CanReceiveDiagnosticsFromConfigurationChange()
216216
{
217217
Settings = JToken.Parse(@"
218218
{
219-
""PowerShell"": {
220-
""ScriptAnalysis"": {
221-
""Enable"": true
219+
""powershell"": {
220+
""scriptAnalysis"": {
221+
""enable"": true
222222
}
223223
}
224224
}
@@ -550,8 +550,19 @@ await LanguageClient.SendRequest<RunspaceResponse[]>(
550550
}
551551

552552
[Fact]
553-
public async Task CanSendPesterCodeLensRequest()
553+
public async Task CanSendPesterLegacyCodeLensRequest()
554554
{
555+
// Make sure LegacyCodeLens is enabled because we'll need it in this test.
556+
LanguageClient.Workspace.DidChangeConfiguration(JObject.Parse(@"
557+
{
558+
""powershell"": {
559+
""pester"": {
560+
""useLegacyCodeLens"": true
561+
}
562+
}
563+
}
564+
"));
565+
555566
string filePath = NewTestFile(@"
556567
Describe 'DescribeName' {
557568
Context 'ContextName' {
@@ -597,6 +608,109 @@ public async Task CanSendPesterCodeLensRequest()
597608
});
598609
}
599610

611+
[Fact]
612+
public async Task CanSendPesterCodeLensRequest()
613+
{
614+
// Make sure Pester legacy CodeLens is disabled because we'll need it in this test.
615+
LanguageClient.Workspace.DidChangeConfiguration(JObject.Parse(@"
616+
{
617+
""powershell"": {
618+
""pester"": {
619+
""useLegacyCodeLens"": false
620+
}
621+
}
622+
}
623+
"));
624+
625+
string filePath = NewTestFile(@"
626+
Describe 'DescribeName' {
627+
Context 'ContextName' {
628+
It 'ItName' {
629+
1 | Should - Be 1
630+
}
631+
}
632+
}
633+
", isPester: true);
634+
635+
CodeLensContainer codeLenses = await LanguageClient.SendRequest<CodeLensContainer>(
636+
"textDocument/codeLens",
637+
new CodeLensParams
638+
{
639+
TextDocument = new TextDocumentIdentifier
640+
{
641+
Uri = new Uri(filePath)
642+
}
643+
});
644+
645+
Assert.Collection(codeLenses,
646+
codeLens =>
647+
{
648+
Range range = codeLens.Range;
649+
650+
Assert.Equal(1, range.Start.Line);
651+
Assert.Equal(0, range.Start.Character);
652+
Assert.Equal(7, range.End.Line);
653+
Assert.Equal(1, range.End.Character);
654+
655+
Assert.Equal("Run tests", codeLens.Command.Title);
656+
},
657+
codeLens =>
658+
{
659+
Range range = codeLens.Range;
660+
661+
Assert.Equal(1, range.Start.Line);
662+
Assert.Equal(0, range.Start.Character);
663+
Assert.Equal(7, range.End.Line);
664+
Assert.Equal(1, range.End.Character);
665+
666+
Assert.Equal("Debug tests", codeLens.Command.Title);
667+
},
668+
codeLens =>
669+
{
670+
Range range = codeLens.Range;
671+
672+
Assert.Equal(2, range.Start.Line);
673+
Assert.Equal(4, range.Start.Character);
674+
Assert.Equal(6, range.End.Line);
675+
Assert.Equal(5, range.End.Character);
676+
677+
Assert.Equal("Run tests", codeLens.Command.Title);
678+
},
679+
codeLens =>
680+
{
681+
Range range = codeLens.Range;
682+
683+
Assert.Equal(2, range.Start.Line);
684+
Assert.Equal(4, range.Start.Character);
685+
Assert.Equal(6, range.End.Line);
686+
Assert.Equal(5, range.End.Character);
687+
688+
Assert.Equal("Debug tests", codeLens.Command.Title);
689+
},
690+
codeLens =>
691+
{
692+
Range range = codeLens.Range;
693+
694+
Assert.Equal(3, range.Start.Line);
695+
Assert.Equal(8, range.Start.Character);
696+
Assert.Equal(5, range.End.Line);
697+
Assert.Equal(9, range.End.Character);
698+
699+
Assert.Equal("Run test", codeLens.Command.Title);
700+
},
701+
codeLens =>
702+
{
703+
Range range = codeLens.Range;
704+
705+
Assert.Equal(3, range.Start.Line);
706+
Assert.Equal(8, range.Start.Character);
707+
Assert.Equal(5, range.End.Line);
708+
Assert.Equal(9, range.End.Character);
709+
710+
Assert.Equal("Debug test", codeLens.Command.Title);
711+
});
712+
}
713+
600714
[Fact]
601715
public async Task CanSendReferencesCodeLensRequest()
602716
{

test/PowerShellEditorServices.Test/Language/LanguageServiceTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public LanguageServiceTests()
4646
var logger = NullLogger.Instance;
4747
powerShellContext = PowerShellContextFactory.Create(logger);
4848
workspace = new WorkspaceService(NullLoggerFactory.Instance);
49-
symbolsService = new SymbolsService(NullLoggerFactory.Instance, powerShellContext, workspace);
49+
symbolsService = new SymbolsService(NullLoggerFactory.Instance, powerShellContext, workspace, new ConfigurationService());
5050
completionHandler = new CompletionHandler(NullLoggerFactory.Instance, powerShellContext, workspace);
5151
}
5252

0 commit comments

Comments
 (0)