public void NoSePuedeIniciarJornadaConJornadaIniciada(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            string usuario)
        {
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);

            Action action = () => sut.IniciarJornada(usuario);

            action.ShouldThrow<InvalidOperationException>()
                .WithMessage("Ya existe una jornada iniciada. Debe terminar la jornada iniciada antes de iniciar una nueva.");
            commandsMock.Verify(c => c.CrearJornada(It.IsAny<Jornada>(), usuario), Times.Never());
        }
        public void NoSePuedeIniciarPausaConFechaAnteriorAlInicioDeLaJornada(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            string usuario)
        {
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);
            timeProviderMock.Setup(t => t.Now).Returns(jornada.Inicio.AddHours(-1));

            Action accion = () => sut.IniciarPausa(usuario);

            accion.ShouldThrow<InvalidOperationException>()
                .WithMessage("No se puede iniciar una pausa en una fecha anterior al inicio de la jornada.");
            commandsMock.Verify(c => c.ActualizarJornada(jornada, usuario), Times.Never());
        }
        public void NoSePuedeIniciarJornadaSiYaExisteJornadaParaElNuevoDia(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            DateTime finJornada,
            DateTime diaNuevaJornada,
            string usuario)
        {
            jornada.Finalizar(finJornada);
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);
            queriesMock.Setup(q => q.ExisteJornada(usuario, diaNuevaJornada)).Returns(true);
            timeProviderMock.Setup(t => t.Today).Returns(diaNuevaJornada);

            Action action = () => sut.IniciarJornada(usuario);

            action.ShouldThrow<InvalidOperationException>()
                .WithMessage("Ya existe una jornada para la fecha indicada.");
            commandsMock.Verify(c => c.CrearJornada(It.IsAny<Jornada>(), usuario), Times.Never());
        }
        public void SePuedeTerminarPausaEnCondicionesCorrectas(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            DateTime inicioPausa,
            string usuario)
        {
            jornada.IniciarPausa(inicioPausa);
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);
            timeProviderMock.Setup(t => t.Now).Returns(inicioPausa.AddHours(1));

            sut.TerminarPausa(usuario);

            commandsMock.Verify(c => c.ActualizarJornada(jornada, usuario), Times.Once());
        }
        public void SePuedeIniciarJornadaConVerificacionesCorrectas(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            DateTime finJornada,
            DateTime diaNuevaJornada,
            string usuario)
        {
            jornada.Finalizar(finJornada);
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);
            queriesMock.Setup(q => q.ExisteJornada(usuario, diaNuevaJornada)).Returns(false);
            timeProviderMock.Setup(t => t.Now).Returns(diaNuevaJornada);

            sut.IniciarJornada(usuario);

            commandsMock.Verify(c => c.CrearJornada(It.IsAny<Jornada>(), usuario), Times.Once());
        }
        public void NoSePuedeTerminarPausaSiNoHayPausaIniciada(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            string usuario)
        {
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);
            timeProviderMock.Setup(t => t.Now).Returns(jornada.Inicio.AddHours(1));

            Action accion = () => sut.TerminarPausa(usuario);

            accion.ShouldThrow<InvalidOperationException>()
                .WithMessage("No se puede terminar una pausa cuando no hay una pausa iniciada.");
            commandsMock.Verify(c => c.ActualizarJornada(jornada, usuario), Times.Never());
        }
        public void NoSePuedeTerminarPausaConFechaAnteriorAInicioPausa(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            DateTime inicioPausa,
            string usuario)
        {
            jornada.IniciarPausa(inicioPausa);
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);
            timeProviderMock.Setup(t => t.Now).Returns(inicioPausa.AddHours(-1));

            Action accion = () => sut.TerminarPausa(usuario);

            accion.ShouldThrow<InvalidOperationException>()
                .WithMessage("La fecha de finalización debe ser posterior a la fecha de inicio.");
            commandsMock.Verify(c => c.ActualizarJornada(jornada, usuario), Times.Never());
        }
        public void NoSePuedeTerminarJornadaSiLaUltimaJornadaEstaTerminada(
            [Frozen]Mock<IJornadaQueries> queriesMock,
            [Frozen]Mock<IJornadaCommands> commandsMock,
            [Frozen]Mock<ITimeProvider> timeProviderMock,
            JornadaService sut,
            Jornada jornada,
            DateTime finJornada,
            string usuario)
        {
            jornada.Finalizar(finJornada);
            queriesMock.Setup(q => q.ObtenerUltimaJornada(usuario)).Returns(jornada);
            timeProviderMock.Setup(t => t.Now).Returns(jornada.Inicio.AddHours(8));

            Action accion = () => sut.TerminarJornada(usuario);

            accion.ShouldThrow<InvalidOperationException>()
                .WithMessage("No se puede terminar un periodo ya terminado.");
            commandsMock.Verify(c => c.ActualizarJornada(jornada, usuario), Times.Never());
        }