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();
                }
            });
        }
Exemple #3
0
        /// <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();
            }
        }