Test terminal can set dimensions

- ShellTest now has fields which can be used to
  change terminal default widht/height.
- Backed by properties so can be used with
  `spring.shell.test.terminal-width` and
  `spring.shell.test.terminal-height`.
- Backport #656
- Fixes #659
This commit is contained in:
Janne Valkealahti
2023-02-05 15:24:36 +00:00
parent 3ed49d1bd6
commit edfe67c00d
10 changed files with 234 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
[[using-shell-testing-basics]]
==== Basics
=== Basics
ifndef::snippets[:snippets: ../../test/java/org/springframework/shell/docs]
Spring Shell provides a number of utilities and annotations to help when testing your application.

View File

@@ -0,0 +1,27 @@
[[using-shell-testing-settings]]
=== Settings
ifndef::snippets[:snippets: ../../test/java/org/springframework/shell/docs]
Built in emulation uses terminal width 80 and height 24 on default.
Changing dimensions is useful if output would span into multiple
lines and you don't want to handle those cases in a tests.
These can be changed using properties `spring.shell.test.terminal-width`
or `spring.shell.test.terminal-height`.
====
[source, java, indent=0]
----
include::{snippets}/TestingSnippets.java[tag=testing-shelltest-dimensions-props]
----
====
`ShellTest` annotation have fields `terminalWidth` and `terminalHeight`
which can also be used to change dimensions.
====
[source, java, indent=0]
----
include::{snippets}/TestingSnippets.java[tag=testing-shelltest-dimensions-field]
----
====

View File

@@ -16,3 +16,5 @@ NOTE: Testing support is currently under development and will be
unstable for various parts.
include::using-shell-testing-basics.adoc[]
include::using-shell-testing-settings.adoc[]

View File

@@ -81,4 +81,23 @@ class TestingSnippets {
}
}
// end::testing-shelltest-noninteractive[]
class Dump1 {
// tag::testing-shelltest-dimensions-props[]
@ShellTest(properties = {
"spring.shell.test.terminal-width=120",
"spring.shell.test.terminal-height=40"
})
class ShellSettingsSample {}
// end::testing-shelltest-dimensions-props[]
}
class Dump2 {
// tag::testing-shelltest-dimensions-field[]
@ShellTest(terminalWidth = 120, terminalHeight = 40)
class ShellSettingsSample {}
// end::testing-shelltest-dimensions-field[]
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2022 the original author or authors.
* Copyright 2022-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.shell.boot.JLineShellAutoConfiguration;
import org.springframework.shell.boot.TerminalCustomizer;
@@ -33,6 +34,7 @@ import org.springframework.shell.test.jediterm.terminal.ui.JediTermWidget;
import org.springframework.shell.test.jediterm.terminal.ui.TerminalSession;
@AutoConfiguration(before = JLineShellAutoConfiguration.class)
@EnableConfigurationProperties(SpringShellTestProperties.class)
public class ShellAutoConfiguration {
@Bean
@@ -55,8 +57,8 @@ public class ShellAutoConfiguration {
}
@Bean
TerminalSession terminalSession(TtyConnector ttyConnector) {
JediTermWidget widget = new JediTermWidget(80, 24);
TerminalSession terminalSession(TtyConnector ttyConnector, SpringShellTestProperties properties) {
JediTermWidget widget = new JediTermWidget(properties.getTerminalWidth(), properties.getTerminalHeight());
widget.setTtyConnector(ttyConnector);
return widget;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2022 the original author or authors.
* Copyright 2022-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,6 +28,8 @@ import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration;
import org.springframework.boot.test.autoconfigure.filter.TypeExcludeFilters;
import org.springframework.boot.test.autoconfigure.properties.PropertyMapping;
import org.springframework.boot.test.autoconfigure.properties.SkipPropertyMapping;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
import org.springframework.core.env.Environment;
@@ -61,6 +63,22 @@ public @interface ShellTest {
*/
String[] properties() default {};
/**
* Set emulated terminal width.
*
* @return emulated terminal width
*/
@PropertyMapping(value = "spring.shell.test.terminal-width", skip = SkipPropertyMapping.ON_DEFAULT_VALUE)
int terminalWidth() default 80;
/**
* Set emulated terminal height.
*
* @return emulated terminal height
*/
@PropertyMapping(value = "spring.shell.test.terminal-height", skip = SkipPropertyMapping.ON_DEFAULT_VALUE)
int terminalHeight() default 24;
/**
* Determines if default filtering should be used with
* {@link SpringBootApplication @SpringBootApplication}.

View File

@@ -0,0 +1,53 @@
/*
* Copyright 2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.shell.test.autoconfigure;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Configuration properties for shell test.
*
* @author Janne Valkealahti
*/
@ConfigurationProperties(prefix = "spring.shell.test")
public class SpringShellTestProperties {
/**
* Width of an emulated terminal.
*/
private int terminalWidth = 80;
/**
* Height of an emulated terminal.
*/
private int terminalHeight = 24;
public int getTerminalWidth() {
return terminalWidth;
}
public void setTerminalWidth(int terminalWidth) {
this.terminalWidth = terminalWidth;
}
public int getTerminalHeight() {
return terminalHeight;
}
public void setTerminalHeight(int terminalHeight) {
this.terminalHeight = terminalHeight;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2022 the original author or authors.
* Copyright 2022-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.shell.test.autoconfigure.app.ExampleShellApplication;
import org.springframework.shell.test.jediterm.terminal.ui.TerminalSession;
import org.springframework.test.context.ContextConfiguration;
import static org.assertj.core.api.Assertions.assertThat;
@@ -30,15 +31,25 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Janne Valkealahti
*/
@ShellTest(properties = "spring.profiles.active=test")
@ShellTest(properties = { "spring.profiles.active=test", "spring.shell.test.terminal-width=81",
"spring.shell.test.terminal-height=25" })
@ContextConfiguration(classes = ExampleShellApplication.class)
public class ShellTestPropertiesIntegrationTests {
@Autowired
private Environment environment;
@Autowired
private TerminalSession session;
@Test
void environmentWithNewProfile() {
assertThat(this.environment.getActiveProfiles()).containsExactly("test");
}
@Test
void dimensionsSet() {
assertThat(session.getTerminal().getTerminalWidth()).isEqualTo(81);
assertThat(session.getTerminal().getTerminalHeight()).isEqualTo(25);
}
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright 2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.shell.test.autoconfigure;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.shell.test.autoconfigure.app.ExampleShellApplication;
import org.springframework.shell.test.jediterm.terminal.ui.TerminalSession;
import org.springframework.test.context.ContextConfiguration;
import static org.assertj.core.api.Assertions.assertThat;
@ShellTest(terminalWidth = 81, terminalHeight = 25)
@ContextConfiguration(classes = ExampleShellApplication.class)
class ShellTestTerminalDimensionsIntegrationTests {
@Autowired
private TerminalSession session;
@Test
void dimensionsSet() {
assertThat(session.getTerminal().getTerminalWidth()).isEqualTo(81);
assertThat(session.getTerminal().getTerminalHeight()).isEqualTo(25);
}
}

View File

@@ -0,0 +1,56 @@
/*
* Copyright 2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.shell.test.autoconfigure;
import org.junit.jupiter.api.Test;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import static org.assertj.core.api.Assertions.assertThat;
class SpringShellTestPropertiesTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
@Test
public void defaultNoPropertiesSet() {
this.contextRunner
.withUserConfiguration(Config1.class)
.run((context) -> {
SpringShellTestProperties properties = context.getBean(SpringShellTestProperties.class);
assertThat(properties.getTerminalWidth()).isEqualTo(80);
assertThat(properties.getTerminalHeight()).isEqualTo(24);
});
}
@Test
public void setProperties() {
this.contextRunner
.withPropertyValues("spring.shell.test.terminal-width=81")
.withPropertyValues("spring.shell.test.terminal-height=25")
.withUserConfiguration(Config1.class)
.run((context) -> {
SpringShellTestProperties properties = context.getBean(SpringShellTestProperties.class);
assertThat(properties.getTerminalWidth()).isEqualTo(81);
assertThat(properties.getTerminalHeight()).isEqualTo(25);
});
}
@EnableConfigurationProperties({ SpringShellTestProperties.class })
private static class Config1 {
}
}