Skip to content

Commit 1d4ab13

Browse files
authored
feat: Upgrade target framework from NET Standard 2.0 to .NET 6.0 (#393)
BREAKING CHANGE: This release requires .NET 6.0 or later and removes compatibility with NET Standard 2.0; Xamarin developers should migrate to .NET MAUI to use this version of the Parse SDK; Unity developers should use the previous SDK version until Unity supports .NET.
1 parent 2b5a9dd commit 1d4ab13

File tree

186 files changed

+15511
-12834
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

186 files changed

+15511
-12834
lines changed

.github/workflows/ci.yml

+9-4
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,22 @@ on:
88
paths-ignore:
99
- '**/**.md'
1010
jobs:
11-
check-ci:
11+
check-dotnet:
12+
strategy:
13+
matrix:
14+
DOTNET_VERSION: ['6.0', '7.0', '8.0', '9.0']
15+
fail-fast: false
16+
name: .NET ${{ matrix.DOTNET_VERSION }}
1217
runs-on: windows-latest
1318
steps:
1419
- name: Checkout repository
1520
uses: actions/checkout@v4
1621
- name: Set up .NET SDK
1722
uses: actions/setup-dotnet@v4
1823
with:
19-
dotnet-version: '6.x'
24+
dotnet-version: ${{ matrix.DOTNET_VERSION }}
2025
- name: Cache NuGet packages
21-
uses: actions/cache@v2
26+
uses: actions/cache@v4
2227
with:
2328
path: |
2429
~/.nuget/packages
@@ -36,7 +41,7 @@ jobs:
3641
run: dotnet build Parse.sln --configuration Debug --no-restore
3742
- name: Run tests with coverage
3843
run: |
39-
OpenCover.Console.exe -target:dotnet.exe -targetargs:"test --configuration Debug --test-adapter-path:. --logger:console /p:DebugType=full .\Parse.Tests\Parse.Tests.csproj" -filter:"+[Parse*]* -[Parse.Tests*]*" -oldstyle -output:parse_sdk_dotnet_coverage.xml -register:user
44+
OpenCover.Console.exe -target:dotnet.exe -targetargs:"test --framework net${{ matrix.DOTNET_VERSION }} --configuration Debug --test-adapter-path:. --logger:console /p:DebugType=full .\Parse.Tests\Parse.Tests.csproj" -filter:"+[Parse*]* -[Parse.Tests*]*" -oldstyle -output:parse_sdk_dotnet_coverage.xml -register:user
4045
- name: Upload code coverage
4146
uses: codecov/codecov-action@v4
4247
with:

Parse.Tests/ACLTests.cs

+117-45
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,130 @@
11
using System;
22
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using Moq; // Add Moq for mocking if not already added
34
using Parse.Infrastructure;
45
using Parse.Platform.Objects;
6+
using Parse.Abstractions.Infrastructure;
7+
using Parse.Abstractions.Platform.Objects;
58

6-
namespace Parse.Tests
9+
namespace Parse.Tests;
10+
11+
[TestClass]
12+
public class ACLTests
713
{
8-
[TestClass]
9-
public class ACLTests
14+
ParseClient Client { get; set; }
15+
16+
Mock<IServiceHub> ServiceHubMock { get; set; }
17+
Mock<IParseObjectClassController> ClassControllerMock { get; set; }
18+
19+
[TestInitialize]
20+
public void Initialize()
1021
{
11-
ParseClient Client { get; set; } = new ParseClient(new ServerConnectionData { Test = true });
22+
// Mock ServiceHub
23+
ServiceHubMock = new Mock<IServiceHub>();
24+
ClassControllerMock = new Mock<IParseObjectClassController>();
1225

13-
[TestInitialize]
14-
public void Initialize()
15-
{
16-
Client.AddValidClass<ParseUser>();
17-
Client.AddValidClass<ParseSession>();
18-
}
26+
// Mock ClassController behavior
27+
ServiceHubMock.Setup(hub => hub.ClassController).Returns(ClassControllerMock.Object);
1928

20-
[TestCleanup]
21-
public void Clean() => (Client.Services as ServiceHub).Reset();
29+
// Mock ClassController.Instantiate behavior
30+
ClassControllerMock.Setup(controller => controller.Instantiate(It.IsAny<string>(), It.IsAny<IServiceHub>()))
31+
.Returns<string, IServiceHub>((className, hub) =>
32+
{
33+
var user = new ParseUser();
34+
user.Bind(hub); // Ensure the object is bound to the service hub
35+
return user;
36+
});
2237

23-
[TestMethod]
24-
public void TestCheckPermissionsWithParseUserConstructor()
38+
// Set up ParseClient with the mocked ServiceHub
39+
Client = new ParseClient(new ServerConnectionData { Test = true })
2540
{
26-
ParseUser owner = GenerateUser("OwnerUser");
27-
ParseUser user = GenerateUser("OtherUser");
28-
ParseACL acl = new ParseACL(owner);
29-
Assert.IsTrue(acl.GetReadAccess(owner.ObjectId));
30-
Assert.IsTrue(acl.GetWriteAccess(owner.ObjectId));
31-
Assert.IsTrue(acl.GetReadAccess(owner));
32-
Assert.IsTrue(acl.GetWriteAccess(owner));
33-
}
34-
35-
[TestMethod]
36-
public void TestReadWriteMutationWithParseUserConstructor()
37-
{
38-
ParseUser owner = GenerateUser("OwnerUser");
39-
ParseUser otherUser = GenerateUser("OtherUser");
40-
ParseACL acl = new ParseACL(owner);
41-
acl.SetReadAccess(otherUser, true);
42-
acl.SetWriteAccess(otherUser, true);
43-
acl.SetReadAccess(owner.ObjectId, false);
44-
acl.SetWriteAccess(owner.ObjectId, false);
45-
Assert.IsTrue(acl.GetReadAccess(otherUser.ObjectId));
46-
Assert.IsTrue(acl.GetWriteAccess(otherUser.ObjectId));
47-
Assert.IsTrue(acl.GetReadAccess(otherUser));
48-
Assert.IsTrue(acl.GetWriteAccess(otherUser));
49-
Assert.IsFalse(acl.GetReadAccess(owner));
50-
Assert.IsFalse(acl.GetWriteAccess(owner));
51-
}
52-
53-
[TestMethod]
54-
public void TestParseACLCreationWithNullObjectIdParseUser() => Assert.ThrowsException<ArgumentException>(() => new ParseACL(GenerateUser(default)));
55-
56-
ParseUser GenerateUser(string objectID) => Client.GenerateObjectFromState<ParseUser>(new MutableObjectState { ObjectId = objectID }, "_User");
41+
Services = ServiceHubMock.Object
42+
};
43+
44+
// Publicize the client to set ParseClient.Instance
45+
Client.Publicize();
46+
47+
// Add valid classes to the client
48+
Client.AddValidClass<ParseUser>();
49+
Client.AddValidClass<ParseSession>();
50+
}
51+
52+
[TestCleanup]
53+
public void Clean() => (Client.Services as ServiceHub)?.Reset();
54+
55+
[TestMethod]
56+
public void TestCheckPermissionsWithParseUserConstructor()
57+
{
58+
// Arrange
59+
ParseUser owner = GenerateUser("OwnerUser");
60+
ParseUser user = GenerateUser("OtherUser");
61+
62+
// Act
63+
ParseACL acl = new ParseACL(owner);
64+
65+
// Assert
66+
Assert.IsTrue(acl.GetReadAccess(owner.ObjectId));
67+
Assert.IsTrue(acl.GetWriteAccess(owner.ObjectId));
68+
Assert.IsTrue(acl.GetReadAccess(owner));
69+
Assert.IsTrue(acl.GetWriteAccess(owner));
70+
}
71+
72+
[TestMethod]
73+
public void TestReadWriteMutationWithParseUserConstructor()
74+
{
75+
// Arrange
76+
ParseUser owner = GenerateUser("OwnerUser");
77+
ParseUser otherUser = GenerateUser("OtherUser");
78+
79+
// Act
80+
ParseACL acl = new ParseACL(owner);
81+
acl.SetReadAccess(otherUser, true);
82+
acl.SetWriteAccess(otherUser, true);
83+
acl.SetReadAccess(owner.ObjectId, false);
84+
acl.SetWriteAccess(owner.ObjectId, false);
85+
86+
// Assert
87+
Assert.IsTrue(acl.GetReadAccess(otherUser.ObjectId));
88+
Assert.IsTrue(acl.GetWriteAccess(otherUser.ObjectId));
89+
Assert.IsTrue(acl.GetReadAccess(otherUser));
90+
Assert.IsTrue(acl.GetWriteAccess(otherUser));
91+
Assert.IsFalse(acl.GetReadAccess(owner));
92+
Assert.IsFalse(acl.GetWriteAccess(owner));
93+
}
94+
95+
[TestMethod]
96+
public void TestParseACLCreationWithNullObjectIdParseUser()
97+
{
98+
// Assert
99+
Assert.ThrowsException<ArgumentException>(() => new ParseACL(GenerateUser(default)));
100+
}
101+
102+
ParseUser GenerateUser(string objectID)
103+
{
104+
// Use the mock to simulate generating a ParseUser
105+
var state = new MutableObjectState { ObjectId = objectID };
106+
return Client.GenerateObjectFromState<ParseUser>(state, "_User");
57107
}
108+
109+
[TestMethod]
110+
public void TestGenerateObjectFromState()
111+
{
112+
// Arrange
113+
var state = new MutableObjectState { ObjectId = "123", ClassName = null };
114+
var defaultClassName = "_User";
115+
116+
var serviceHubMock = new Mock<IServiceHub>();
117+
var classControllerMock = new Mock<IParseObjectClassController>();
118+
119+
classControllerMock.Setup(controller => controller.Instantiate(It.IsAny<string>(), It.IsAny<IServiceHub>()))
120+
.Returns<string, IServiceHub>((className, hub) => new ParseUser());
121+
122+
// Act
123+
var user = classControllerMock.Object.GenerateObjectFromState<ParseUser>(state, defaultClassName, serviceHubMock.Object);
124+
125+
// Assert
126+
Assert.IsNotNull(user);
127+
Assert.AreEqual(defaultClassName, user.ClassName);
128+
}
129+
58130
}

0 commit comments

Comments
 (0)