From 34e329bb344732034b728a9bb130c4299d581c4c Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Fri, 21 Sep 2018 10:53:49 +0100 Subject: [PATCH 1/9] Show 50% of users the Clone URL tab by default --- .../Dialog/Clone/RepositoryCloneViewModel.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs b/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs index c4a2581d51..cb052902df 100644 --- a/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs +++ b/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs @@ -23,6 +23,7 @@ public class RepositoryCloneViewModel : ViewModelBase, IRepositoryCloneViewModel readonly IOperatingSystem os; readonly IConnectionManager connectionManager; readonly IRepositoryCloneService service; + readonly IUsageService usageService; readonly IReadOnlyList tabs; string path; IRepositoryModel previousRepository; @@ -34,6 +35,7 @@ public RepositoryCloneViewModel( IOperatingSystem os, IConnectionManager connectionManager, IRepositoryCloneService service, + IUsageService usageService, IRepositorySelectViewModel gitHubTab, IRepositorySelectViewModel enterpriseTab, IRepositoryUrlViewModel urlTab) @@ -41,6 +43,7 @@ public RepositoryCloneViewModel( this.os = os; this.connectionManager = connectionManager; this.service = service; + this.usageService = usageService; GitHubTab = gitHubTab; EnterpriseTab = enterpriseTab; @@ -119,6 +122,20 @@ public async Task InitializeAsync(IConnection connection) } this.WhenAnyValue(x => x.SelectedTabIndex).Subscribe(x => tabs[x].Activate().Forget()); + + // Users in group A will see the URL tab by default + if (await IsGroupA().ConfigureAwait(false)) + { + SelectedTabIndex = 2; + } + } + + // Put 50% of users in group A + async Task IsGroupA() + { + var userGuid = await usageService.GetUserGuid().ConfigureAwait(false); + var lastByte = userGuid.ToByteArray().Last(); + return lastByte % 2 == 0; } void BrowseForDirectory() From dda7b756f86348be16119ece652776f9cda41e1c Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Fri, 21 Sep 2018 11:43:45 +0100 Subject: [PATCH 2/9] Add counters for tracking clone view Add the following counters for tracking the clone view being opened with different selected tabs: NumberOfCloneViewGitHubTab NumberOfCloneViewEnterpriseTab NumberOfCloneViewUrlTab --- .../Dialog/Clone/RepositoryCloneViewModel.cs | 16 ++++++++++++++++ src/GitHub.Exports/Models/UsageModel.cs | 3 +++ 2 files changed, 19 insertions(+) diff --git a/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs b/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs index cb052902df..5663e747af 100644 --- a/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs +++ b/src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs @@ -24,6 +24,7 @@ public class RepositoryCloneViewModel : ViewModelBase, IRepositoryCloneViewModel readonly IConnectionManager connectionManager; readonly IRepositoryCloneService service; readonly IUsageService usageService; + readonly IUsageTracker usageTracker; readonly IReadOnlyList tabs; string path; IRepositoryModel previousRepository; @@ -36,6 +37,7 @@ public RepositoryCloneViewModel( IConnectionManager connectionManager, IRepositoryCloneService service, IUsageService usageService, + IUsageTracker usageTracker, IRepositorySelectViewModel gitHubTab, IRepositorySelectViewModel enterpriseTab, IRepositoryUrlViewModel urlTab) @@ -44,6 +46,7 @@ public RepositoryCloneViewModel( this.connectionManager = connectionManager; this.service = service; this.usageService = usageService; + this.usageTracker = usageTracker; GitHubTab = gitHubTab; EnterpriseTab = enterpriseTab; @@ -128,6 +131,19 @@ public async Task InitializeAsync(IConnection connection) { SelectedTabIndex = 2; } + + switch (SelectedTabIndex) + { + case 0: + usageTracker.IncrementCounter(model => model.NumberOfCloneViewGitHubTab).Forget(); + break; + case 1: + usageTracker.IncrementCounter(model => model.NumberOfCloneViewEnterpriseTab).Forget(); + break; + case 2: + usageTracker.IncrementCounter(model => model.NumberOfCloneViewUrlTab).Forget(); + break; + } } // Put 50% of users in group A diff --git a/src/GitHub.Exports/Models/UsageModel.cs b/src/GitHub.Exports/Models/UsageModel.cs index 9710036028..188ed07c4d 100644 --- a/src/GitHub.Exports/Models/UsageModel.cs +++ b/src/GitHub.Exports/Models/UsageModel.cs @@ -86,6 +86,9 @@ public class MeasuresModel public int ExecuteToggleInlineCommentMarginCommand { get; set; } public int NumberOfPullRequestFileMarginToggleInlineCommentMargin { get; set; } public int NumberOfPullRequestFileMarginViewChanges { get; set; } + public int NumberOfCloneViewGitHubTab { get; set; } + public int NumberOfCloneViewEnterpriseTab { get; set; } + public int NumberOfCloneViewUrlTab { get; set; } } } } From 525c367d76e9474cb7627b87097ec42eb7bf28e8 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Fri, 21 Sep 2018 12:31:28 +0100 Subject: [PATCH 3/9] Fix existing tests --- .../Clone/RepositoryCloneViewModelTests.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs index 24ee79aa47..80676fe3df 100644 --- a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs +++ b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.Numerics; using System.Threading.Tasks; using GitHub.Extensions; using GitHub.Models; @@ -274,6 +275,8 @@ static RepositoryCloneViewModel CreateTarget( IOperatingSystem os = null, IConnectionManager connectionManager = null, IRepositoryCloneService service = null, + IUsageService usageService = null, + IUsageTracker usageTracker = null, IRepositorySelectViewModel gitHubTab = null, IRepositorySelectViewModel enterpriseTab = null, IRepositoryUrlViewModel urlTab = null, @@ -282,6 +285,8 @@ static RepositoryCloneViewModel CreateTarget( os = os ?? Substitute.For(); connectionManager = connectionManager ?? CreateConnectionManager("https://github.com"); service = service ?? CreateRepositoryCloneService(defaultClonePath); + usageService = CreateUsageService(); + usageTracker = Substitute.For(); gitHubTab = gitHubTab ?? CreateSelectViewModel(); enterpriseTab = enterpriseTab ?? CreateSelectViewModel(); urlTab = urlTab ?? Substitute.For(); @@ -290,11 +295,23 @@ static RepositoryCloneViewModel CreateTarget( os, connectionManager, service, + usageService, + usageTracker, gitHubTab, enterpriseTab, urlTab); } + static IUsageService CreateUsageService(bool isGroupA = false) + { + var usageService = Substitute.For(); + var guidBytes = new byte[16]; + guidBytes[guidBytes.Length - 1] = (byte)(isGroupA ? 0 : 1); + var userGuid = new Guid(guidBytes); + usageService.GetUserGuid().Returns(userGuid); + return usageService; + } + static IRepositoryModel CreateRepositoryModel(string repo = "owner/repo") { var split = repo.Split('/'); From e989fdf53071cacfc1dca0bf31cb98630730a3b5 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Fri, 21 Sep 2018 15:27:09 +0100 Subject: [PATCH 4/9] Add tests for default tab and counters Check the correct default tab is being selected and the NumberOfCloneView*Tab counters are being incremented. --- .../Clone/RepositoryCloneViewModelTests.cs | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs index 80676fe3df..92e33ebd63 100644 --- a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs +++ b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.Linq.Expressions; using System.Numerics; using System.Threading.Tasks; using GitHub.Extensions; @@ -27,6 +28,41 @@ public async Task GitHubPage_Is_Initialized() target.EnterpriseTab.DidNotReceiveWithAnyArgs().Initialize(null); } + [TestCase("https://github.com", false, 0)] + [TestCase("https://enterprise.com", false, 1)] + [TestCase("https://github.com", true, 2, Description = "Show URL tab for GitHub connections")] + [TestCase("https://enterprise.com", true, 2, Description = "Show URL tab for Enterprise connections")] + public async Task Default_SelectedTabIndex_For_Group(string address, bool isGroupA, int expectTabIndex) + { + var cm = CreateConnectionManager(address); + var connection = cm.Connections[0]; + var usageService = CreateUsageService(isGroupA); + var target = CreateTarget(connectionManager: cm, usageService: usageService); + + await target.InitializeAsync(connection); + + Assert.That(target.SelectedTabIndex, Is.EqualTo(expectTabIndex)); + } + + [TestCase("https://github.com", false, "model => model.NumberOfCloneViewGitHubTab")] + [TestCase("https://enterprise.com", false, "model => model.NumberOfCloneViewEnterpriseTab")] + [TestCase("https://github.com", true, "model => model.NumberOfCloneViewUrlTab")] + [TestCase("https://enterprise.com", true, "model => model.NumberOfCloneViewUrlTab")] + public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGroupA, string expressionString) + { + var cm = CreateConnectionManager(address); + var connection = cm.Connections[0]; + var usageService = CreateUsageService(isGroupA); + var usageTracker = Substitute.For(); + var target = CreateTarget(connectionManager: cm, usageService: usageService, usageTracker: usageTracker); + usageTracker.IncrementCounter(null).ReturnsForAnyArgs(Task.CompletedTask); + + await target.InitializeAsync(connection).ConfigureAwait(false); + + await usageTracker.Received(1).IncrementCounter(Arg.Is>>( + x => x.ToString() == expressionString)).ConfigureAwait(false); + } + [Test] public async Task EnterprisePage_Is_Initialized() { @@ -285,8 +321,8 @@ static RepositoryCloneViewModel CreateTarget( os = os ?? Substitute.For(); connectionManager = connectionManager ?? CreateConnectionManager("https://github.com"); service = service ?? CreateRepositoryCloneService(defaultClonePath); - usageService = CreateUsageService(); - usageTracker = Substitute.For(); + usageService = usageService ?? CreateUsageService(); + usageTracker = usageTracker ?? Substitute.For(); gitHubTab = gitHubTab ?? CreateSelectViewModel(); enterpriseTab = enterpriseTab ?? CreateSelectViewModel(); urlTab = urlTab ?? Substitute.For(); From 729c64fd3a59df56f2f5d36ba96ff922709b7928 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 21 Sep 2018 13:19:55 -0400 Subject: [PATCH 5/9] Allowing for a clearer assert exception if the test is incorrect --- .../Dialog/Clone/RepositoryCloneViewModelTests.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs index 92e33ebd63..6ae9414cbb 100644 --- a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs +++ b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Threading.Tasks; @@ -59,8 +60,9 @@ public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGr await target.InitializeAsync(connection).ConfigureAwait(false); - await usageTracker.Received(1).IncrementCounter(Arg.Is>>( - x => x.ToString() == expressionString)).ConfigureAwait(false); + await usageTracker.Received(1).IncrementCounter(Arg.Any>>()).ConfigureAwait(false); + var expression = (Expression>) usageTracker.ReceivedCalls().First().GetArguments()[0]; + Assert.AreEqual(expressionString, expression.ToString()); } [Test] From 8fa09e578faa331c2d7aa07e857797972eb2d72d Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Sat, 22 Sep 2018 09:12:47 +0100 Subject: [PATCH 6/9] Factor out GetIncrementedCounter Utility method to find the incremented counter as a string. --- .../Clone/RepositoryCloneViewModelTests.cs | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs index 6ae9414cbb..e763742d40 100644 --- a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs +++ b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs @@ -45,11 +45,11 @@ public async Task Default_SelectedTabIndex_For_Group(string address, bool isGrou Assert.That(target.SelectedTabIndex, Is.EqualTo(expectTabIndex)); } - [TestCase("https://github.com", false, "model => model.NumberOfCloneViewGitHubTab")] - [TestCase("https://enterprise.com", false, "model => model.NumberOfCloneViewEnterpriseTab")] - [TestCase("https://github.com", true, "model => model.NumberOfCloneViewUrlTab")] - [TestCase("https://enterprise.com", true, "model => model.NumberOfCloneViewUrlTab")] - public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGroupA, string expressionString) + [TestCase("https://github.com", false, nameof(UsageModel.MeasuresModel.NumberOfCloneViewGitHubTab))] + [TestCase("https://enterprise.com", false, nameof(UsageModel.MeasuresModel.NumberOfCloneViewEnterpriseTab))] + [TestCase("https://github.com", true, nameof(UsageModel.MeasuresModel.NumberOfCloneViewUrlTab))] + [TestCase("https://enterprise.com", true, nameof(UsageModel.MeasuresModel.NumberOfCloneViewUrlTab))] + public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGroupA, string expectCounter) { var cm = CreateConnectionManager(address); var connection = cm.Connections[0]; @@ -60,9 +60,8 @@ public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGr await target.InitializeAsync(connection).ConfigureAwait(false); - await usageTracker.Received(1).IncrementCounter(Arg.Any>>()).ConfigureAwait(false); - var expression = (Expression>) usageTracker.ReceivedCalls().First().GetArguments()[0]; - Assert.AreEqual(expressionString, expression.ToString()); + var counter = await GetIncrementedCounter(usageTracker); + Assert.That(counter, Is.EqualTo(expectCounter)); } [Test] @@ -364,5 +363,13 @@ static IRepositoryModel CreateRepositoryModel(string owner, string name) repository.Name.Returns(name); return repository; } + + static async Task GetIncrementedCounter(IUsageTracker usageTracker) + { + await usageTracker.Received(1).IncrementCounter(Arg.Any>>()).ConfigureAwait(false); + var expression = (Expression>)usageTracker.ReceivedCalls().First().GetArguments()[0]; + var counter = ((MemberExpression)expression.Body).Member.Name; + return counter; + } } } From bc912491e39b83d56264e309366421c252542304 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Mon, 24 Sep 2018 12:01:17 +0100 Subject: [PATCH 7/9] Add tests for NumberOfGitHub/EnterpriseClones Check NumberOfGitHubClones and NumberOfEnterpriseClones are being incremented separately. Expect failing tests on this commit. --- src/GitHub.Exports/Models/UsageModel.cs | 2 ++ .../Services/RepositoryCloneServiceTests.cs | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/GitHub.Exports/Models/UsageModel.cs b/src/GitHub.Exports/Models/UsageModel.cs index 188ed07c4d..153ae29ffa 100644 --- a/src/GitHub.Exports/Models/UsageModel.cs +++ b/src/GitHub.Exports/Models/UsageModel.cs @@ -89,6 +89,8 @@ public class MeasuresModel public int NumberOfCloneViewGitHubTab { get; set; } public int NumberOfCloneViewEnterpriseTab { get; set; } public int NumberOfCloneViewUrlTab { get; set; } + public int NumberOfGitHubClones { get; set; } + public int NumberOfEnterpriseClones { get; set; } } } } diff --git a/test/GitHub.App.UnitTests/Services/RepositoryCloneServiceTests.cs b/test/GitHub.App.UnitTests/Services/RepositoryCloneServiceTests.cs index df79afd538..be052fe40e 100644 --- a/test/GitHub.App.UnitTests/Services/RepositoryCloneServiceTests.cs +++ b/test/GitHub.App.UnitTests/Services/RepositoryCloneServiceTests.cs @@ -27,8 +27,13 @@ public async Task ClonesToRepositoryPathAsync() await vsGitServices.Received().Clone("https://github.com/foo/bar", @"c:\dev\bar", true); } - [Test] - public async Task UpdatesMetricsWhenRepositoryClonedAsync() + [TestCase("https://github.com/foo/bar", 1, nameof(UsageModel.MeasuresModel.NumberOfClones))] + [TestCase("https://github.com/foo/bar", 1, nameof(UsageModel.MeasuresModel.NumberOfGitHubClones))] + [TestCase("https://github.com/foo/bar", 0, nameof(UsageModel.MeasuresModel.NumberOfEnterpriseClones))] + [TestCase("https://enterprise.com/foo/bar", 1, nameof(UsageModel.MeasuresModel.NumberOfClones))] + [TestCase("https://enterprise.com/foo/bar", 1, nameof(UsageModel.MeasuresModel.NumberOfEnterpriseClones))] + [TestCase("https://enterprise.com/foo/bar", 0, nameof(UsageModel.MeasuresModel.NumberOfGitHubClones))] + public async Task UpdatesMetricsWhenRepositoryClonedAsync(string cloneUrl, int numberOfCalls, string counterName) { var serviceProvider = Substitutes.ServiceProvider; var operatingSystem = serviceProvider.GetOperatingSystem(); @@ -37,12 +42,12 @@ public async Task UpdatesMetricsWhenRepositoryClonedAsync() var usageTracker = Substitute.For(); var cloneService = new RepositoryCloneService(operatingSystem, vsGitServices, graphqlFactory, usageTracker); - await cloneService.CloneRepository("https://github.com/foo/bar", @"c:\dev\bar"); + await cloneService.CloneRepository(cloneUrl, @"c:\dev\bar"); var model = UsageModel.Create(Guid.NewGuid()); - await usageTracker.Received().IncrementCounter( + await usageTracker.Received(numberOfCalls).IncrementCounter( Arg.Is>>(x => - ((MemberExpression)x.Body).Member.Name == nameof(model.Measures.NumberOfClones))); + ((MemberExpression)x.Body).Member.Name == counterName)); } } } From b1e6fe12b30aca6bf11bbbbb39974fe12917a07d Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Mon, 24 Sep 2018 12:10:39 +0100 Subject: [PATCH 8/9] Increment counters NumberOfGitHub/EnterpriseClones Record GitHub and GitHub Enterprise clones separately. --- src/GitHub.App/Services/RepositoryCloneService.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/GitHub.App/Services/RepositoryCloneService.cs b/src/GitHub.App/Services/RepositoryCloneService.cs index 8ef95e0215..99e67e679d 100644 --- a/src/GitHub.App/Services/RepositoryCloneService.cs +++ b/src/GitHub.App/Services/RepositoryCloneService.cs @@ -121,7 +121,20 @@ public async Task CloneRepository( try { await vsGitServices.Clone(cloneUrl, repositoryPath, true, progress); + await usageTracker.IncrementCounter(x => x.NumberOfClones); + + var repositoryUrl = new UriString(cloneUrl).ToRepositoryUrl(); + var isDotCom = HostAddress.IsGitHubDotComUri(repositoryUrl); + if (isDotCom) + { + await usageTracker.IncrementCounter(x => x.NumberOfGitHubClones); + } + else + { + // If it isn't a GitHub URL, assume it's an Enterprise URL + await usageTracker.IncrementCounter(x => x.NumberOfEnterpriseClones); + } } catch (Exception ex) { From ffc52b86dba13cb44c3c372592d52418feda5731 Mon Sep 17 00:00:00 2001 From: Jamie Cansdale Date: Mon, 24 Sep 2018 12:41:08 +0100 Subject: [PATCH 9/9] Simplify IncrementCounter assert When the assert fails it will look like this: ``` Test 'IncrementCounter_Showing_Default_Tab("https://enterprise.com",True,1,"xxx")' failed: NSubstitute.Exceptions.ReceivedCallsException : Expected to receive exactly 1 call matching: IncrementCounter(x => (Convert(x.Body).Member.Name == value(GitHub.App.UnitTests.ViewModels.Dialog.Clone.RepositoryCloneViewModelTests+<>c__DisplayClass2_0).counterName)) Actually received no matching calls. Received 1 non-matching call (non-matching arguments indicated with '*' characters): IncrementCounter(*model => model.NumberOfCloneViewUrlTab*) ``` --- .../Clone/RepositoryCloneViewModelTests.cs | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs index e763742d40..a04d351ecf 100644 --- a/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs +++ b/test/GitHub.App.UnitTests/ViewModels/Dialog/Clone/RepositoryCloneViewModelTests.cs @@ -45,11 +45,11 @@ public async Task Default_SelectedTabIndex_For_Group(string address, bool isGrou Assert.That(target.SelectedTabIndex, Is.EqualTo(expectTabIndex)); } - [TestCase("https://github.com", false, nameof(UsageModel.MeasuresModel.NumberOfCloneViewGitHubTab))] - [TestCase("https://enterprise.com", false, nameof(UsageModel.MeasuresModel.NumberOfCloneViewEnterpriseTab))] - [TestCase("https://github.com", true, nameof(UsageModel.MeasuresModel.NumberOfCloneViewUrlTab))] - [TestCase("https://enterprise.com", true, nameof(UsageModel.MeasuresModel.NumberOfCloneViewUrlTab))] - public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGroupA, string expectCounter) + [TestCase("https://github.com", false, 1, nameof(UsageModel.MeasuresModel.NumberOfCloneViewGitHubTab))] + [TestCase("https://enterprise.com", false, 1, nameof(UsageModel.MeasuresModel.NumberOfCloneViewEnterpriseTab))] + [TestCase("https://github.com", true, 1, nameof(UsageModel.MeasuresModel.NumberOfCloneViewUrlTab))] + [TestCase("https://enterprise.com", true, 1, nameof(UsageModel.MeasuresModel.NumberOfCloneViewUrlTab))] + public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGroupA, int numberOfCalls, string counterName) { var cm = CreateConnectionManager(address); var connection = cm.Connections[0]; @@ -60,8 +60,9 @@ public async Task IncrementCounter_Showing_Default_Tab(string address, bool isGr await target.InitializeAsync(connection).ConfigureAwait(false); - var counter = await GetIncrementedCounter(usageTracker); - Assert.That(counter, Is.EqualTo(expectCounter)); + await usageTracker.Received(numberOfCalls).IncrementCounter( + Arg.Is>>(x => + ((MemberExpression)x.Body).Member.Name == counterName)); } [Test] @@ -363,13 +364,5 @@ static IRepositoryModel CreateRepositoryModel(string owner, string name) repository.Name.Returns(name); return repository; } - - static async Task GetIncrementedCounter(IUsageTracker usageTracker) - { - await usageTracker.Received(1).IncrementCounter(Arg.Any>>()).ConfigureAwait(false); - var expression = (Expression>)usageTracker.ReceivedCalls().First().GetArguments()[0]; - var counter = ((MemberExpression)expression.Body).Member.Name; - return counter; - } } }