public async Task 異常系_共同編集者以外が記事を更新()
        {
            var draft = Draft.NewDraft(_author, ItemType.Article);

            draft.Title = "共同編集テスト_共同編集者以外が記事を更新";
            draft.Body  = "共同編集テスト_共同編集者以外が記事を更新";

            var item = draft.ToItem(true);
            await ItemDbCommand.SaveAsync(item);

            var collaborator1 = new Collaborator(_collaborator1)
            {
                Role = RoleType.Owner
            };
            var collaborator2 = new Collaborator(_collaborator2)
            {
                Role = RoleType.Member
            };
            var collaborator3 = new Collaborator(_collaborator3)
            {
                Role = RoleType.Member
            };
            var collaborators = new[] { collaborator1, collaborator2 };
            await ItemDbCommand.SaveCollaboratorsAsync(item, collaborators);

            try
            {
                var newDraft = item.ToDraft(collaborator3);
            }
            catch (Exception exception)
            {
                Assert.AreEqual(exception.GetType(), typeof(NotEntitledToEditItemException));
            }
        }
        public async Task 正常系_共同編集者のロールを変更()
        {
            var draft = Draft.NewDraft(_author, ItemType.Article);

            draft.Title = "共同編集テスト_共同編集者のロールを変更";
            draft.Body  = "共同編集テスト_共同編集者のロールを変更";

            var item = draft.ToItem(true);
            await ItemDbCommand.SaveAsync(item);

            var collaborator1 = new Collaborator(_collaborator1)
            {
                Role = RoleType.Member
            };
            var collaborator2 = new Collaborator(_collaborator2)
            {
                Role = RoleType.Member
            };
            var collaborator3 = new Collaborator(_collaborator3)
            {
                Role = RoleType.Member
            };
            var collaborators = new[] { collaborator1, collaborator2, collaborator3 };
            await ItemDbCommand.SaveCollaboratorsAsync(item, collaborators);

            collaborator1.Role = RoleType.Owner;
            await ItemDbCommand.SaveCollaboratorsAsync(item);

            var savedItem = await ItemDbCommand.FindAsync(item.Id);

            item.IsStructuralEqual(savedItem);

            savedItem.Collaborators.ToArray().IsStructuralEqual(new[] { collaborator1, collaborator2, collaborator3 });
        }
        public async Task 正常系_共同編集者が記事を更新()
        {
            var draft = Draft.NewDraft(_author, ItemType.Article);

            draft.Title = "共同編集テスト_共同編集者が記事を更新";
            draft.Body  = "共同編集テスト_共同編集者が記事を更新";

            var item = draft.ToItem(true);
            await ItemDbCommand.SaveAsync(item);

            var collaborator1 = new Collaborator(_collaborator1)
            {
                Role = RoleType.Owner
            };
            var collaborator2 = new Collaborator(_collaborator2)
            {
                Role = RoleType.Member
            };
            var collaborators = new[] { collaborator1, collaborator2 };
            await ItemDbCommand.SaveCollaboratorsAsync(item, collaborators);

            var newDraft = item.ToDraft(_collaborator1);

            newDraft.Title = "共同編集テスト_共同編集者が記事を更新した";
            newDraft.Body  = "共同編集テスト_共同編集者が記事を更新した";

            var newItem = newDraft.ToItem(true);

            await ItemDbCommand.SaveAsync(newItem);

            newItem.Author.Is(_author);
            newItem.Editor.Is(_collaborator1);

            var savedItem = await ItemDbCommand.FindAsync(newItem.Id);

            savedItem.IsStructuralEqual(newItem);
        }
        public async Task 正常系_他の人が編集中の下書きを別の人が呼び出して記事を更新()
        {
            var draft = Draft.NewDraft(_author, ItemType.Article);

            draft.Title = "共同編集テスト_他の人が編集中の下書きを別の人が呼び出して記事を更新";
            draft.Body  = "共同編集テスト_他の人が編集中の下書きを別の人が呼び出して記事を更新";

            var item = draft.ToItem(true);
            await ItemDbCommand.SaveAsync(item);

            var collaborator1 = new Collaborator(_collaborator1)
            {
                Role = RoleType.Owner
            };
            var collaborator2 = new Collaborator(_collaborator2)
            {
                Role = RoleType.Member
            };
            var collaborator3 = new Collaborator(_collaborator3)
            {
                Role = RoleType.Member
            };
            var collaborators = new[] { collaborator1, collaborator2, collaborator3 };
            await ItemDbCommand.SaveCollaboratorsAsync(item, collaborators);

            var collaborator1Draft = item.ToDraft(_collaborator1);

            collaborator1Draft.Title = "共同編集テスト_共同編集者①が記事を編集中";
            collaborator1Draft.Body  = "共同編集テスト_共同編集者①が記事を編集中";

            await DraftDbCommand.SaveAsync(collaborator1Draft);

            // 共同編集者②が下書きを呼び出して下書きを更新
            var collaborator2Draft = await DraftDbCommand.FindAsync(item.Id, _collaborator2);

            collaborator2Draft.IsNull();
            collaborator2Draft       = item.ToDraft(_collaborator2);
            collaborator2Draft.Title = "共同編集テスト_共同編集者②が記事を編集中";
            collaborator2Draft.Body  = "共同編集テスト_共同編集者②が記事を編集中";

            await DraftDbCommand.SaveAsync(collaborator2Draft);

            var savedCollaborator2Draft = await DraftDbCommand.FindAsync(item.Id, _collaborator2);

            savedCollaborator2Draft.IsStructuralEqual(collaborator2Draft);

            // 共同編集者③が下書きを呼び出して下書きを更新
            var collaborator3Draft = await DraftDbCommand.FindAsync(item.Id, _collaborator3);

            collaborator3Draft.IsNull();

            collaborator3Draft       = item.ToDraft(_collaborator3);
            collaborator3Draft.Title = "共同編集テスト_共同編集者③が記事を編集";
            collaborator3Draft.Body  = "共同編集テスト_共同編集者③が記事を編集";

            var collaborator3Item = collaborator3Draft.ToItem();

            await ItemDbCommand.SaveAsync(collaborator3Item);

            var savedCollaborator3Item = await ItemDbCommand.FindAsync(item.Id);

            savedCollaborator3Item.Author.Is(_author);
            savedCollaborator3Item.Editor.Is(_collaborator3);
            savedCollaborator3Item.IsStructuralEqual(collaborator3Item);
        }