Skip to content

Commit 2fb0fcc

Browse files
msJinLeiVeryEarly
andauthored
Retreive subscription by id from server if subscription id is provided (Azure#19762)
* Retreive subscription by id from server if subscription id is provided Azure#19115 * Fix failed test cases * Try to fix the test cases * Update ChangeLog.md Co-authored-by: Yabo Hu <[email protected]>
1 parent f42c95b commit 2fb0fcc

12 files changed

+587
-475
lines changed

src/Accounts/Accounts.Test/AzureRMProfileTests.cs

Lines changed: 101 additions & 55 deletions
Large diffs are not rendered by default.

src/Accounts/Accounts.Test/AzureRMProfileTestsForMultitenant.cs

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
using Microsoft.Azure.Commands.ScenarioTest;
2121
using Microsoft.Azure.Commands.TestFx.Mocks;
2222
using Microsoft.Azure.ServiceManagement.Common.Models;
23-
using Microsoft.WindowsAzure.Commands.Common.Test.Mocks;
23+
using Microsoft.Rest.Azure;
2424
using Microsoft.WindowsAzure.Commands.ScenarioTest;
2525
using Newtonsoft.Json.Linq;
2626
using System;
@@ -30,6 +30,9 @@
3030
using Xunit;
3131
using Xunit.Abstractions;
3232

33+
using SubscriptionLatest = Microsoft.Azure.Management.ResourceManager.Version2021_01_01.Models.Subscription;
34+
using SubscriptionOld = Microsoft.Azure.Internal.Subscriptions.Models.Subscription;
35+
3336
namespace Microsoft.Azure.Commands.ResourceManager.Common.Test
3437
{
3538
public class AzureRMProfileTestsForMultitenant : IDisposable
@@ -279,6 +282,7 @@ public void LoginByTenant()
279282
string subscriptionA = Guid.NewGuid().ToString()
280283
, subscriptionB = Guid.NewGuid().ToString()
281284
, subscriptionC = Guid.NewGuid().ToString();
285+
MockSubscriptionClientFactory.Reset();
282286
var clientFactory = new MockSubscriptionClientFactory();
283287

284288
Dictionary<string, string> subscriptionList = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -322,6 +326,7 @@ public void LoginBySubscriptionInMultitenantsHomeFirst()
322326
, subscriptionB = Guid.NewGuid().ToString()
323327
, subscriptionC = Guid.NewGuid().ToString()
324328
, subscriptionD = Guid.NewGuid().ToString();
329+
MockSubscriptionClientFactory.Reset();
325330
var clientFactory = new MockSubscriptionClientFactory();
326331

327332
var subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -365,6 +370,7 @@ public void LoginBySubscriptionInMultitenantsHomeSecond()
365370
, subscriptionB = Guid.NewGuid().ToString()
366371
, subscriptionC = Guid.NewGuid().ToString()
367372
, subscriptionD = Guid.NewGuid().ToString();
373+
MockSubscriptionClientFactory.Reset();
368374
var clientFactory = new MockSubscriptionClientFactory();
369375

370376
var tenantList = GetTenantsJson(tenantA, tenantB);
@@ -411,6 +417,7 @@ public void LoginBySubscriptionInManagedByTenants()
411417
, subscriptionB = Guid.NewGuid().ToString()
412418
, subscriptionC = Guid.NewGuid().ToString()
413419
, subscriptionD = Guid.NewGuid().ToString();
420+
MockSubscriptionClientFactory.Reset();
414421
var clientFactory = new MockSubscriptionClientFactory();
415422

416423
Dictionary<string, string> subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -455,6 +462,7 @@ public void LoginBySubscriptionTenant()
455462
, subscriptionB = Guid.NewGuid().ToString()
456463
, subscriptionC = Guid.NewGuid().ToString()
457464
, subscriptionD = Guid.NewGuid().ToString();
465+
MockSubscriptionClientFactory.Reset();
458466
var clientFactory = new MockSubscriptionClientFactory();
459467

460468
Dictionary<string, string> subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -498,6 +506,7 @@ public void LoginByTenantSubscriptionNotExist()
498506
, subscriptionB = Guid.NewGuid().ToString()
499507
, subscriptionC = Guid.NewGuid().ToString()
500508
, subscriptionD = Guid.NewGuid().ToString();
509+
MockSubscriptionClientFactory.Reset();
501510
var clientFactory = new MockSubscriptionClientFactory();
502511

503512
Dictionary<string, string> subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -539,6 +548,7 @@ public void LoginSubscriptionNameNotExist()
539548
, subscriptionB = Guid.NewGuid().ToString()
540549
, subscriptionC = Guid.NewGuid().ToString()
541550
, subscriptionD = Guid.NewGuid().ToString();
551+
MockSubscriptionClientFactory.Reset();
542552
var clientFactory = new MockSubscriptionClientFactory();
543553

544554
Dictionary<string, string> subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -577,6 +587,7 @@ public void SetContextByValidTenant()
577587
string subscriptionA = Guid.NewGuid().ToString()
578588
, subscriptionB = Guid.NewGuid().ToString()
579589
, subscriptionC = Guid.NewGuid().ToString();
590+
MockSubscriptionClientFactory.Reset();
580591
var clientFactory = new MockSubscriptionClientFactory();
581592

582593
Dictionary<string, string> subscriptionList = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -603,7 +614,6 @@ public void SetContextByValidTenant()
603614
Assert.Equal(subscriptionA, context.Subscription.Id.ToString());
604615
}
605616

606-
607617
[Fact]
608618
[Trait(Category.AcceptanceType, Category.CheckIn)]
609619
public void SetContextBySubscriptionIdInHomeTenant()
@@ -613,16 +623,29 @@ public void SetContextBySubscriptionIdInHomeTenant()
613623
, subscriptionB = Guid.NewGuid().ToString()
614624
, subscriptionC = Guid.NewGuid().ToString()
615625
, subscriptionD = Guid.NewGuid().ToString();
626+
MockSubscriptionClientFactory.Reset();
616627
var clientFactory = new MockSubscriptionClientFactory();
617628

618629
var subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
619630
var subscriptionListB = GetSecondTenantSubscriptionsJson(tenantB, subscriptionA, subscriptionB, subscriptionC, subscriptionD, tenantA);
631+
632+
MockSubscriptionClientFactory.SubGetQueueVerLatest = new Queue<Func<AzureOperationResponse<SubscriptionLatest>>>();
633+
MockSubscriptionClientFactory.SubGetQueueVerLatest.Enqueue(() =>
634+
{
635+
throw new CloudException("Subscription not in the tenant.");
636+
});
637+
638+
var resultLatest = new AzureOperationResponse<SubscriptionLatest>()
639+
{
640+
RequestId = Guid.NewGuid().ToString(),
641+
Body = MockSubscriptionClientFactory.CreateSubscripitonsFromJson(subscriptionListA[subscriptionA]).First()
642+
};
643+
MockSubscriptionClientFactory.SubGetQueueVerLatest.Enqueue(() => resultLatest);
644+
620645
subscriptionClients.Clear();
621646
subscriptionClients.Enqueue(clientFactory.GetSubscriptionClientVerLatest(
622-
MockSubscriptionClientFactory.CreateTenantListFromJson(GetTenantsJson(tenantA, tenantB).Values.ToArray())
623-
, null
624-
, MockSubscriptionClientFactory.CreateSubscriptionListsFromJson(subscriptionListB.Values.ToList(), subscriptionListA.Values.ToList())
625-
));
647+
MockSubscriptionClientFactory.CreateTenantListFromJson(GetTenantsJson(tenantB, tenantA).Values.ToArray())
648+
, null, null));
626649

627650
var mock = new AccountMockClientFactory(() =>
628651
{
@@ -648,6 +671,7 @@ public void SetContextBySubscriptionNameInHomeTenant()
648671
, subscriptionB = Guid.NewGuid().ToString()
649672
, subscriptionC = Guid.NewGuid().ToString()
650673
, subscriptionD = Guid.NewGuid().ToString();
674+
MockSubscriptionClientFactory.Reset();
651675
var clientFactory = new MockSubscriptionClientFactory();
652676

653677
var tenantList = GetTenantsJson(tenantA, tenantB);
@@ -660,6 +684,7 @@ public void SetContextBySubscriptionNameInHomeTenant()
660684
, MockSubscriptionClientFactory.CreateSubscriptionListsFromJson(subscriptionListA.Values.ToList(), subscriptionListB.Values.ToList())
661685
));
662686

687+
663688
var mock = new AccountMockClientFactory(() =>
664689
{
665690
return subscriptionClients.Peek();
@@ -685,16 +710,16 @@ public void SetContextBySubscriptionInManagedByTenants()
685710
, subscriptionB = Guid.NewGuid().ToString()
686711
, subscriptionC = Guid.NewGuid().ToString()
687712
, subscriptionD = Guid.NewGuid().ToString();
713+
MockSubscriptionClientFactory.Reset();
688714
var clientFactory = new MockSubscriptionClientFactory();
689715

690716
Dictionary<string, string> subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
691717
Dictionary<string, string> subscriptionListB = GetSecondTenantSubscriptionsJson(tenantB, subscriptionA, subscriptionB, subscriptionC, subscriptionD, tenantA);
692718
subscriptionClients.Clear();
693719
subscriptionClients.Enqueue(clientFactory.GetSubscriptionClientVerLatest(
694720
MockSubscriptionClientFactory.CreateTenantListFromJson(GetTenantsJson(tenantA, tenantB).Values.ToArray())
695-
, null
696-
, MockSubscriptionClientFactory.CreateSubscriptionListsFromJson(subscriptionListA.Values.ToList(), subscriptionListB.Values.ToList())
697-
));
721+
, MockSubscriptionClientFactory.CreateSubscripitonsFromJson(subscriptionListA[subscriptionC])
722+
, null));
698723

699724
var mock = new AccountMockClientFactory(() =>
700725
{
@@ -720,6 +745,7 @@ public void SetContextBySubscriptionTenant()
720745
, subscriptionB = Guid.NewGuid().ToString()
721746
, subscriptionC = Guid.NewGuid().ToString()
722747
, subscriptionD = Guid.NewGuid().ToString();
748+
MockSubscriptionClientFactory.Reset();
723749
var clientFactory = new MockSubscriptionClientFactory();
724750

725751
Dictionary<string, string> subscriptionListA = GetFirstTenantSubscriptionsJson(tenantA, subscriptionA, subscriptionB, subscriptionC, tenantB);
@@ -755,15 +781,12 @@ public void SetContextBySubscriptionTenantNotExist()
755781
, subscriptionB = Guid.NewGuid().ToString()
756782
, subscriptionC = Guid.NewGuid().ToString()
757783
, subscriptionD = Guid.NewGuid().ToString();
784+
MockSubscriptionClientFactory.Reset();
758785
var clientFactory = new MockSubscriptionClientFactory();
759786

760787
Dictionary<string, string> subscriptionListB = GetSecondTenantSubscriptionsJson(tenantB, subscriptionA, subscriptionB, subscriptionC, subscriptionD, tenantA);
761788
subscriptionClients.Clear();
762-
subscriptionClients.Enqueue(clientFactory.GetSubscriptionClientVerLatest(
763-
null
764-
, null
765-
, MockSubscriptionClientFactory.CreateSubscriptionListsFromJson(subscriptionListB.Values.ToList())
766-
));
789+
subscriptionClients.Enqueue(clientFactory.GetSubscriptionClientVerLatest(null, null, null));
767790

768791
var mock = new AccountMockClientFactory(() =>
769792
{

src/Accounts/Accounts.Test/Mocks/MockSubscriptionClientFactory.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ public MockSubscriptionClientFactory()
5252
{
5353
}
5454

55+
public static void Reset()
56+
{
57+
_getAsyncQueueVer2016?.Clear();
58+
_listAsyncQueueVer2016?.Clear();
59+
SubGetQueueVerLatest?.Clear();
60+
SubListQueueVerLatest?.Clear();
61+
TenantListQueueVerLatest?.Clear();
62+
63+
}
64+
5565
public static string GetTenantDomainFromId(string id)
5666
{
5767
return id.Substring(3)+".com";

src/Accounts/Accounts.Test/Mocks/MockSubscriptionClientFactoryVersion2016.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public SubscriptionClient GetSubscriptionClientVer2016()
4545
.Returns(
4646
(Dictionary<string, List<string>> ch, CancellationToken token) =>
4747
{
48-
var tenants = _tenants.Select((k) => new TenantIdDescription(id: k, tenantId: k));
48+
var tenants = _tenants?.Select((k) => new TenantIdDescription(id: k, tenantId: k));
4949
var mockPage = new MockPage<TenantIdDescription>(tenants.ToList());
5050

5151
AzureOperationResponse<IPage<TenantIdDescription>> r = new AzureOperationResponse<IPage<TenantIdDescription>>

src/Accounts/Accounts.Test/Mocks/MockSubscriptionClientFactoryVersion2019.cs

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,16 @@ private ITenantsOperations GetTenantMock(List<TenantIdDescription> tenants)
164164
{
165165
return ListTenantQueueDequeueVerLatest();
166166
}
167-
var mockPage = new MockPage<TenantIdDescription>(tenants);
168167

169-
AzureOperationResponse<IPage<TenantIdDescription>> r = new AzureOperationResponse<IPage<TenantIdDescription>>
168+
AzureOperationResponse<IPage<TenantIdDescription>> r = null;
169+
if (tenants != null)
170170
{
171-
Body = mockPage
172-
};
173-
171+
var mockPage = new MockPage<TenantIdDescription>(tenants);
172+
r = new AzureOperationResponse<IPage<TenantIdDescription>>
173+
{
174+
Body = mockPage
175+
};
176+
}
174177
return Task.FromResult(r);
175178
}
176179
);
@@ -184,28 +187,26 @@ private ISubscriptionsOperations GetSubscriptionMock(List<Subscription> subscrip
184187
HasNextPage = Enumerable.Repeat(false, subscriptionListLists.Count).ToList();
185188
}
186189
var subscriptionMock = new Mock<ISubscriptionsOperations>();
187-
if (subscriptionGetList != null)
188-
{
189-
subscriptionMock.Setup(
190-
s => s.GetWithHttpMessagesAsync(It.IsAny<string>(), It.IsAny<Dictionary<string, List<string>>>(), It.IsAny<CancellationToken>())).Returns(
191-
(string subId, Dictionary<string, List<string>> ch, CancellationToken token) =>
190+
subscriptionMock.Setup(
191+
s => s.GetWithHttpMessagesAsync(It.IsAny<string>(), It.IsAny<Dictionary<string, List<string>>>(), It.IsAny<CancellationToken>())).Returns(
192+
(string subId, Dictionary<string, List<string>> ch, CancellationToken token) =>
193+
{
194+
if (SubGetQueueVerLatest != null && SubGetQueueVerLatest.Any())
192195
{
193-
if (SubGetQueueVerLatest != null && SubGetQueueVerLatest.Any())
194-
{
195-
return GetSubQueueDequeueVerLatest();
196-
}
197-
AzureOperationResponse<Subscription> result = new AzureOperationResponse<Subscription>()
198-
{
199-
RequestId = Guid.NewGuid().ToString()
200-
};
201-
if (subscriptionGetList.Any())
202-
{
203-
result.Body = subscriptionGetList.First();
204-
subscriptionGetList.RemoveAt(0);
205-
}
206-
return Task.FromResult(result);
207-
});
208-
}
196+
return GetSubQueueDequeueVerLatest();
197+
}
198+
if (subscriptionGetList == null || !subscriptionGetList.Any())
199+
{
200+
throw new CloudException("Subscripiton is not in the tenant.");
201+
}
202+
var result = new AzureOperationResponse<Subscription>()
203+
{
204+
RequestId = Guid.NewGuid().ToString(),
205+
Body = subscriptionGetList.First()
206+
};
207+
subscriptionGetList.RemoveAt(0);
208+
return Task.FromResult(result);
209+
});
209210
subscriptionMock.Setup(
210211
(s) => s.ListWithHttpMessagesAsync(null, It.IsAny<CancellationToken>())).Returns(
211212
(Dictionary<string, List<string>> ch, CancellationToken token) =>
@@ -216,7 +217,7 @@ private ISubscriptionsOperations GetSubscriptionMock(List<Subscription> subscrip
216217
}
217218

218219
AzureOperationResponse<IPage<Subscription>> result = null;
219-
if (subscriptionListLists.Any() && HasNextPage.Any())
220+
if (subscriptionListLists!= null && subscriptionListLists.Any() && HasNextPage.Any())
220221
{
221222
result = new AzureOperationResponse<IPage<Subscription>>
222223
{
@@ -252,14 +253,8 @@ private ISubscriptionsOperations GetSubscriptionMock(List<Subscription> subscrip
252253
public SubscriptionClient GetSubscriptionClientVerLatest(List<TenantIdDescription> tenants, List<Subscription> subscriptionGetList, List<List<Subscription>> subscriptionListLists, List<bool> HasNextPage = null)
253254
{
254255
var client = new Mock<SubscriptionClient>() { CallBase = true };
255-
if (subscriptionGetList != null || subscriptionListLists != null)
256-
{
257-
client.SetupGet(c => c.Subscriptions).Returns(GetSubscriptionMock(subscriptionGetList, subscriptionListLists, HasNextPage));
258-
}
259-
if(tenants != null)
260-
{
261-
client.SetupGet(c => c.Tenants).Returns(GetTenantMock(tenants));
262-
}
256+
client.SetupGet(c => c.Subscriptions).Returns(GetSubscriptionMock(subscriptionGetList, subscriptionListLists, HasNextPage));
257+
client.SetupGet(c => c.Tenants).Returns(GetTenantMock(tenants));
263258
return client.Object;
264259
}
265260

0 commit comments

Comments
 (0)