public void Add_ValidModelLicenseTypeWithResultPost_ReturnsRedirect()
        {
            var computerFake = new Computer
                                   {
                                       LicenseType = "WinXP",
                                   };

            var computerDataService = new Mock<IDataService<Computer>>();
            computerDataService.Setup(c => c.Insert(It.IsAny<Computer>(), It.IsAny<Guid>())).Verifiable();

            var windowsLicenseDataServiceMock = new Mock<IDataService<WindowsLicense>>();
            windowsLicenseDataServiceMock.Setup(w => w.SelectOne(It.IsAny<Expression<Func<WindowsLicense, bool>>>()))
                .Returns(new WindowsLicense
                             {
                                 Id = "123456",
                                 LicenseType = computerFake.LicenseType,
                             });

            var controller = new ComputerController(computerDataService.Object,
                                                    new Mock<IFormsAuthenticationService>().Object,
                                                    windowsLicenseDataServiceMock.Object,
                                                    new Mock<IDataService<Volunteer>>().Object,
                                                    new Mock<IDataService<Recipient>>().Object);

            ActionResult result = controller.Add(computerFake);

            Assert.IsInstanceOf<RedirectToRouteResult>(result);
            computerDataService.VerifyAll();
        }
        public ActionResult Add(Computer model)
        {
            // Only Windows machines require a license.
            if (!string.IsNullOrEmpty(model.LicenseType))
            {
                WindowsLicense license =
                    windowsLicenseDataService.SelectOne(w => !w.Installed && w.LicenseType == model.LicenseType);
                if (license == null)
                {
                    ModelState.AddModelError("LicenseType",
                                             string.Format("Sorry, we are out of {0} licenses.", model.LicenseType));
                    return View(model);
                }
                model.WindowsLicense = license.Id;
            }

            Volunteer volunteer =
                volunteerDataService.SelectOne(v => v.Id == formsAuthenticationService.GetVolunteerID(User));

            model.Active = true;
            model.ComputerStatus = "Build";
            model.CreateByVolunteer = volunteer;
            model.CreateDate = DateTime.Now;
            model.Id = Guid.NewGuid();
            model.LifebyteNumber = computerDataService.NextLbNumber();
            model.LastModByVolunteer = volunteer;
            model.LastModDate = DateTime.Now;

            computerDataService.Insert(model, model.Id);

            return RedirectToAction("Edit", "Computer", new {id = model.Id});
        }
        public void Manifest_ReturnsView()
        {
            var fakeComputer = new Computer
                                   {
                                       Id = Guid.NewGuid(),
                                       ManifestHtml =
                                           @"
                                                <html>
                                                    <head><title>LB0124</title></head>
                                                    <body>
                                                        <p>Hello World LB0124</p>
                                                    </body>
                                                </html>"
                                   };

            var computerDataService = new Mock<IDataService<Computer>>();

            computerDataService.Setup(c => c.SelectOne(It.IsAny<Expression<Func<Computer, bool>>>()))
                .Returns(fakeComputer);

            var controller = new ComputerController(computerDataService.Object,
                                                    new Mock<IFormsAuthenticationService>().Object,
                                                    new Mock<IDataService<WindowsLicense>>().Object,
                                                    new Mock<IDataService<Volunteer>>().Object,
                                                    new Mock<IDataService<Recipient>>().Object);

            ActionResult result = controller.Manifest(fakeComputer.Id);

            Assert.IsInstanceOf<ViewResult>(result);
        }
        public void Edit_ValidModel_ReturnsRedirect()
        {
            var computerFake = new Computer
                                   {
                                       WindowsLicense = "1234",
                                   };

            var computerDataServiceMock = new Mock<IDataService<Computer>>();
            computerDataServiceMock.Setup(c => c.Update(It.IsAny<Computer>())).Verifiable();
            computerDataServiceMock.Setup(c => c.SelectOne(It.IsAny<Expression<Func<Computer, bool>>>()))
                .Returns(computerFake);

            var formsAuthenticationServiceMock = new Mock<IFormsAuthenticationService>();
            formsAuthenticationServiceMock.Setup(f => f.GetVolunteerID(null))
                .Returns(Guid.NewGuid());

            var volunterDataServiceMock = new Mock<IDataService<Volunteer>>();
            volunterDataServiceMock.Setup(v => v.SelectOne(It.IsAny<Expression<Func<Volunteer, bool>>>()))
                .Returns(new Volunteer());

            var windowsLicenseFake = new WindowsLicense();
            var windowsLicenseDataServiceMock = new Mock<IDataService<WindowsLicense>>();
            windowsLicenseDataServiceMock.Setup(w => w.SelectOne(It.IsAny<Expression<Func<WindowsLicense, bool>>>()))
                .Returns(windowsLicenseFake);
            windowsLicenseDataServiceMock.Setup(w => w.Update(windowsLicenseFake)).Verifiable();

            var controller = new ComputerController(computerDataServiceMock.Object,
                                                    formsAuthenticationServiceMock.Object,
                                                    windowsLicenseDataServiceMock.Object,
                                                    volunterDataServiceMock.Object,
                                                    new Mock<IDataService<Recipient>>().Object);

            ActionResult result = controller.Edit(computerFake);

            Assert.IsInstanceOf<RedirectToRouteResult>(result);
            computerDataServiceMock.VerifyAll();
            windowsLicenseDataServiceMock.VerifyAll();
        }
        public ActionResult Edit(Computer model)
        {
            if (!ModelState.IsValid)
            {
                return View();
            }

            Volunteer volunteer =
                volunteerDataService.SelectOne(v => v.Id == formsAuthenticationService.GetVolunteerID(User));

            Computer originalComputer = computerDataService.SelectOne(c => c.Id == model.Id);

            model.Active = originalComputer.Active;
            model.CreateByVolunteer = originalComputer.CreateByVolunteer;
            model.CreateDate = originalComputer.CreateDate;
            model.LastModByVolunteer = volunteer;
            model.LastModDate = DateTime.Now;

            // The request is null if this action is being tested.
            // Hanselman's post in the URL above has a good way of mocking the request when we get time to work on it.
            if (Request != null && Request.Files.Count == 1)
            {
                HttpPostedFileBase manifest = Request.Files[0];
                if (manifest != null
                    && manifest.ContentLength > 0
                    && manifest.ContentType == "text/html")
                {
                    var manifestContent = new StringBuilder();
                    Stream manifestStream = manifest.InputStream;
                    var manifestReader = new StreamReader(manifestStream);
                    string line;
                    while ((line = manifestReader.ReadLine()) != null)
                    {
                        manifestContent.Append(line);
                    }

                    model.ManifestHtml = manifestContent.ToString();
                }
            }

            // You cannot update the license or the LB number.
            model.WindowsLicense = originalComputer.WindowsLicense;
            model.LicenseType = originalComputer.LicenseType;
            model.LifebyteNumber = originalComputer.LifebyteNumber;

            computerDataService.Update(model);

            WindowsLicense windowsLicense = windowsLicenseDataService.SelectOne(w => w.Id == model.WindowsLicense);
            windowsLicense.Installed = true;

            windowsLicenseDataService.Update(windowsLicense);

            return RedirectToAction("Index");
        }