Browse Source

Prevent repeated http requests sent to NuGet repository when selecting a different page.

pull/15/head
mrward 15 years ago
parent
commit
f69e6bdb83
  1. 14
      src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs
  2. 8
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs
  3. 3
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs
  4. 76
      src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs

14
src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs

@ -112,7 +112,7 @@ namespace ICSharpCode.PackageManagement
public void ReadPackages() public void ReadPackages()
{ {
allPackages = null; allPackages = null;
SelectedPageNumber = 1; pages.SelectedPageNumber = 1;
UpdateRepositoryBeforeReadPackagesTaskStarts(); UpdateRepositoryBeforeReadPackagesTaskStarts();
StartReadPackagesTask(); StartReadPackagesTask();
} }
@ -177,13 +177,9 @@ namespace ICSharpCode.PackageManagement
void UpdatePackagesForSelectedPage(PackagesForSelectedPageResult result) void UpdatePackagesForSelectedPage(PackagesForSelectedPageResult result)
{ {
pages.CollectionChanged -= PagesChanged;
pages.TotalItems = result.TotalPackages; pages.TotalItems = result.TotalPackages;
pages.TotalItemsOnSelectedPage = result.TotalPackagesOnPage; pages.TotalItemsOnSelectedPage = result.TotalPackagesOnPage;
UpdatePackageViewModels(result.Packages); UpdatePackageViewModels(result.Packages);
pages.CollectionChanged += PagesChanged;
} }
void PagesChanged(object sender, NotifyCollectionChangedEventArgs e) void PagesChanged(object sender, NotifyCollectionChangedEventArgs e)
@ -278,7 +274,13 @@ namespace ICSharpCode.PackageManagement
public int SelectedPageNumber { public int SelectedPageNumber {
get { return pages.SelectedPageNumber; } get { return pages.SelectedPageNumber; }
set { pages.SelectedPageNumber = value; } set {
if (pages.SelectedPageNumber != value) {
pages.SelectedPageNumber = value;
StartReadPackagesTask();
base.OnPropertyChanged(null);
}
}
} }
public int PageSize { public int PageSize {

8
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTask.cs

@ -11,19 +11,25 @@ namespace PackageManagement.Tests.Helpers
public bool IsStartCalled; public bool IsStartCalled;
public bool IsCancelCalled; public bool IsCancelCalled;
public bool RunTaskSynchronously;
Func<TResult> function; Func<TResult> function;
Action<ITask<TResult>> continueWith; Action<ITask<TResult>> continueWith;
public FakeTask(Func<TResult> function, Action<ITask<TResult>> continueWith) public FakeTask(Func<TResult> function, Action<ITask<TResult>> continueWith, bool runTaskSynchronously)
{ {
this.function = function; this.function = function;
this.continueWith = continueWith; this.continueWith = continueWith;
RunTaskSynchronously = runTaskSynchronously;
Exception = new AggregateException(new Exception("FakeTaskAggregateInnerException")); Exception = new AggregateException(new Exception("FakeTaskAggregateInnerException"));
} }
public void Start() public void Start()
{ {
IsStartCalled = true; IsStartCalled = true;
if (RunTaskSynchronously) {
ExecuteTaskCompletely();
}
} }
public TResult Result { get; set; } public TResult Result { get; set; }

3
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeTaskFactory.cs

@ -11,6 +11,7 @@ namespace PackageManagement.Tests.Helpers
public class FakeTaskFactory : ITaskFactory public class FakeTaskFactory : ITaskFactory
{ {
public bool IsCreateTaskCalled; public bool IsCreateTaskCalled;
public bool RunTasksSynchronously;
public FakeTask<PackagesForSelectedPageResult> FirstFakeTaskCreated { public FakeTask<PackagesForSelectedPageResult> FirstFakeTaskCreated {
get { return FakeTasksCreated[0] as FakeTask<PackagesForSelectedPageResult>; } get { return FakeTasksCreated[0] as FakeTask<PackagesForSelectedPageResult>; }
@ -23,7 +24,7 @@ namespace PackageManagement.Tests.Helpers
Action<ITask<TResult>> continueWith) Action<ITask<TResult>> continueWith)
{ {
IsCreateTaskCalled = true; IsCreateTaskCalled = true;
var task = new FakeTask<TResult>(function, continueWith); var task = new FakeTask<TResult>(function, continueWith, RunTasksSynchronously);
FakeTasksCreated.Add(task); FakeTasksCreated.Add(task);
return task; return task;
} }

76
src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs

@ -508,7 +508,7 @@ namespace PackageManagement.Tests
} }
[Test] [Test]
public void ReadPackages_CalledThreeTimesAndThenSelectedPageChanged_ViewModelPropertiesChangedEventFiresFourTimesWhenSelectedPageChanged() public void ReadPackages_CalledThreeTimesAndThenSelectedPageChanged_ViewModelPropertiesChangedEventFiresOnceWhenSelectedPageChanged()
{ {
CreateViewModel(); CreateViewModel();
viewModel.PageSize = 3; viewModel.PageSize = 3;
@ -527,16 +527,7 @@ namespace PackageManagement.Tests
viewModel.PropertyChanged += (sender, e) => count++; viewModel.PropertyChanged += (sender, e) => count++;
viewModel.SelectedPageNumber = 2; viewModel.SelectedPageNumber = 2;
// PropertyChanged fired for clearing the pages. Assert.AreEqual(1, count);
int propertyChangedEventFiredForClearingPagesCount = 1;
// PropertyChanged fired once for each page.
int propertyChangedEventFiredForAddingPagesCount = 2;
int totalExpectedPropertyChangedFiredCount =
propertyChangedEventFiredForClearingPagesCount + propertyChangedEventFiredForAddingPagesCount;
Assert.AreEqual(totalExpectedPropertyChangedFiredCount, count);
} }
[Test] [Test]
@ -1141,5 +1132,68 @@ namespace PackageManagement.Tests
PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels); PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels);
} }
[Test]
public void SelectedPageNumber_SixPackagesAndPageSizeIsFiveAndSelectedPageNumberIsChangedToTwo_OneReadPackagesTaskCreated()
{
CreateViewModel();
viewModel.PageSize = 5;
viewModel.AddSixFakePackages();
viewModel.ReadPackages();
CompleteReadPackagesTask();
ClearReadPackagesTasks();
viewModel.SelectedPageNumber = 2;
Assert.AreEqual(1, taskFactory.FakeTasksCreated.Count);
}
[Test]
public void SelectedPageNumber_SixPackagesAndSelectedPageNumberIsSetToPageOneButUnchanged_NoReadPackagesTaskCreated()
{
CreateViewModel();
viewModel.PageSize = 5;
viewModel.AddSixFakePackages();
viewModel.ReadPackages();
CompleteReadPackagesTask();
ClearReadPackagesTasks();
viewModel.SelectedPageNumber = 1;
Assert.AreEqual(0, taskFactory.FakeTasksCreated.Count);
}
[Test]
public void SelectedPageNumber_SixPackagesAndPageSizeIsFiveAndSelectedPageNumberIsChangedToTwo_PropertyChangedEventFiredAfterSelectedPageNumberChanged()
{
CreateViewModel();
viewModel.PageSize = 5;
viewModel.AddSixFakePackages();
viewModel.ReadPackages();
CompleteReadPackagesTask();
ClearReadPackagesTasks();
int selectedPageNumber = 0;
viewModel.PropertyChanged += (source, e) => selectedPageNumber = viewModel.SelectedPageNumber;
viewModel.SelectedPageNumber = 2;
Assert.AreEqual(2, selectedPageNumber);
}
[Test]
public void SelectedPageNumber_SixPackagesAndPageSizeIsFiveAndSelectedPageNumberIsChangedToTwo_SelectedPageNumberChangedBeforeReadPackagesTaskStarted()
{
CreateViewModel();
viewModel.PageSize = 5;
viewModel.AddSixFakePackages();
viewModel.ReadPackages();
CompleteReadPackagesTask();
ClearReadPackagesTasks();
taskFactory.RunTasksSynchronously = true;
viewModel.SelectedPageNumber = 2;
Assert.AreEqual(1, viewModel.PackageViewModels.Count);
}
} }
} }

Loading…
Cancel
Save