Files
speckle-sharp-sdk/tests/Speckle.Core.Tests.Integration/Api.cs
T
2024-06-21 08:42:42 +01:00

499 lines
12 KiB
C#

using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Models;
using Speckle.Core.Tests.Unit.Kits;
using Speckle.Core.Transports;
namespace Speckle.Core.Tests.Integration;
public class Api : IDisposable
{
private string _branchId = "";
private string _branchName = "";
private string _commitId = "";
private Account _firstUserAccount,
_secondUserAccount;
private Client _myClient,
_secondClient;
private ServerTransport _myServerTransport,
_otherServerTransport;
private string _objectId = "";
private string _streamId = "";
[OneTimeSetUp]
public async Task Setup()
{
_firstUserAccount = await Fixtures.SeedUser();
_secondUserAccount = await Fixtures.SeedUser();
_myClient = new Client(_firstUserAccount);
_secondClient = new Client(_secondUserAccount);
}
private void InitServerTransport()
{
_myServerTransport = new ServerTransport(_firstUserAccount, _streamId);
_myServerTransport.Api.CompressPayloads = false;
_otherServerTransport = new ServerTransport(_firstUserAccount, _streamId);
_otherServerTransport.Api.CompressPayloads = false;
}
[Test]
public async Task ActiveUserGet()
{
var res = await _myClient.ActiveUserGet();
Assert.That(res.id, Is.EqualTo(_myClient.Account.userInfo.id));
}
[Test]
public async Task OtherUserGet()
{
var res = await _myClient.OtherUserGet(_secondUserAccount.userInfo.id);
Assert.That(res!.name, Is.EqualTo(_secondUserAccount.userInfo.name));
}
[Test]
public async Task UserSearch()
{
var res = await _myClient.UserSearch(_firstUserAccount.userInfo.email);
Assert.That(res, Has.Count.EqualTo(1));
Assert.That(res[0].id, Is.EqualTo(_firstUserAccount.userInfo.id));
}
[Test]
public async Task ServerVersion()
{
var res = await _myClient.GetServerVersion();
Assert.That(res, Is.Not.Null);
}
[Test, Order(0)]
public async Task StreamCreate()
{
var res = await _myClient.StreamCreate(
new StreamCreateInput { description = "Hello World", name = "Super Stream 01" }
);
Assert.That(res, Is.Not.Null);
_streamId = res;
InitServerTransport();
}
[Test, Order(10)]
public async Task StreamsGet()
{
var res = await _myClient.StreamsGet();
Assert.That(res, Is.Not.Null);
}
[Test, Order(11)]
public async Task StreamGet()
{
var res = await _myClient.StreamGet(_streamId);
Assert.That(res, Is.Not.Null);
Assert.That(res.branches.items[0].name, Is.EqualTo("main"));
Assert.That(res.collaborators, Is.Not.Empty);
}
[Test, Order(12)]
public async Task IsStreamAccessible()
{
var res = await _myClient.IsStreamAccessible(_streamId);
Assert.That(res, Is.True);
}
[Test, Order(13)]
public async Task StreamSearch()
{
var res = await _myClient.StreamSearch(_streamId);
Assert.That(res, Is.Not.Null);
}
[Test, Order(20)]
public async Task StreamUpdate()
{
var res = await _myClient.StreamUpdate(
new StreamUpdateInput
{
id = _streamId,
description = "Hello World",
name = "Super Stream 01 EDITED"
}
);
Assert.That(res, Is.True);
}
[Test, Order(31)]
public async Task StreamInviteCreate()
{
var res = await _myClient.StreamInviteCreate(
new StreamInviteCreateInput
{
streamId = _streamId,
email = _secondUserAccount.userInfo.email,
message = "Whasssup!"
}
);
Assert.That(res, Is.True);
Assert.ThrowsAsync<ArgumentException>(
async () => await _myClient.StreamInviteCreate(new StreamInviteCreateInput { streamId = _streamId })
);
}
[Test, Order(32)]
public async Task StreamInviteGet()
{
var invites = await _secondClient.GetAllPendingInvites();
Assert.That(invites, Is.Not.Null);
}
[Test, Order(33)]
public async Task StreamInviteUse()
{
var invites = await _secondClient.GetAllPendingInvites();
var res = await _secondClient.StreamInviteUse(invites[0].streamId, invites[0].token);
Assert.That(res, Is.True);
}
[Test, Order(34)]
public async Task StreamUpdatePermission()
{
var res = await _myClient.StreamUpdatePermission(
new StreamPermissionInput
{
role = "stream:reviewer",
streamId = _streamId,
userId = _secondUserAccount.userInfo.id
}
);
Assert.That(res, Is.True);
}
[Test, Order(40)]
public async Task StreamRevokePermission()
{
var res = await _myClient.StreamRevokePermission(
new StreamRevokePermissionInput { streamId = _streamId, userId = _secondUserAccount.userInfo.id }
);
Assert.That(res, Is.True);
}
#region activity
[Test, Order(51)]
public async Task StreamGetActivity()
{
var res = await _myClient.StreamGetActivity(_streamId);
Assert.That(res, Is.Not.Null);
//Assert.AreEqual(commitId, res[0].);
}
#endregion
#region comments
[Test, Order(52)]
public async Task StreamGetComments()
{
var res = await _myClient.StreamGetActivity(_streamId);
Assert.That(res, Is.Not.Null);
//Assert.AreEqual(commitId, res[0].);
}
#endregion
[Test, Order(60)]
public async Task StreamDelete()
{
var res = await _myClient.StreamDelete(_streamId);
Assert.That(res, Is.True);
}
#region branches
[Test, Order(41)]
public async Task BranchCreate()
{
var res = await _myClient.BranchCreate(
new BranchCreateInput
{
streamId = _streamId,
description = "this is a sample branch",
name = "sample-branch"
}
);
Assert.That(res, Is.Not.Null);
_branchId = res;
_branchName = "sample-branch";
}
[Test, Order(42)]
public async Task BranchGet()
{
var res = await _myClient.BranchGet(_streamId, _branchName);
Assert.That(res, Is.Not.Null);
Assert.That(res.description, Is.EqualTo("this is a sample branch"));
}
[Test, Order(43)]
public async Task StreamGetBranches()
{
var res = await _myClient.StreamGetBranches(_streamId);
Assert.That(res, Is.Not.Null);
// Branches are now returned in order of creation so 'main' should always go first.
Assert.That(res[0].name, Is.EqualTo("main"));
}
[Test, Order(51)]
public async Task StreamGetBranches_Throws_WhenRequestingOverLimit()
{
Assert.ThrowsAsync<SpeckleGraphQLException<StreamData>>(
async () => await _myClient.StreamGetBranches(_streamId, ServerLimits.BRANCH_GET_LIMIT + 1)
);
var res = await _myClient.StreamGetBranches(_streamId, ServerLimits.BRANCH_GET_LIMIT);
Assert.That(res, Is.Not.Null);
}
[Test, Order(52)]
public async Task StreamGetBranches_WithManyBranches()
{
var newStreamId = await _myClient.StreamCreate(new StreamCreateInput { name = "Many branches stream" });
await CreateEmptyBranches(_myClient, newStreamId, ServerLimits.BRANCH_GET_LIMIT);
var res = await _myClient.StreamGetBranches(newStreamId, ServerLimits.BRANCH_GET_LIMIT);
Assert.That(res, Is.Not.Null);
Assert.That(res, Has.Count.EqualTo(ServerLimits.BRANCH_GET_LIMIT));
}
private async Task CreateEmptyBranches(
Client client,
string streamId,
int branchCount,
string branchPrefix = "Test branch"
)
{
// now let's send HTTP requests to each of these URLs in parallel
var options = new ParallelOptions { MaxDegreeOfParallelism = 2 };
// now let's send HTTP requests to each of these URLs in parallel
await Parallel.ForEachAsync(
Enumerable.Range(0, branchCount),
options,
async (i, cancellationToken) =>
{
await client.BranchCreate(
new BranchCreateInput { name = $"{branchPrefix} {i}", streamId = streamId },
cancellationToken
);
}
);
}
#region commit
[Test, Order(43)]
public async Task CommitCreate()
{
var myObject = new Base();
var ptsList = new List<Point>();
for (int i = 0; i < 100; i++)
{
ptsList.Add(new Point(i, i, i));
}
myObject["@Points"] = ptsList;
_objectId = await Operations.Send(myObject, new List<ITransport> { _myServerTransport });
Assert.That(_objectId, Is.Not.Null);
var res = await _myClient.CommitCreate(
new CommitCreateInput
{
streamId = _streamId,
branchName = _branchName,
objectId = _objectId,
message = "Fibber Fibbo",
sourceApplication = "Tests",
totalChildrenCount = 100
}
);
Assert.That(res, Is.Not.Null);
_commitId = res;
var res2 = await _myClient.CommitCreate(
new CommitCreateInput
{
streamId = _streamId,
branchName = _branchName,
objectId = _objectId,
message = "Fabber Fabbo",
sourceApplication = "Tests",
totalChildrenCount = 100,
parents = new List<string> { _commitId }
}
);
Assert.That(res2, Is.Not.Null);
_commitId = res2;
}
[Test, Order(44)]
public async Task CommitGet()
{
var res = await _myClient.CommitGet(_streamId, _commitId);
Assert.That(res, Is.Not.Null);
Assert.That(res.message, Is.EqualTo("Fabber Fabbo"));
}
[Test, Order(45)]
public async Task StreamGetCommits()
{
var res = await _myClient.StreamGetCommits(_streamId);
Assert.That(res, Is.Not.Null);
Assert.That(res[0].id, Is.EqualTo(_commitId));
}
#region object
[Test, Order(45)]
public async Task ObjectGet()
{
var res = await _myClient.ObjectGet(_streamId, _objectId);
Assert.That(res, Is.Not.Null);
Assert.That(res.totalChildrenCount, Is.EqualTo(100));
}
#endregion
[Test, Order(46)]
public async Task CommitUpdate()
{
var res = await _myClient.CommitUpdate(
new CommitUpdateInput
{
streamId = _streamId,
id = _commitId,
message = "DIM IS DA BEST"
}
);
Assert.That(res, Is.True);
}
[Test, Order(47)]
public async Task CommitReceived()
{
var res = await _myClient.CommitReceived(
new CommitReceivedInput
{
commitId = _commitId,
streamId = _streamId,
sourceApplication = "sharp-tests",
message = "The test message"
}
);
Assert.That(res, Is.True);
}
[Test, Order(48)]
public async Task CommitDelete()
{
var res = await _myClient.CommitDelete(new CommitDeleteInput { id = _commitId, streamId = _streamId });
Assert.That(res, Is.True);
}
#endregion
[Test, Order(49)]
public async Task BranchUpdate()
{
var res = await _myClient.BranchUpdate(
new BranchUpdateInput
{
streamId = _streamId,
id = _branchId,
name = "sample-branch EDITED"
}
);
Assert.That(res, Is.True);
}
[Test, Order(50)]
public async Task BranchDelete()
{
var res = await _myClient.BranchDelete(new BranchDeleteInput { id = _branchId, streamId = _streamId });
Assert.That(res, Is.True);
}
#endregion
#region send/receive bare
//[Test, Order(60)]
//public async Task SendDetached()
//{
// var myObject = new Base();
// var ptsList = new List<Point>();
// for (int i = 0; i < 100; i++)
// ptsList.Add(new Point(i, i, i));
// myObject["@Points"] = ptsList;
// var otherTransport = new ServerTransport(firstUserAccount, null);
// otherTransport.StreamId =
// objectId = await Operations.Send(myObject, new List<ITransport>() { myServerTransport }, disposeTransports: true);
//}
//[Test, Order(61)]
//public async Task ReceiveAndCompose()
//{
// var myObject = await Operations.Receive(objectId, myServerTransport);
// Assert.NotNull(myObject);
// Assert.AreEqual(100, ((List<object>)myObject["@Points"]).Count);
//}
#endregion
public void Dispose()
{
_myClient?.Dispose();
_secondClient?.Dispose();
_myServerTransport?.Dispose();
_otherServerTransport?.Dispose();
}
}