Skip to content

Commit 42cde77

Browse files
Fix SubAccountIds in UserResult
1 parent a3a4d38 commit 42cde77

File tree

8 files changed

+110
-32
lines changed

8 files changed

+110
-32
lines changed

Shared.IntegrationTests/Provisioning/AccountApi/AccountProvisioningAsyncTest.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ public class AccountProvisioningAsyncTest : ProvisioningIntegrationTestBase
1212
public async Task TestUpdateSubAccount()
1313
{
1414
const string newName = "new-test-name-async";
15-
var updateSubAccountParams = new UpdateSubAccountParams(m_cloudId)
15+
var updateSubAccountParams = new UpdateSubAccountParams(m_cloudId1)
1616
{
1717
CloudName = newName
1818
};
1919
await AccountProvisioning.UpdateSubAccountAsync(updateSubAccountParams);
2020

21-
var result = await AccountProvisioning.SubAccountAsync(m_cloudId);
21+
var result = await AccountProvisioning.SubAccountAsync(m_cloudId1);
2222

2323
Assert.AreEqual(newName, result.CloudName);
2424
}
@@ -33,15 +33,15 @@ public async Task TestGetAllSubAccounts()
3333

3434
var result = await AccountProvisioning.SubAccountsAsync(listSubAccountsParams);
3535

36-
Assert.NotNull(result.SubAccounts.FirstOrDefault(subAccount => subAccount.Id == m_cloudId));
36+
Assert.NotNull(result.SubAccounts.FirstOrDefault(subAccount => subAccount.Id == m_cloudId1));
3737
}
3838

3939
[Test]
4040
public async Task TestGetSpecificSubAccount()
4141
{
42-
var result = await AccountProvisioning.SubAccountAsync(m_cloudId);
42+
var result = await AccountProvisioning.SubAccountAsync(m_cloudId1);
4343

44-
Assert.AreEqual(m_cloudId, result.Id);
44+
Assert.AreEqual(m_cloudId1, result.Id);
4545
}
4646

4747
[Test]
@@ -52,12 +52,15 @@ public async Task TestUpdateUser()
5252
var updateUserParams = new UpdateUserParams(m_userId1)
5353
{
5454
Email = newEmailAddress,
55-
Name = newName
55+
Name = newName,
56+
SubAccountIds = new List<string> {m_cloudId1, m_cloudId2}
5657
};
5758

5859
var updateUserResult = await AccountProvisioning.UpdateUserAsync(updateUserParams);
5960
Assert.AreEqual(newName, updateUserResult.Name);
6061
Assert.AreEqual(newEmailAddress, updateUserResult.Email);
62+
Assert.AreEqual(2, updateUserResult.SubAccountIds.Length);
63+
Assert.That( new[] {m_cloudId1, m_cloudId2}, Is.EquivalentTo( updateUserResult.SubAccountIds ) );
6164

6265
var getUserResult = await AccountProvisioning.UserAsync(m_userId1);
6366
Assert.AreEqual(m_userId1, getUserResult.Id);

Shared.IntegrationTests/Provisioning/AccountApi/AccountProvisioningTest.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ public class AccountProvisioningTest : ProvisioningIntegrationTestBase
1212
public void TestUpdateSubAccount()
1313
{
1414
const string newName = "new-test-name";
15-
var updateSubAccountParams = new UpdateSubAccountParams(m_cloudId)
15+
var updateSubAccountParams = new UpdateSubAccountParams(m_cloudId1)
1616
{
1717
CloudName = newName
1818

1919
};
2020
AccountProvisioning.UpdateSubAccount(updateSubAccountParams);
2121

22-
var result = AccountProvisioning.SubAccount(m_cloudId);
22+
var result = AccountProvisioning.SubAccount(m_cloudId1);
2323

2424
Assert.AreEqual(newName, result.CloudName);
2525
}
@@ -34,15 +34,15 @@ public void TestGetAllSubAccounts()
3434

3535
var result = AccountProvisioning.SubAccounts(listSubAccountsParams);
3636

37-
Assert.NotNull(result.SubAccounts.FirstOrDefault(subAccount => subAccount.Id == m_cloudId));
37+
Assert.NotNull(result.SubAccounts.FirstOrDefault(subAccount => subAccount.Id == m_cloudId1));
3838
}
3939

4040
[Test]
4141
public void TestGetSpecificSubAccount()
4242
{
43-
var result = AccountProvisioning.SubAccount(m_cloudId);
43+
var result = AccountProvisioning.SubAccount(m_cloudId1);
4444

45-
Assert.AreEqual(m_cloudId, result.Id);
45+
Assert.AreEqual(m_cloudId1, result.Id);
4646
}
4747

4848
[Test]
@@ -54,6 +54,7 @@ public void TestUpdateUser()
5454
{
5555
Email = newEmailAddress,
5656
Name = newName
57+
5758
};
5859

5960
var updateUserResult = AccountProvisioning.UpdateUser(updateUserParams);
@@ -152,7 +153,7 @@ public void TestGetUsersBySubAccountId()
152153
{
153154
Pending = true,
154155
Prefix = m_userName2,
155-
SubAccountId = m_cloudId
156+
SubAccountId = m_cloudId1
156157
};
157158

158159
var result = AccountProvisioning.Users(listUsersParams);

Shared.IntegrationTests/Provisioning/ProvisioningIntegrationTestBase.cs

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Net;
1+
using System.Collections.Generic;
2+
using System.Net;
23
using CloudinaryDotNet.Actions;
34
using CloudinaryDotNet.Provisioning;
45
using NUnit.Framework;
@@ -13,7 +14,8 @@ public class ProvisioningIntegrationTestBase
1314
protected string m_userName2;
1415
protected string m_userEmail1;
1516
protected string m_userEmail2;
16-
protected string m_cloudId;
17+
protected string m_cloudId1;
18+
protected string m_cloudId2;
1719
protected string m_userId1;
1820
protected string m_userId2;
1921
protected string m_groupId;
@@ -33,17 +35,12 @@ public void Initialize()
3335

3436
// Create a sub account(sub cloud)
3537
m_timestampSuffix = Utils.UnixTimeNowSeconds();
36-
var subAccountName = $"jutaname{m_timestampSuffix}";
37-
var createSubAccountParams = new CreateSubAccountParams(subAccountName)
38-
{
39-
CloudName = subAccountName
40-
};
41-
var createSubAccountResult = AccountProvisioning.CreateSubAccountAsync(createSubAccountParams)
42-
.GetAwaiter().GetResult();
4338

44-
Assert.AreEqual(HttpStatusCode.OK, createSubAccountResult.StatusCode);
39+
var subAccount1Name = $"jutaname{m_timestampSuffix}";
40+
var subAccount2Name = $"jutaname2{m_timestampSuffix}";
4541

46-
m_cloudId = createSubAccountResult.Id;
42+
m_cloudId1 = CreateSubAccount(subAccount1Name);
43+
m_cloudId2 = CreateSubAccount(subAccount2Name);
4744

4845
// Create users
4946
m_userName1 = $"SDK TEST {m_timestampSuffix}";
@@ -58,28 +55,48 @@ public void Initialize()
5855
var userGroupName = $"test-group-{m_timestampSuffix}";
5956
var createUserGroupParams = new CreateUserGroupParams(userGroupName);
6057
var createUserGroupResult = AccountProvisioning.CreateUserGroupAsync(createUserGroupParams).GetAwaiter().GetResult();
61-
58+
6259
Assert.AreEqual(HttpStatusCode.OK, createUserGroupResult.StatusCode);
63-
60+
6461
m_groupId = createUserGroupResult.GroupId;
6562
}
6663

6764
[OneTimeTearDown]
6865
public void Cleanup()
6966
{
70-
AccountProvisioning.DeleteSubAccount(m_cloudId);
67+
AccountProvisioning.DeleteSubAccount(m_cloudId1);
68+
AccountProvisioning.DeleteSubAccount(m_cloudId2);
7169
AccountProvisioning.DeleteUser(m_userId1);
7270
AccountProvisioning.DeleteUser(m_userId2);
7371
AccountProvisioning.DeleteUserGroup(m_groupId);
7472
}
7573

7674
private string CreateUser(string userName, string userEmail)
7775
{
78-
var createUserParams = new CreateUserParams(userName, userEmail, m_userRole);
76+
var createUserParams = new CreateUserParams(userName, userEmail, m_userRole)
77+
{
78+
SubAccountIds = new List<string> {m_cloudId1}
79+
};
7980
var createUserResult = AccountProvisioning.CreateUserAsync(createUserParams).GetAwaiter().GetResult();
8081
Assert.AreEqual(HttpStatusCode.OK, createUserResult.StatusCode);
82+
Assert.AreEqual(1, createUserResult.SubAccountIds.Length);
83+
Assert.AreEqual(m_cloudId1, createUserResult.SubAccountIds[0]);
8184

8285
return createUserResult.Id;
8386
}
87+
88+
private string CreateSubAccount(string subAccountName)
89+
{
90+
var createSubAccountParams = new CreateSubAccountParams(subAccountName)
91+
{
92+
CloudName = subAccountName
93+
};
94+
var createSubAccountResult = AccountProvisioning.CreateSubAccountAsync(createSubAccountParams)
95+
.GetAwaiter().GetResult();
96+
97+
Assert.AreEqual(HttpStatusCode.OK, createSubAccountResult.StatusCode);
98+
99+
return createSubAccountResult.Id;
100+
}
84101
}
85102
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
namespace CloudinaryDotNet.Actions
2+
{
3+
using System;
4+
using System.Collections.Generic;
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Linq;
7+
8+
/// <summary>
9+
/// Custom JSON converter to safely parse array values that might come as strings.
10+
/// </summary>
11+
public class SafeArrayConverter : JsonConverter
12+
{
13+
/// <summary>
14+
/// Gets a value indicating whether this <see cref="SafeArrayConverter"/> can write JSON.
15+
/// </summary>
16+
public override bool CanWrite => false;
17+
18+
/// <summary>
19+
/// Reads the JSON representation of the object.
20+
/// </summary>
21+
/// <param name="reader">The <see cref="JsonReader"/> to read from.</param>
22+
/// <param name="objectType">Type of the object.</param>
23+
/// <param name="existingValue">The existing value of object being read.</param>
24+
/// <param name="serializer">The calling serializer.</param>
25+
/// <returns>The object value.</returns>
26+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
27+
{
28+
var token = JToken.Load(reader);
29+
return token.Type == JTokenType.Array ? token.ToObject<string[]>() : token.ToString().Split(',');
30+
}
31+
32+
/// <summary>
33+
/// Determines whether this instance can convert the specified object type.
34+
/// </summary>
35+
/// <param name="objectType">Type of the object.</param>
36+
/// <returns>True if this instance can convert the specified object type; otherwise, false.</returns>
37+
public override bool CanConvert(Type objectType)
38+
{
39+
return objectType == typeof(string) || objectType == typeof(string[]);
40+
}
41+
42+
/// <summary>
43+
/// Writes the JSON representation of the object.
44+
/// </summary>
45+
/// <param name="writer">The <see cref="JsonWriter"/> to write to.</param>
46+
/// <param name="existingValue">The value.</param>
47+
/// <param name="serializer">The calling serializer.</param>
48+
public override void WriteJson(JsonWriter writer, object existingValue, JsonSerializer serializer)
49+
{
50+
throw new NotImplementedException("Unnecessary because of using just for Deserialization");
51+
}
52+
}
53+
}

Shared/Actions/AssetsUpload/NestedTypes/AccessControlRule.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ public class AccessControlRule
3737
public AccessType AccessType { get; set; }
3838

3939
/// <summary>
40-
/// Gets or sets start date that defines when the asset is publically available.
40+
/// Gets or sets start date that defines when the asset is publicly available.
4141
/// </summary>
4242
[JsonProperty(PropertyName = "start", NullValueHandling=NullValueHandling.Ignore)]
4343
public DateTime? Start { get; set; }
4444

4545
/// <summary>
46-
/// Gets or sets end date that defines when the asset is publically available.
46+
/// Gets or sets end date that defines when the asset is publicly available.
4747
/// </summary>
4848
[JsonProperty(PropertyName = "end", NullValueHandling=NullValueHandling.Ignore)]
4949
public DateTime? End { get; set; }

Shared/Actions/StreamingProfiles/RepresentationsConverter.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
3131

3232
var transformation = new Transformation();
3333
var transformationsResponse = JArray.Load(reader);
34-
if (transformationsResponse != null && transformationsResponse.Count > 0)
34+
if (transformationsResponse.Count > 0)
3535
{
36-
foreach (JProperty jTransformProperty in transformationsResponse[0])
36+
foreach (var jToken in transformationsResponse[0])
3737
{
38+
var jTransformProperty = (JProperty)jToken;
3839
transformation.Add(jTransformProperty.Name, jTransformProperty.Value);
3940
}
4041
}
@@ -51,4 +52,4 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
5152
writer.WriteValue(((Transformation)value).ToString());
5253
}
5354
}
54-
}
55+
}

Shared/Provisioning/Actions/UserResult.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ namespace CloudinaryDotNet.Actions
22
{
33
using System;
44
using System.Runtime.Serialization;
5+
using Newtonsoft.Json;
56

67
/// <summary>
78
/// Detailed information about user.
@@ -50,6 +51,7 @@ public class UserResult : BaseResult
5051
/// <summary>
5152
/// Gets or sets a list of sub-accounts to which the user has access.
5253
/// </summary>
54+
[JsonConverter(typeof(SafeArrayConverter))]
5355
[DataMember(Name = "sub_account_ids")]
5456
public string[] SubAccountIds { get; set; }
5557

Shared/Shared.projitems

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
<Compile Include="$(MSBuildThisFileDirectory)Actions\AssetsManagement\NestedTypes\RekognitionFace.cs" />
4141
<Compile Include="$(MSBuildThisFileDirectory)Actions\AssetsManagement\NestedTypes\Resource.cs" />
4242
<Compile Include="$(MSBuildThisFileDirectory)Actions\AssetsManagement\NestedTypes\RestoredResource.cs" />
43+
<Compile Include="$(MSBuildThisFileDirectory)Actions\AssetsManagement\NestedTypes\SafeArrayConverter.cs" />
4344
<Compile Include="$(MSBuildThisFileDirectory)Actions\AssetsManagement\NestedTypes\Size.cs" />
4445
<Compile Include="$(MSBuildThisFileDirectory)Actions\AssetsManagement\NestedTypes\Symbol.cs" />
4546
<Compile Include="$(MSBuildThisFileDirectory)Actions\AssetsManagement\NestedTypes\TextAnnotation.cs" />

0 commit comments

Comments
 (0)