Restore integration tests

The new layout broke some integration tests as it is now necessary to
click on a link to display additional options.

 Tests have also been rewritten to take the new design (and new features)
 into account.
This commit is contained in:
Stephane Nicoll
2015-12-11 13:48:26 +01:00
parent 22bec6d00d
commit 89330da312
4 changed files with 210 additions and 81 deletions

View File

@@ -27,6 +27,8 @@ import static org.junit.Assert.assertTrue
*/ */
class ProjectAssert { class ProjectAssert {
public static final DEFAULT_PACKAGE_NAME = 'com.example'
private static final DEFAULT_APPLICATION_NAME = generateDefaultApplicationName() private static final DEFAULT_APPLICATION_NAME = generateDefaultApplicationName()
final File dir final File dir
@@ -95,29 +97,32 @@ class ProjectAssert {
this this
} }
ProjectAssert isJavaProject(String expectedApplicationName) { ProjectAssert isJavaProject(String expectedPackageName, String expectedApplicationName) {
hasFile("src/main/java/com/example/${expectedApplicationName}.java", String packageName = expectedPackageName.replace('.', '/')
"src/test/java/com/example/${expectedApplicationName}Tests.java", hasFile("src/main/java/$packageName/${expectedApplicationName}.java",
"src/test/java/$packageName/${expectedApplicationName}Tests.java",
'src/main/resources/application.properties') 'src/main/resources/application.properties')
} }
ProjectAssert isJavaProject() { ProjectAssert isJavaProject() {
isJavaProject(DEFAULT_APPLICATION_NAME) isJavaProject(DEFAULT_PACKAGE_NAME, DEFAULT_APPLICATION_NAME)
} }
ProjectAssert isGroovyProject(String expectedApplicationName) { ProjectAssert isGroovyProject(String expectedPackageName, String expectedApplicationName) {
String codeLocation = (mavenProject ? 'java' : 'groovy') String codeLocation = (mavenProject ? 'java' : 'groovy')
hasFile("src/main/$codeLocation/com/example/${expectedApplicationName}.groovy", String packageName = expectedPackageName.replace('.', '/')
"src/test/$codeLocation/com/example/${expectedApplicationName}Tests.groovy", hasFile("src/main/$codeLocation/$packageName/${expectedApplicationName}.groovy",
"src/test/$codeLocation/$packageName/${expectedApplicationName}Tests.groovy",
'src/main/resources/application.properties') 'src/main/resources/application.properties')
} }
ProjectAssert isGroovyProject() { ProjectAssert isGroovyProject() {
isGroovyProject(DEFAULT_APPLICATION_NAME) isGroovyProject(DEFAULT_PACKAGE_NAME, DEFAULT_APPLICATION_NAME)
} }
ProjectAssert isJavaWarProject(String expectedApplicationName) { ProjectAssert isJavaWarProject(String expectedApplicationName) {
isJavaProject(expectedApplicationName).hasStaticAndTemplatesResources(true) isJavaProject(DEFAULT_PACKAGE_NAME, expectedApplicationName)
.hasStaticAndTemplatesResources(true)
.hasFile('src/main/java/com/example/ServletInitializer.java') .hasFile('src/main/java/com/example/ServletInitializer.java')
} }

View File

@@ -16,6 +16,7 @@
package io.spring.initializr.web package io.spring.initializr.web
import io.spring.initializr.test.ProjectAssert
import org.junit.Test import org.junit.Test
import org.springframework.http.HttpEntity import org.springframework.http.HttpEntity
@@ -50,7 +51,7 @@ class MainControllerEnvIntegrationTests extends AbstractInitializrControllerInte
@Test @Test
void generateProjectWithInvalidName() { void generateProjectWithInvalidName() {
downloadZip('/starter.zip?style=data-jpa&name=Invalid') downloadZip('/starter.zip?style=data-jpa&name=Invalid')
.isJavaProject('FooBarApplication') .isJavaProject(ProjectAssert.DEFAULT_PACKAGE_NAME, 'FooBarApplication')
.isMavenProject() .isMavenProject()
.hasStaticAndTemplatesResources(false).pomAssert() .hasStaticAndTemplatesResources(false).pomAssert()
.hasDependenciesCount(2) .hasDependenciesCount(2)

View File

@@ -17,13 +17,16 @@
package io.spring.initializr.web package io.spring.initializr.web
import geb.Browser import geb.Browser
import io.spring.initializr.test.ProjectAssert
import io.spring.initializr.web.test.HomePage import io.spring.initializr.web.test.HomePage
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.openqa.selenium.Keys
import org.openqa.selenium.WebDriver import org.openqa.selenium.WebDriver
import org.openqa.selenium.firefox.FirefoxDriver import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.firefox.FirefoxProfile import org.openqa.selenium.firefox.FirefoxProfile
import org.openqa.selenium.interactions.Actions
import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.ActiveProfiles
@@ -39,6 +42,9 @@ class ProjectGenerationSmokeTests extends AbstractInitializrControllerIntegratio
private File downloadDir private File downloadDir
private WebDriver driver private WebDriver driver
private Browser browser private Browser browser
private Actions actions
private def enterAction
@Before @Before
void setup() { void setup() {
@@ -52,8 +58,11 @@ class ProjectGenerationSmokeTests extends AbstractInitializrControllerIntegratio
"application/zip,application/x-compress,application/octet-stream"); "application/zip,application/x-compress,application/octet-stream");
driver = new FirefoxDriver(fxProfile); driver = new FirefoxDriver(fxProfile);
actions = new Actions(driver)
browser = new Browser() browser = new Browser()
browser.driver = driver browser.driver = driver
enterAction = actions.sendKeys(Keys.ENTER).build()
} }
@After @After
@@ -64,26 +73,126 @@ class ProjectGenerationSmokeTests extends AbstractInitializrControllerIntegratio
} }
@Test @Test
void createDefaultJavaProject() { void createSimpleProject() {
toHome { toHome {
page.generateProject.click() page.generateProject.click()
at HomePage at HomePage
def projectAssert = zipProjectAssert(from('demo.zip')) assertSimpleProject()
projectAssert.hasBaseDir("demo").isMavenProject().isJavaProject() .isMavenProject()
.hasStaticAndTemplatesResources(false) .pomAssert()
.pomAssert().hasDependenciesCount(2) .hasDependenciesCount(2)
.hasSpringBootStarterRootDependency().hasSpringBootStarterTest() .hasSpringBootStarterRootDependency()
.hasSpringBootStarterTest()
} }
} }
@Test @Test
void createDefaultGroovyProject() { void createSimpleProjectWithGradle() {
toHome { toHome {
page.type = 'gradle-project'
page.generateProject.click()
at HomePage
assertSimpleProject()
.isGradleProject()
.gradleBuildAssert()
.contains("compile('org.springframework.boot:spring-boot-starter')")
.contains("testCompile('org.springframework.boot:spring-boot-starter-test')")
}
}
@Test
void createSimpleProjectWithDifferentBootVersion() {
toHome {
page.bootVersion = '1.0.2.RELEASE'
page.generateProject.click()
at HomePage
assertSimpleProject()
.isMavenProject()
.pomAssert()
.hasBootVersion('1.0.2.RELEASE')
.hasDependenciesCount(2)
.hasSpringBootStarterRootDependency()
.hasSpringBootStarterTest()
}
}
@Test
void createSimpleProjectWithDependencies() {
toHome {
selectDependency(page, 'Data JPA')
selectDependency(page, 'Security')
page.generateProject.click()
at HomePage
assertSimpleProject()
.isMavenProject()
.pomAssert()
.hasDependenciesCount(3)
.hasSpringBootStarterDependency('data-jpa')
.hasSpringBootStarterDependency('security')
.hasSpringBootStarterTest()
}
}
@Test
void selectDependencyTwiceRemovesIt() {
toHome {
selectDependency(page, 'Data JPA')
selectDependency(page, 'Security')
selectDependency(page, 'Security') // remove
page.generateProject.click()
at HomePage
assertSimpleProject()
.isMavenProject()
.pomAssert()
.hasDependenciesCount(2)
.hasSpringBootStarterDependency('data-jpa')
.hasSpringBootStarterTest()
}
}
ProjectAssert assertSimpleProject() {
zipProjectAssert(from('demo.zip'))
.hasBaseDir("demo")
.isJavaProject()
.hasStaticAndTemplatesResources(false)
}
@Test
void customArtifactIdUpdateNameAutomatically() {
toHome {
page.groupId = 'org.foo'
page.generateProject.click()
at HomePage
zipProjectAssert(from('demo.zip'))
.hasBaseDir("demo")
.isJavaProject('org.foo', 'DemoApplication')
}
}
@Test
void customGroupIdIdUpdatePackageAutomatically() {
toHome {
page.artifactId = 'my-project'
page.generateProject.click()
at HomePage
zipProjectAssert(from('my-project.zip'))
.hasBaseDir("my-project")
.isJavaProject('com.example', 'MyProjectApplication')
}
}
@Test
void createGroovyProject() {
toHome {
page.advanced.click()
page.language = 'groovy' page.language = 'groovy'
page.generateProject.click() page.generateProject.click()
at HomePage at HomePage
def projectAssert = zipProjectAssert(from('demo.zip')) def projectAssert = zipProjectAssert(from('demo.zip'))
projectAssert.hasBaseDir('demo').isMavenProject().isGroovyProject() projectAssert.hasBaseDir('demo')
.isMavenProject()
.isGroovyProject()
.hasStaticAndTemplatesResources(false) .hasStaticAndTemplatesResources(false)
.pomAssert().hasDependenciesCount(3) .pomAssert().hasDependenciesCount(3)
.hasSpringBootStarterRootDependency().hasSpringBootStarterTest() .hasSpringBootStarterRootDependency().hasSpringBootStarterTest()
@@ -92,76 +201,16 @@ class ProjectGenerationSmokeTests extends AbstractInitializrControllerIntegratio
} }
@Test
void createJavaProjectWithCustomDefaults() {
toHome {
page.groupId = 'com.acme'
page.artifactId = 'foo-bar'
page.name = 'My project'
page.description = 'A description for my project'
page.dependency('web').click()
page.dependency('data-jpa').click()
page.generateProject.click()
at HomePage
def projectAssert = zipProjectAssert(from('foo-bar.zip'))
projectAssert.hasBaseDir("foo-bar").isMavenProject()
.isJavaProject('MyProjectApplication')
.hasStaticAndTemplatesResources(true)
.pomAssert().hasGroupId('com.acme').hasArtifactId('foo-bar')
.hasName('My project').hasDescription('A description for my project')
.hasSpringBootStarterDependency('web')
.hasSpringBootStarterDependency('data-jpa')
.hasSpringBootStarterTest()
}
}
@Test
void createGroovyProjectWithCustomDefaults() {
toHome {
page.language = 'groovy'
page.groupId = 'org.biz'
page.artifactId = 'groovy-project'
page.name = 'My Groovy project'
page.description = 'A description for my Groovy project'
page.dependency('web').click()
page.dependency('data-jpa').click()
page.generateProject.click()
at HomePage
def projectAssert = zipProjectAssert(from('groovy-project.zip'))
projectAssert.hasBaseDir("groovy-project").isMavenProject()
.isGroovyProject('MyGroovyProjectApplication')
.hasStaticAndTemplatesResources(true)
.pomAssert().hasGroupId('org.biz').hasArtifactId('groovy-project')
.hasName('My Groovy project').hasDescription('A description for my Groovy project')
.hasSpringBootStarterDependency('web')
.hasSpringBootStarterDependency('data-jpa')
.hasSpringBootStarterTest()
.hasDependency('org.codehaus.groovy', 'groovy')
}
}
@Test
void createSimpleGradleProject() {
toHome {
page.type = 'gradle-project'
page.dependency('data-jpa').click()
page.generateProject.click()
at HomePage
def projectAssert = zipProjectAssert(from('demo.zip'))
projectAssert.hasBaseDir("demo").isGradleProject()
.isJavaProject()
.hasStaticAndTemplatesResources(false)
}
}
@Test @Test
void createWarProject() { void createWarProject() {
toHome { toHome {
page.advanced.click()
page.packaging = 'war' page.packaging = 'war'
page.generateProject.click() page.generateProject.click()
at HomePage at HomePage
def projectAssert = zipProjectAssert(from('demo.zip')) def projectAssert = zipProjectAssert(from('demo.zip'))
projectAssert.hasBaseDir("demo").isMavenProject() projectAssert.hasBaseDir("demo")
.isMavenProject()
.isJavaWarProject() .isJavaWarProject()
.pomAssert().hasPackaging('war').hasDependenciesCount(3) .pomAssert().hasPackaging('war').hasDependenciesCount(3)
.hasSpringBootStarterDependency('web') // Added with war packaging .hasSpringBootStarterDependency('web') // Added with war packaging
@@ -170,9 +219,70 @@ class ProjectGenerationSmokeTests extends AbstractInitializrControllerIntegratio
} }
} }
@Test
void createJavaProjectWithCustomDefaults() {
toHome {
page.groupId = 'com.acme'
page.artifactId = 'foo-bar'
page.advanced.click()
page.name = 'My project'
page.description = 'A description for my project'
page.packageName = 'com.example.foo'
page.dependency('web').click()
page.dependency('data-jpa').click()
page.generateProject.click()
at HomePage
def projectAssert = zipProjectAssert(from('foo-bar.zip'))
projectAssert.hasBaseDir("foo-bar")
.isMavenProject()
.isJavaProject('com.example.foo', 'MyProjectApplication')
.hasStaticAndTemplatesResources(true)
.pomAssert()
.hasGroupId('com.acme')
.hasArtifactId('foo-bar')
.hasName('My project')
.hasDescription('A description for my project')
.hasSpringBootStarterDependency('web')
.hasSpringBootStarterDependency('data-jpa')
.hasSpringBootStarterTest()
}
}
@Test
void createGroovyProjectWithCustomDefaults() {
toHome {
page.groupId = 'org.biz'
page.artifactId = 'groovy-project'
page.advanced.click()
page.language = 'groovy'
page.name = 'My Groovy project'
page.description = 'A description for my Groovy project'
page.packageName = 'com.example.biz'
page.dependency('web').click()
page.dependency('data-jpa').click()
page.generateProject.click()
at HomePage
def projectAssert = zipProjectAssert(from('groovy-project.zip'))
projectAssert.hasBaseDir("groovy-project")
.isMavenProject()
.isGroovyProject('com.example.biz', 'MyGroovyProjectApplication')
.hasStaticAndTemplatesResources(true)
.pomAssert()
.hasGroupId('org.biz')
.hasArtifactId('groovy-project')
.hasName('My Groovy project')
.hasDescription('A description for my Groovy project')
.hasSpringBootStarterDependency('web')
.hasSpringBootStarterDependency('data-jpa')
.hasSpringBootStarterTest()
.hasDependency('org.codehaus.groovy', 'groovy')
}
}
@Test @Test
void dependencyHiddenAccordingToRange() { void dependencyHiddenAccordingToRange() {
toHome { // bur: [1.1.4.RELEASE,1.2.0.BUILD-SNAPSHOT) toHome { // bur: [1.1.4.RELEASE,1.2.0.BUILD-SNAPSHOT)
page.advanced.click()
page.dependency('org.acme:bur').displayed == true page.dependency('org.acme:bur').displayed == true
page.bootVersion = '1.0.2.RELEASE' page.bootVersion = '1.0.2.RELEASE'
@@ -190,6 +300,7 @@ class ProjectGenerationSmokeTests extends AbstractInitializrControllerIntegratio
@Test @Test
void dependencyUncheckedWhenHidden() { void dependencyUncheckedWhenHidden() {
toHome { toHome {
page.advanced.click()
page.dependency('org.acme:bur').value() == 'org.acme:bur' page.dependency('org.acme:bur').value() == 'org.acme:bur'
page.bootVersion = '1.0.2.RELEASE' page.bootVersion = '1.0.2.RELEASE'
page.dependency('org.acme:bur').displayed == false page.dependency('org.acme:bur').displayed == false
@@ -207,6 +318,11 @@ class ProjectGenerationSmokeTests extends AbstractInitializrControllerIntegratio
browser browser
} }
private selectDependency(def page, String text) {
page.autocomplete = text
enterAction.perform()
}
private byte[] from(String fileName) { private byte[] from(String fileName) {
getArchive(fileName).bytes getArchive(fileName).bytes
} }

View File

@@ -28,8 +28,15 @@ class HomePage extends Page {
static at = { title == 'Spring Initializr' } static at = { title == 'Spring Initializr' }
static content = { static content = {
advanced { $('.tofullversion a') }
simple { $('tosimpleversion a') }
// Simple view
groupId { $('form').groupId() } groupId { $('form').groupId() }
artifactId { $('form').artifactId() } artifactId { $('form').artifactId() }
autocomplete { $('form').autocomplete() }
// Advanced view
name { $('form').name() } name { $('form').name() }
description { $('form').description() } description { $('form').description() }
packageName { $('form').packageName() } packageName { $('form').packageName() }