/* * JBoss, Home of Professional Open Source * Copyright 2008, Red Hat, Inc., and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * 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 * http://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.jboss.weld.examples.pastecode.ftest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.drone.api.annotation.Drone; import static org.jboss.arquillian.graphene.Graphene.guardHttp; import org.jboss.arquillian.graphene.condition.element.WebElementConditionFactory; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.junit.InSequence; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.spec.WebArchive; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.ui.Select; /** * This class tests PasteCode example using selenium framework. Furthermore this * test is used as a basis for performance tests of Weld. A SmartFrog component * is generated from this test through Smartfrog-Sniff and used for measuring * availability, scalability, response times and other parameters related to * performance. * * @author maschmid * @author mgencur */ @RunWith(Arquillian.class) @RunAsClient public class PasteCodeTest { protected String MAIN_PAGE = "home.jsf"; //main page elements protected By SUBMIT_BUTTON = By.xpath("//input[contains(@src,'img/submit.png')]"); protected By NEW_LINK = By.xpath("//a[contains(text(),'new')]"); protected By HISTORY_LINK = By.xpath("//a[contains(text(),'history')]"); protected By HELP_LINK = By.xpath("//a[contains(text(),'help')]"); protected By POST_AREA = By.xpath("//textarea[contains(@class,'pastecode')]"); protected By SYNTAX_SELECT = By.xpath("//select[contains(@id,'language')]"); protected By EXPOSURE_SELECT = By.xpath("//select[contains(@id,'exposure')]"); protected String ANY_SYNTAX = "Any"; protected String JS_SYNTAX = "JavaScript"; protected String PRIVATE_EXPOSURE = "Private"; protected By NAME_INPUT = By.xpath("//input[contains(@id,'user')]"); //resulting page after new post submitting protected By DOWNLOAD_LINK = By.xpath("//a[contains(text(),'DOWNLOAD')]"); //recent posts test elements protected By CRAZYMAN_LINK = By.xpath("//a[contains(text(),'crazyman')][contains(@href,'24')]"); //history page elements protected By USER_SEARCH_INPUT = By.xpath("//input[contains(@name,'user')]"); protected By DATE_SEARCH_INPUT = By.xpath("//input[contains(@name,'pasteDate')]"); protected By CODE_SEARCH_INPUT = By.xpath("//textarea[contains(@name,'code')]"); protected By SEARCH_BUTTON = By.xpath("//input[contains(@src,'img/search.png')]"); protected By SECOND_PAGE_LINK = By.xpath("//a[contains(@class,'pagination')][contains(text(),'2')]"); protected By THIRD_PAGE_LINK = By.xpath("//a[contains(@class,'pagination')][contains(text(),'3')]"); protected By BODY = By.tagName("body"); @Drone WebDriver driver; @FindBy(linkText = "DOWNLOAD") WebElement downloadLink; @FindBy(xpath = "//span[contains(@class,'recentPasteLang')][contains(text(),'JavaScript')]") WebElement jsText; @FindBy(xpath = "//div[contains(@class,'recentPaste')]/a[contains(text(),'PublicTester')]") WebElement publicTesterLink; @FindBy(xpath = "//div[contains(@class,'recentPaste')]/a[contains(text(),'PrivateTester')") WebElement privateTesterLink; @FindBy(xpath = "//span[contains(@class,'currentPage')][contains(text(),'1')]") WebElement activeFirstPageLink; @ArquillianResource private URL contextPath; @Deployment(testable = false) public static WebArchive createTestDeployment1() { return Deployments.createDeployment(); } @Before public void openStartURL() throws MalformedURLException { // selenium.setSpeed(200); driver.navigate().to(new URL(contextPath.toString() + MAIN_PAGE)); } @Test @InSequence(1) public void mainPageTest() { assertTrue("A page should contain text 'new'", isTextOnPage("new")); assertTrue("A page should contain text 'martin'", isTextOnPage("martin")); assertTrue("A page should contain text '6 Feb'", isTextOnPage("6 Feb")); assertTrue("A page should contain text 'Exposure'", isTextOnPage("Exposure")); } @Test @InSequence(2) public void newPublicPostTest() { driver.findElement(POST_AREA).clear(); driver.findElement(POST_AREA).sendKeys(CODE_FRAGMENT); new Select(driver.findElement(SYNTAX_SELECT)).selectByVisibleText(JS_SYNTAX); driver.findElement(NAME_INPUT).clear(); driver.findElement(NAME_INPUT).sendKeys("PublicTester"); guardHttp(driver.findElement(SUBMIT_BUTTON)).click(); assertTrue("Location is not correct", isLocationCorrect(driver.getCurrentUrl(), false)); assertTrue("A page should contain text 'Posted by PublicTester just now'", isTextOnPage("Posted by PublicTester just now")); assertTrue("A page should contain pasted text", isTextOnPage(CODE_FRAGMENT_PART)); assertTrue("A page should contain element 'DOWNLOAD'", new WebElementConditionFactory(downloadLink).isPresent().apply(driver)); assertTrue("It should be able to download file from database", isDownloadWorking(driver, DOWNLOAD_LINK, CODE_FRAGMENT_PART)); assertTrue("A page should contain element 'Tester'", new WebElementConditionFactory(publicTesterLink).isPresent().apply(driver)); assertTrue("A page should contain element 'JavaScript'", new WebElementConditionFactory(jsText).isPresent().apply(driver)); } @Test @InSequence(3) public void newPrivatePostTest() { driver.findElement(POST_AREA).clear(); driver.findElement(POST_AREA).sendKeys(CODE_FRAGMENT); new Select(driver.findElement(SYNTAX_SELECT)).selectByVisibleText(JS_SYNTAX); new Select(driver.findElement(EXPOSURE_SELECT)).selectByVisibleText(PRIVATE_EXPOSURE); driver.findElement(NAME_INPUT).clear(); driver.findElement(NAME_INPUT).sendKeys("PrivateTester"); guardHttp(driver.findElement(SUBMIT_BUTTON)).click(); assertTrue("Location is not correct", isLocationCorrect(driver.getCurrentUrl(), true)); assertTrue("A page should contain text 'Posted by PrivateTester just now'", isTextOnPage("Posted by PrivateTester just now")); assertTrue("A page should contain pasted text", isTextOnPage(CODE_FRAGMENT_PART)); assertTrue("A page should contain element 'DOWNLOAD'", new WebElementConditionFactory(downloadLink).isPresent().apply(driver)); assertFalse("A page shouldn't contain element 'PrivateTester'", new WebElementConditionFactory(privateTesterLink).isPresent().apply(driver)); } @Test @InSequence(4) public void recentPostsTest() { guardHttp(driver.findElement(CRAZYMAN_LINK)).click(); assertTrue("A page should contain 'Posted by crazyman on 19 Feb'", isTextOnPage("Posted by crazyman on 19 Feb")); assertTrue("A page should contain code fragment", isTextOnPage("@GeneratedValue(strategy = GenerationType.IDENTITY)")); } @Test @InSequence(5) public void exactSearchTest() { guardHttp(driver.findElement(HISTORY_LINK)).click(); assertTrue("A page should contain 'Posted by PublicTester'", isTextOnPage("Posted by PublicTester")); assertFalse("A page shouldn't contain 'Posted by PrivateTester'", isTextOnPage("Posted by PrivateTester")); driver.findElement(USER_SEARCH_INPUT).clear(); driver.findElement(USER_SEARCH_INPUT).sendKeys("graham"); driver.findElement(DATE_SEARCH_INPUT).clear(); driver.findElement(DATE_SEARCH_INPUT).sendKeys("2009-02-02"); new Select(driver.findElement(SYNTAX_SELECT)).selectByVisibleText(JS_SYNTAX); driver.findElement(CODE_SEARCH_INPUT).clear(); driver.findElement(CODE_SEARCH_INPUT).sendKeys("toggle_visibility(id)"); guardHttp(driver.findElement(SEARCH_BUTTON)).click(); assertTrue("A page should contain 'Posted by graham ...'", isTextOnPage("Posted by graham on 3 Feb 2009")); assertTrue("A page should contain 'Language: JavaScript'", isTextOnPage("Language: JavaScript")); assertTrue("A page should contain the code fragment found", isTextOnPage("var e = document.ge")); assertFalse(new WebElementConditionFactory(activeFirstPageLink).isPresent().apply(driver)); //assert that only one record was found } @Test @InSequence(6) public void searchAndPaginationTest() { guardHttp(driver.findElement(HISTORY_LINK)).click(); driver.findElement(USER_SEARCH_INPUT).clear(); driver.findElement(USER_SEARCH_INPUT).sendKeys("martin"); new Select(driver.findElement(SYNTAX_SELECT)).selectByVisibleText(ANY_SYNTAX); driver.findElement(DATE_SEARCH_INPUT).clear(); driver.findElement(CODE_SEARCH_INPUT).clear(); guardHttp(driver.findElement(SEARCH_BUTTON)).click(); assertTrue("A page should contain 'Posted by martin ...'", isTextOnPage("Posted by martin on 15 Feb 2009")); guardHttp(driver.findElement(SECOND_PAGE_LINK)).click(); assertTrue("A page should contain 'Posted by martin ...'", isTextOnPage("Posted by martin on 1 Feb 2009")); guardHttp(driver.findElement(THIRD_PAGE_LINK)).click(); assertTrue("A page should contain 'Posted by martin ...'", isTextOnPage("Posted by martin on 9 Jan 2009")); assertTrue("A page should contain code fragment", isTextOnPage("function build_calendar($month,$year,$dateArray)")); } @Test @InSequence(7) public void helpPageTest() { guardHttp(driver.findElement(HELP_LINK)).click(); assertTrue("A page should contain help information", isTextOnPage("Useful Information")); assertTrue("A page should contain 'Weld Features Covered'", isTextOnPage("Weld Features Covered")); } private boolean isLocationCorrect(String urlStr, boolean privatePost) { URL url = null; try { url = new URL(urlStr); } catch (MalformedURLException ex) { fail("Invalid location, can't create URL: " + urlStr); } String regexp; if (!privatePost) { regexp = "[0-9]{1,}"; } else { regexp = "[a-z0-9]{6}"; } return url.getPath().substring("/weld-pastecode/".length()).matches(regexp); } private boolean isDownloadWorking(WebDriver driver, By by, String textToFind) { try { URL downloadUrl = new URL(driver.findElement(by).getAttribute("href")); BufferedReader r = new BufferedReader(new InputStreamReader(downloadUrl.openStream())); String str; StringBuffer sb = new StringBuffer(); while ((str = r.readLine()) != null) { sb.append(str); } return sb.toString().contains(textToFind); } catch (IOException e) { return false; } } protected String CODE_FRAGMENT = "function addleadingzeros(array) {" + "\n" + "var highestint = Math.max.apply(Math,array);" + "\n" + "for(var i=0; i<array.length; i++) {" + "\n" + "var nleadingzeros = highestint.toString().length - array[i].toString().length;" + "\n" + "for(var j=0; j<nleadingzeros; j++) array[i] = '0' + array[i];" + "\n" + "}" + "\n" + "return array;" + "\n" + "}"; protected String CODE_FRAGMENT_PART = CODE_FRAGMENT.substring(0, 30); private boolean isTextOnPage(String text) { return driver.findElement(BODY).getText().contains(text); } }