public async Task PtyMessageHandler_Handle_OpenNewTabRequestReturnsOpenNewTabReplyOnSuccess()
        {
            // Given
            var terminal = new Terminal
            {
                Id      = Guid.NewGuid().ToString(),
                Command = "bash",
            };
            var request     = new OpenNewTabRequest();
            var mockProcess = new Mock <IProcess>();
            var process     = mockProcess.Object;

            mockProcess.SetupGet(p => p.IsRunning).Returns(true);

            MockEngine
            .Setup(e => e.StartNew()).Returns(terminal);

            MockEngine
            .Setup(e => e.TryGetProcess(terminal, out process)).Returns(true);

            // When
            var handler = new PtyMessageHandler(MockEngine.Object, MockConfig.Object, MockLogger.Object);
            var result  = await handler.Handle(request);

            // Then
            var reply = Assert.IsType <OpenNewTabReply>(result);

            Assert.Equal(terminal.Id, reply.Id);
        }
        public async Task PtyMessageHandler_Handle_OpenNewCreatesANewTerminalWithTheGivenCommand()
        {
            // Given
            var terminal = new Terminal
            {
                Id      = Guid.NewGuid().ToString(),
                Command = "hello",
            };

            MockConfig.SetupGet(c => c["Command"]).Returns("hello");

            var mockProcess = new Mock <IProcess>();
            var process     = mockProcess.Object;

            mockProcess.SetupGet(p => p.IsRunning).Returns(true);

            MockEngine
            .Setup(e => e.StartNew("hello", It.IsAny <IReadOnlyList <string> >())).Returns(terminal);

            MockEngine
            .Setup(e => e.TryGetProcess(terminal, out process)).Returns(true);

            // When
            var request = new OpenNewTabRequest();
            var handler = new PtyMessageHandler(MockEngine.Object, MockConfig.Object, MockLogger.Object);
            var result  = await handler.Handle(request);

            // Then
            MockEngine.Verify(e => e.StartNew("hello", new List <string>()));
        }
        public async Task PtyMessageHandler_Handle_ResizeTabRequestLogsErrorMessageWhenProcessIsNotFound()
        {
            // Given
            var terminal = new Terminal
            {
                Id      = Guid.NewGuid().ToString(),
                Command = "bash",
            };
            var mockProcess = new Mock <IProcess>();
            var process     = mockProcess.Object;

            MockEngine
            .Setup(e => e.TryGetProcess(terminal.Id, out process)).Returns(false);

            // When
            var request = new ResizeTabRequest(tabId: terminal.Id);
            var handler = new PtyMessageHandler(MockEngine.Object, MockConfig.Object, MockLogger.Object);

            await handler.Handle(request);

            // Then
            MockLogger.Verify(
                l => l.LogError("Error ({messageName}): can't find terminal with id {terminalId}", nameof(ResizeTabRequest), terminal.Id)
                );
        }
        public async Task PtyMessageHandler_Handle_ResizesThePtyOnResizeTabRequest()
        {
            // Given
            var terminal = new Terminal
            {
                Id      = Guid.NewGuid().ToString(),
                Command = "bash",
            };
            var mockProcess = new Mock <IProcess>();
            var process     = mockProcess.Object;

            MockEngine
            .Setup(e => e.TryGetProcess(terminal.Id, out process)).Returns(true);

            // When
            var request = new ResizeTabRequest(tabId: terminal.Id);
            var handler = new PtyMessageHandler(MockEngine.Object, MockConfig.Object, MockLogger.Object);

            await handler.Handle(request);

            // Then
            mockProcess.Verify(
                p => p.SetWindowSize(24, 80)
                );
        }
        public async Task PtyMessageHandler_Handle_ReturnsAnErrorMessageOnOpenNewTabRequestWhenProcessIsNotFound()
        {
            // Given
            var terminal = new Terminal
            {
                Id      = Guid.NewGuid().ToString(),
                Command = "bash",
            };
            var request     = new OpenNewTabRequest(id: "123", title: string.Empty);
            var mockProcess = new Mock <IProcess>();
            var process     = mockProcess.Object;

            MockEngine
            .Setup(e => e.StartNew()).Returns(terminal);

            MockEngine
            .Setup(e => e.TryGetProcess(terminal, out process)).Returns(false);

            // When
            var handler = new PtyMessageHandler(MockEngine.Object, MockConfig.Object, MockLogger.Object);
            var result  = await handler.Handle(request);

            // Then
            var error = Assert.IsType <ErrorReply>(result);

            Assert.NotNull(error.Id);
            Assert.Equal(request.Id, error.ParentId);
            Assert.Equal($"Can't find terminal with id {terminal.Id}.", error.Message);
        }
        public async Task PtyMessageHandler_Handle_ReturnsUnknownMessageEventForAnUnknownMessage()
        {
            // Given
            var message = new DummyEvent();

            // When
            var handler = new PtyMessageHandler(MockEngine.Object, MockConfig.Object, MockLogger.Object);
            var result  = await handler.Handle(message);

            // Then
            var response = Assert.IsType <UnknownMessageEvent>(result);

            Assert.Equal(nameof(DummyEvent), response.Name);
        }
        public async Task PtyMessageHandler_Handle_WritesALogMessageWhenGivenAnUnknownMessage()
        {
            // Given
            var message = new DummyEvent();

            // When
            var handler = new PtyMessageHandler(MockEngine.Object, MockConfig.Object, MockLogger.Object);
            var result  = await handler.Handle(message);

            // Then
            MockLogger.Verify(
                logger => logger.LogWarning("UnknownMessage {messageName}", nameof(DummyEvent)),
                Times.Once
                );
        }