public void TestGetVariant() { const string variantData = "Пусть это будут данные варианта. То, что это на самом деле строка, не принципиально."; var allowedVersion = new Version(1, 0, 234, 999); var dataServiceMock = new Mock <IVariantProviderServiceClient>(MockBehavior.Strict); var taskVariantInfo = new TaskVariantDto { Data = Encoding.UTF8.GetBytes(variantData), GeneratorVersion = allowedVersion.ToString(), Id = 7, Number = "test", Version = 1 }; dataServiceMock .Setup(srv => srv.GetVariantAsync(It.Is <long>(l => l == TaskId), It.Is <Guid>(g => g == _sessionGuid))) .Callback(() => dataServiceMock.Raise(mock => mock.GetVariantCompleted += null, new GetVariantCompletedEventArgs(new object[] { taskVariantInfo }, null, false, null))) .Verifiable(); SetupCloseAsync(dataServiceMock); using (var wrapper = DisposableWcfClientWrapper.Create(dataServiceMock.Object)) { var variantProvider = new VariantProvider( TaskId, _sessionGuid, new[] { new Version(allowedVersion.Major, allowedVersion.Minor + 1) }, wrapper); using (var flag = new AutoResetEvent(false)) { var handled = false; EventHandler <VariantDownloadedEventArgs> handler = (sender, args) => { Assert.AreSame(sender, variantProvider); Assert.NotNull(args); Assert.That(args.Data.SequenceEqual(taskVariantInfo.Data)); Assert.AreEqual(taskVariantInfo.Number, args.Number); Assert.AreEqual(taskVariantInfo.Number, args.Number); handled = true; flag.Set(); }; variantProvider.VariantDownloaded += handler; variantProvider.DownloadVariantAsync(); flag.WaitOne(1000); variantProvider.VariantDownloaded -= handler; Assert.IsTrue(handled); } } dataServiceMock.Verify(); }
public void TestInvalidVersion() { const string variantData = "Пусть это будут данные варианта. То, что это на самом деле строка, не принципиально."; var allowedVersion = new Version(1, 0); var dataServiceMock = new Mock <IVariantProviderServiceClient>(MockBehavior.Strict); var taskVariantInfo = new TaskVariantDto { Data = Encoding.UTF8.GetBytes(variantData), GeneratorVersion = allowedVersion.ToString(), Id = 7, Number = "test", Version = 1 }; Assert.Throws <Exception>(() => { dataServiceMock .Setup( srv => srv.GetVariantAsync(It.Is <long>(l => l == TaskId), It.Is <Guid>(g => g == _sessionGuid))) .Callback(() => dataServiceMock.Raise(mock => mock.GetVariantCompleted += null, new GetVariantCompletedEventArgs(new object[] { taskVariantInfo }, null, false, null))) .Verifiable(); SetupCloseAsync(dataServiceMock); using (var wrapper = DisposableWcfClientWrapper.Create(dataServiceMock.Object)) { var variantProvider = new VariantProvider( TaskId, _sessionGuid, new[] { new Version(allowedVersion.Major + 1, allowedVersion.Minor) }, wrapper); variantProvider.DownloadVariantAsync(); } }); }
/// <summary> Регистрирует завершение выполнения задания </summary> /// <param name="info"> Новый вариант </param> /// <param name="taskId"> Id задания, для которого вариант. Слегка избыточен, но пусть будет. </param> /// <param name="updateExistent"> Обновить существующую версию? </param> /// <returns> True, если успешно сохранили. False, если вариант с таким номером уже есть в этом задании. </returns> public void SaveVariant(TaskVariantDto info, long taskId, bool updateExistent = false) { if (info == null) { throw new ArgumentException("info"); } if (info.Version.HasValue) { throw new ArgumentException("info.Version"); } using (var op = _operationFactory.Create()) { var task = op.DataContext.Query.Find <Task>(taskId); if (task == null) { throw new Exception("Не удалось сохранить вариант: не найдено задание с полученным Id."); } if (updateExistent) { var existVariant = op.DataContext.Query.Find <TaskVariant>(info.Id); if (existVariant == null) { throw new Exception("Не удалось сохранить вариант: не найден вариант с полученным Id."); } if (existVariant.Number != info.Number) { throw new Exception("Нельзя изменить номер варианта на обновлении."); } if (existVariant.Task.Id != taskId) { throw new Exception("Не удалось сохранить вариант: не совпал номер задания."); } existVariant.Data = info.Data; } else { if (string.IsNullOrWhiteSpace(info.Number)) { throw new Exception("Не удалось сохранить вариант: не указан номер задания."); } if (info.Data == null || !info.Data.Any()) { throw new Exception("Не удалось сохранить вариант: отсутствуют данные для сохранения."); } if (op.QueryOf <TaskVariant>().Any(v => v.Number == info.Number)) { throw new Exception(string.Format("Не удалось сохранить вариант: номер \"{0}\" уже занят.", info.Number)); } var newVariant = op.DataContext.Factory.Create <TaskVariant>(); newVariant.Number = info.Number; newVariant.GeneratorVersion = info.GeneratorVersion; newVariant.Data = info.Data; newVariant.Task = task; } op.Complete(); } }