Split sample app
- spring-shell-sample-commands and spring-shell-sample-e2e - Needed changes in e2e tests and workflow - Fixes #754
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
plugins {
|
||||
id 'org.springframework.shell.sample'
|
||||
id 'org.springframework.boot'
|
||||
id 'org.graalvm.buildtools.native'
|
||||
}
|
||||
|
||||
description = 'Spring Shell Sample Commands'
|
||||
|
||||
dependencies {
|
||||
management platform(project(":spring-shell-management"))
|
||||
implementation project(':spring-shell-starters:spring-shell-starter-jna')
|
||||
testImplementation project(':spring-shell-starters:spring-shell-starter-test')
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
testImplementation 'org.awaitility:awaitility'
|
||||
}
|
||||
|
||||
springBoot {
|
||||
buildInfo()
|
||||
}
|
||||
|
||||
if (project.hasProperty('springShellSampleE2E') && springShellSampleE2E.toBoolean()) {
|
||||
bootJar {
|
||||
archiveName = "$baseName.$extension"
|
||||
}
|
||||
}
|
||||
|
||||
graalvmNative {
|
||||
metadataRepository {
|
||||
enabled = true
|
||||
}
|
||||
binaries {
|
||||
main {
|
||||
if (project.hasProperty('springShellSampleMusl') && springShellSampleMusl.toBoolean()) {
|
||||
buildArgs.add('--static')
|
||||
buildArgs.add('--libc=musl')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ plugins {
|
||||
id 'org.graalvm.buildtools.native'
|
||||
}
|
||||
|
||||
description = 'Spring Shell Samples'
|
||||
description = 'Spring Shell Sample E2E'
|
||||
|
||||
dependencies {
|
||||
management platform(project(":spring-shell-management"))
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright 2017-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.samples;
|
||||
|
||||
import org.jline.utils.AttributedString;
|
||||
import org.jline.utils.AttributedStyle;
|
||||
|
||||
import org.springframework.boot.Banner.Mode;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.shell.command.annotation.CommandScan;
|
||||
import org.springframework.shell.jline.PromptProvider;
|
||||
|
||||
/**
|
||||
* Main entry point for the application.
|
||||
*
|
||||
* <p>Creates the application context and start the REPL.</p>
|
||||
*
|
||||
* @author Eric Bottard
|
||||
* @author Janne Valkealahti
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@CommandScan
|
||||
public class SpringShellSample {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
SpringApplication application = new SpringApplication(SpringShellSample.class);
|
||||
application.setBannerMode(Mode.OFF);
|
||||
application.run(args);
|
||||
// TODO: follow up with boot why spring.main.banner-mode=off doesn't work
|
||||
// SpringApplication.run(SpringShellSample.class, args);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PromptProvider myPromptProvider() {
|
||||
return () -> new AttributedString("my-shell:>", AttributedStyle.DEFAULT.foreground(AttributedStyle.YELLOW));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
spring:
|
||||
main:
|
||||
banner-mode: off
|
||||
shell:
|
||||
## pick global default option naming
|
||||
# option:
|
||||
# naming:
|
||||
# case-type: noop
|
||||
# case-type: camel
|
||||
# case-type: snake
|
||||
# case-type: kebab
|
||||
# case-type: pascal
|
||||
config:
|
||||
env: SPRING_SHELL_SAMPLES_USER_HOME
|
||||
location: "{userconfig}/spring-shell-samples"
|
||||
history:
|
||||
name: spring-shell-samples-history.log
|
||||
command:
|
||||
help:
|
||||
grouping-mode: group
|
||||
completion:
|
||||
root-command: spring-shell-samples
|
||||
## disable console logging
|
||||
logging:
|
||||
pattern:
|
||||
console:
|
||||
## log debug from a cli
|
||||
# file:
|
||||
# name: shell.log
|
||||
# level:
|
||||
# root: debug
|
||||
# org:
|
||||
# springframework:
|
||||
# shell: debug
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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.
|
||||
* 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.samples;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.assertj.core.api.Condition;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.shell.test.ShellAssertions;
|
||||
import org.springframework.shell.test.ShellTestClient;
|
||||
import org.springframework.shell.test.ShellTestClient.BaseShellSession;
|
||||
import org.springframework.shell.test.ShellTestClient.InteractiveShellSession;
|
||||
import org.springframework.shell.test.ShellTestClient.NonInteractiveShellSession;
|
||||
import org.springframework.shell.test.autoconfigure.ShellTest;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
import org.springframework.test.annotation.DirtiesContext.ClassMode;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.awaitility.Awaitility.await;
|
||||
|
||||
@ShellTest(terminalWidth = 120)
|
||||
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
|
||||
public class AbstractSampleTests {
|
||||
|
||||
@Autowired
|
||||
protected ShellTestClient client;
|
||||
|
||||
protected void assertScreenContainsText(BaseShellSession<?> session, String text) {
|
||||
await().atMost(2, TimeUnit.SECONDS).untilAsserted(() -> {
|
||||
ShellAssertions.assertThat(session.screen()).containsText(text);
|
||||
});
|
||||
}
|
||||
|
||||
protected void assertScreenNotContainsText(BaseShellSession<?> session, String textFound, String textNotFound) {
|
||||
Condition<String> notCondition = new Condition<>(line -> line.contains(textNotFound),
|
||||
String.format("Text '%s' not found", textNotFound));
|
||||
|
||||
await().atMost(2, TimeUnit.SECONDS).untilAsserted(() -> {
|
||||
ShellAssertions.assertThat(session.screen()).containsText(textFound);
|
||||
List<String> lines = session.screen().lines();
|
||||
assertThat(lines).areNot(notCondition);
|
||||
});
|
||||
}
|
||||
|
||||
protected BaseShellSession<?> createSession(String command, boolean interactive) {
|
||||
if (interactive) {
|
||||
InteractiveShellSession session = client.interactive().run();
|
||||
session.write(session.writeSequence().command(command).build());
|
||||
return session;
|
||||
}
|
||||
else {
|
||||
String[] commands = command.split(" ");
|
||||
NonInteractiveShellSession session = client.nonInterative(commands).run();
|
||||
return session;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user