[WIP] Fixes #1718 Implement Repository Transfer functionality (#1813)

* Add "transfer repository" accept header

* Create RepositoryTransfer class

This will be used to send the POST request to initiate the transfer.

* Create Ensure method to check for empty or null arrays

* Change arg name in Ensure for nonempty arrays

array -> value

* Add xmldoc for ArgumentNotNullOrEmptyArray

* Create Transfer method in IRepositoriesClient

* Implement Transfer method in RepositoriesClient

* Fix typo in xmldoc for Transfer

* Add <returns> to Transfer xmldoc

* Create Transfer method in IObservableRepositoriesClient

* Implement Transfer in ObservableRepositoriesClient

* Add DebuggerDIsplayAttribute do RepositoryTransfer

* Add unit tests for RepositoryTransfer constructors

* Change TeamId property type to IReadOnlyList<int>

* Rewrite DebuggerDisplay property into something more succint

* Make new Ensure method into an IEnumerable<T> checker

* Add XmlDoc to RepositoryTransfer

* Tweaks to first ctor XmlDoc

* Create basic unit tests for Transfer

* Create ApiUrls.RepositoryTransfer

* Use ApiUrls.RepositoryTransfer to get URI in Transfer

Previous implementation used wrong URI

* Start implementing RepositoriesClientTests.TheTransferMethod

* Implement org -> user transfer integration test

* Implement user -> org transfer integration test

* [WIP] Implement user -> org transfer with teams

Implementation doesn't work, API usage seems correct.

* Mark transfer user -> org w/ teams integration test with FIXME

* Add second end point URI to ApiUrls

* Add other Transfer overload to RepositoriesClient for other end point

* Create unit tests for other Transfer endpoint

* Add overload to IRepositoriesClient

* Add integration tests for overload

* Reorganize unit tests for TheTransferMethod

* Rename id to repositoryId

* Reorganize unit tests for RepositoriesClientTests.Transfer

* Add second endpoint to IObservableRepositoriesClient

* Add XmlDoc to second Transfer endpoint

* Add XmlDoc to second Transfer endpoint in RepositoriesClient

* Reimplement "with teams" integration tests using TeamContext

* Rename integration test for consistency

* Add asserts to actual ownership transfer

* Rename RepositoryTransfer.TeamId property to TeamIds

* Add awaiit to ThrowsAsync in RepositoriesClientTests

* Put await in right places for unit tests

* Add Ensures for Transfer method in RepositoriesClient

* Add XmlDoc to ApiUrls.RepositoryTransfer with repo id

* Update XmlDoc for RepositoryTransfer constructor and teamIds property

* Rename currentOwner to owner

* Add Ensure guards to ObservableRepositoriesClient.Transfer methods

* Add unit tests for ObservableRepositoriesClient
This commit is contained in:
William Quelho Ferreira
2018-06-24 09:33:33 -03:00
committed by Ryan Gribble
parent fb928f68d5
commit 74dc51a6f5
12 changed files with 637 additions and 0 deletions
@@ -1681,4 +1681,126 @@ public class RepositoriesClientTests
Assert.Equal("MIT License", license.License.Name);
}
}
public class TheTransferMethod
{
[IntegrationTest]
public async Task TransfersFromOrgToUser()
{
var github = Helper.GetAuthenticatedClient();
var newRepo = new NewRepository(Helper.MakeNameWithTimestamp("transferred-repo"));
var newOwner = Helper.UserName;
using (var context = await github.CreateRepositoryContext(Helper.Organization, newRepo))
{
var transfer = new RepositoryTransfer(newOwner);
await github.Repository.Transfer(context.RepositoryOwner, context.RepositoryName, transfer);
var transferred = await github.Repository.Get(newOwner, context.RepositoryName);
Assert.Equal(newOwner, transferred.Owner.Login);
}
}
[IntegrationTest]
public async Task TransfersFromOrgToUserById()
{
var github = Helper.GetAuthenticatedClient();
var newRepo = new NewRepository(Helper.MakeNameWithTimestamp("transferred-repo"));
var newOwner = Helper.UserName;
using (var context = await github.CreateRepositoryContext(Helper.Organization, newRepo))
{
var transfer = new RepositoryTransfer(newOwner);
await github.Repository.Transfer(context.RepositoryId, transfer);
var transferred = await github.Repository.Get(context.RepositoryId);
Assert.Equal(newOwner, transferred.Owner.Login);
}
}
[IntegrationTest]
public async Task TransfersFromUserToOrg()
{
var github = Helper.GetAuthenticatedClient();
var newRepo = new NewRepository(Helper.MakeNameWithTimestamp("transferred-repo"));
var newOwner = Helper.Organization;
using (var context = await github.CreateRepositoryContext(newRepo))
{
var transfer = new RepositoryTransfer(newOwner);
await github.Repository.Transfer(context.RepositoryOwner, context.RepositoryName, transfer);
var transferred = await github.Repository.Get(newOwner, context.RepositoryName);
Assert.Equal(newOwner, transferred.Owner.Login);
}
}
[IntegrationTest]
public async Task TransfersFromUserToOrgById()
{
var github = Helper.GetAuthenticatedClient();
var newRepo = new NewRepository(Helper.MakeNameWithTimestamp("transferred-repo"));
var newOwner = Helper.Organization;
using (var context = await github.CreateRepositoryContext(newRepo))
{
var transfer = new RepositoryTransfer(newOwner);
await github.Repository.Transfer(context.RepositoryId, transfer);
var transferred = await github.Repository.Get(context.RepositoryId);
Assert.Equal(newOwner, transferred.Owner.Login);
}
}
[IntegrationTest]
public async Task TransfersFromUserToOrgWithTeams()
{
// FIXME API doesn't add teams when transferring to an organization
var github = Helper.GetAuthenticatedClient();
var newRepo = new NewRepository(Helper.MakeNameWithTimestamp("transferred-repo"));
var newOwner = Helper.Organization;
using (var repositoryContext = await github.CreateRepositoryContext(newRepo))
{
NewTeam team = new NewTeam(Helper.MakeNameWithTimestamp("transfer-team"));
using (var teamContext = await github.CreateTeamContext(Helper.Organization, team)) {
var transferTeamIds = new int[] { teamContext.TeamId };
var transfer = new RepositoryTransfer(newOwner, transferTeamIds);
await github.Repository.Transfer(
repositoryContext.RepositoryOwner, repositoryContext.RepositoryName, transfer);
var transferred = await github.Repository.Get(repositoryContext.RepositoryId);
var repoTeams = await github.Repository.GetAllTeams(repositoryContext.RepositoryId);
Assert.Equal(newOwner, transferred.Owner.Login);
// transferTeamIds is a subset of repoTeams
Assert.Empty(
transferTeamIds.Except(
repoTeams.Select(t => t.Id)));
}
}
}
[IntegrationTest]
public async Task TransfersFromUserToOrgWithTeamsById()
{
// FIXME API doesn't add teams when transferring to an organization
var github = Helper.GetAuthenticatedClient();
var newRepo = new NewRepository(Helper.MakeNameWithTimestamp("transferred-repo"));
var newOwner = Helper.Organization;
using (var repositoryContext = await github.CreateRepositoryContext(newRepo))
{
NewTeam team = new NewTeam(Helper.MakeNameWithTimestamp("transfer-team"));
using (var teamContext = await github.CreateTeamContext(Helper.Organization, team)) {
var transferTeamIds = new int[] { teamContext.TeamId };
var transfer = new RepositoryTransfer(newOwner, transferTeamIds);
await github.Repository.Transfer(repositoryContext.RepositoryId, transfer);
var transferred = await github.Repository.Get(repositoryContext.RepositoryId);
var repoTeams = await github.Repository.GetAllTeams(repositoryContext.RepositoryId);
Assert.Equal(newOwner, transferred.Owner.Login);
// transferTeamIds is a subset of repoTeams
Assert.Empty(
transferTeamIds.Except(
repoTeams.Select(t => t.Id)));
}
}
}
}
}