|
15 | 15 | using IConnection = GitHub.Models.IConnection; |
16 | 16 | using ReactiveUI.Testing; |
17 | 17 | using System.Reactive.Concurrency; |
| 18 | +using GitHub.Models.Drafts; |
18 | 19 |
|
19 | 20 | /// <summary> |
20 | 21 | /// All the tests in this class are split in subclasses so that when they run |
@@ -129,7 +130,7 @@ public async Task TargetBranchDisplayNameIncludesRepoOwnerWhenForkAsync() |
129 | 130 | var data = PrepareTestData("octokit.net", "shana", "master", "octokit", "master", "origin", true, true); |
130 | 131 | var prservice = new PullRequestService(data.GitClient, data.GitService, Substitute.For<IVSGitExt>(), Substitute.For<IGraphQLClientFactory>(), data.ServiceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>()); |
131 | 132 | prservice.GetPullRequestTemplate(data.ActiveRepo).Returns(Observable.Empty<string>()); |
132 | | - var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService); |
| 133 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, Substitute.For<IMessageDraftStore>()); |
133 | 134 | await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
134 | 135 | Assert.That("octokit/master", Is.EqualTo(vm.TargetBranch.DisplayName)); |
135 | 136 | } |
@@ -166,7 +167,7 @@ public async Task CreatingPRsAsync( |
166 | 167 | var ms = data.ModelService; |
167 | 168 |
|
168 | 169 | var prservice = new PullRequestService(data.GitClient, data.GitService, Substitute.For<IVSGitExt>(), Substitute.For<IGraphQLClientFactory>(), data.ServiceProvider.GetOperatingSystem(), Substitute.For<IUsageTracker>()); |
169 | | - var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService); |
| 170 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, Substitute.For<IMessageDraftStore>()); |
170 | 171 | await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
171 | 172 |
|
172 | 173 | // the TargetBranch property gets set to whatever the repo default is (we assume master here), |
@@ -209,9 +210,104 @@ public async Task TemplateIsUsedIfPresentAsync() |
209 | 210 | var prservice = Substitute.For<IPullRequestService>(); |
210 | 211 | prservice.GetPullRequestTemplate(data.ActiveRepo).Returns(Observable.Return("Test PR template")); |
211 | 212 |
|
212 | | - var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService); |
| 213 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, |
| 214 | + Substitute.For<IMessageDraftStore>()); |
213 | 215 | await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
214 | 216 |
|
215 | 217 | Assert.That("Test PR template", Is.EqualTo(vm.Description)); |
216 | 218 | } |
| 219 | + |
| 220 | + [Test] |
| 221 | + public async Task LoadsDraft() |
| 222 | + { |
| 223 | + var data = PrepareTestData("repo", "owner", "feature-branch", "owner", "master", "origin", false, false); |
| 224 | + var draftStore = Substitute.For<IMessageDraftStore>(); |
| 225 | + draftStore.GetDraft<PullRequestDraft>("pr|http://github.com/owner/repo|feature-branch", string.Empty) |
| 226 | + .Returns(new PullRequestDraft |
| 227 | + { |
| 228 | + Title = "This is a Title.", |
| 229 | + Body = "This is a PR.", |
| 230 | + }); |
| 231 | + |
| 232 | + var prservice = Substitute.For<IPullRequestService>(); |
| 233 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, draftStore); |
| 234 | + await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
| 235 | + |
| 236 | + Assert.That(vm.PRTitle, Is.EqualTo("This is a Title.")); |
| 237 | + Assert.That(vm.Description, Is.EqualTo("This is a PR.")); |
| 238 | + } |
| 239 | + |
| 240 | + [Test] |
| 241 | + public async Task UpdatesDraftWhenDescriptionChanges() |
| 242 | + { |
| 243 | + var data = PrepareTestData("repo", "owner", "feature-branch", "owner", "master", "origin", false, false); |
| 244 | + var scheduler = new HistoricalScheduler(); |
| 245 | + var draftStore = Substitute.For<IMessageDraftStore>(); |
| 246 | + var prservice = Substitute.For<IPullRequestService>(); |
| 247 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, draftStore, scheduler); |
| 248 | + await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
| 249 | + |
| 250 | + vm.Description = "Body changed."; |
| 251 | + |
| 252 | + await draftStore.DidNotReceiveWithAnyArgs().UpdateDraft<PullRequestDraft>(null, null, null); |
| 253 | + |
| 254 | + scheduler.AdvanceBy(TimeSpan.FromSeconds(1)); |
| 255 | + |
| 256 | + await draftStore.Received().UpdateDraft( |
| 257 | + "pr|http://github.com/owner/repo|feature-branch", |
| 258 | + string.Empty, |
| 259 | + Arg.Is<PullRequestDraft>(x => x.Body == "Body changed.")); |
| 260 | + } |
| 261 | + |
| 262 | + [Test] |
| 263 | + public async Task UpdatesDraftWhenTitleChanges() |
| 264 | + { |
| 265 | + var data = PrepareTestData("repo", "owner", "feature-branch", "owner", "master", "origin", false, false); |
| 266 | + var scheduler = new HistoricalScheduler(); |
| 267 | + var draftStore = Substitute.For<IMessageDraftStore>(); |
| 268 | + var prservice = Substitute.For<IPullRequestService>(); |
| 269 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, draftStore, scheduler); |
| 270 | + await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
| 271 | + |
| 272 | + vm.PRTitle = "Title changed."; |
| 273 | + |
| 274 | + await draftStore.DidNotReceiveWithAnyArgs().UpdateDraft<PullRequestDraft>(null, null, null); |
| 275 | + |
| 276 | + scheduler.AdvanceBy(TimeSpan.FromSeconds(1)); |
| 277 | + |
| 278 | + await draftStore.Received().UpdateDraft( |
| 279 | + "pr|http://github.com/owner/repo|feature-branch", |
| 280 | + string.Empty, |
| 281 | + Arg.Is<PullRequestDraft>(x => x.Title == "Title changed.")); |
| 282 | + } |
| 283 | + |
| 284 | + [Test] |
| 285 | + public async Task DeletesDraftWhenPullRequestSubmitted() |
| 286 | + { |
| 287 | + var data = PrepareTestData("repo", "owner", "feature-branch", "owner", "master", "origin", false, false); |
| 288 | + var scheduler = new HistoricalScheduler(); |
| 289 | + var draftStore = Substitute.For<IMessageDraftStore>(); |
| 290 | + var prservice = Substitute.For<IPullRequestService>(); |
| 291 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, draftStore, scheduler); |
| 292 | + await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
| 293 | + |
| 294 | + await vm.CreatePullRequest.Execute(); |
| 295 | + |
| 296 | + await draftStore.Received().DeleteDraft("pr|http://github.com/owner/repo|feature-branch", string.Empty); |
| 297 | + } |
| 298 | + |
| 299 | + [Test] |
| 300 | + public async Task DeletesDraftWhenCanceled() |
| 301 | + { |
| 302 | + var data = PrepareTestData("repo", "owner", "feature-branch", "owner", "master", "origin", false, false); |
| 303 | + var scheduler = new HistoricalScheduler(); |
| 304 | + var draftStore = Substitute.For<IMessageDraftStore>(); |
| 305 | + var prservice = Substitute.For<IPullRequestService>(); |
| 306 | + var vm = new PullRequestCreationViewModel(data.GetModelServiceFactory(), prservice, data.NotificationService, draftStore, scheduler); |
| 307 | + await vm.InitializeAsync(data.ActiveRepo, data.Connection); |
| 308 | + |
| 309 | + await vm.Cancel.Execute(); |
| 310 | + |
| 311 | + await draftStore.Received().DeleteDraft("pr|http://github.com/owner/repo|feature-branch", string.Empty); |
| 312 | + } |
217 | 313 | } |
0 commit comments