/*
* Copyright 1998-2016 Linux.org.ru
* 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 ru.org.linux.user;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import org.apache.commons.httpclient.HttpStatus;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import ru.org.linux.csrf.CSRFProtectionService;
import ru.org.linux.test.WebHelper;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy({
@ContextConfiguration("classpath:database.xml"),
@ContextConfiguration(classes = SimpleIntegrationTestConfiguration.class)
})
public class EditRegisterWebTest {
private static String MAXCOM_NAME = "Максим Валянский";
private static String MAXCOM_URL = "http://maxcom.pp.ru/";
private static String MAXCOM_EMAIL = "max.valjanski+test93@gmail.com";
private static String MAXCOM_TOWN = "Москва";
private static String MAXCOM_INFO = "test<b>test</b>";
private static String MAXCOM_PASS = "passwd";
private static String JB_NAME = "Тёма";
private static String JB_URL = "http://darkmachine.org";
private static String JB_EMAIL = "mail@darkmachine.org";
private static String JB_TOWN = "Самара";
private static String JB_INFO = "[i]Эффективный менеджер по распилу гос-бабла[/i]";
private static String JB_PASS = "passwd";
private WebResource resource;
@Autowired
private UserDao userDao;
private void rescueMaxcom() throws Exception {
final User user = userDao.getUser(userDao.findUserId("maxcom"));
userDao.updateUser(
user,
MAXCOM_NAME,
MAXCOM_URL,
MAXCOM_EMAIL,
MAXCOM_TOWN,
MAXCOM_PASS,
MAXCOM_INFO
);
userDao.acceptNewEmail(user, MAXCOM_EMAIL);
}
private void rescueJB() throws Exception {
final User user = userDao.getUser(userDao.findUserId("JB"));
userDao.updateUser(
user,
JB_NAME,
JB_URL,
JB_EMAIL,
JB_TOWN,
JB_PASS,
JB_INFO
);
userDao.acceptNewEmail(user, JB_EMAIL);
userDao.unblock(user, user);
}
@Before
public void initResource() throws Exception {
Client client = new Client();
client.setFollowRedirects(false);
resource = client.resource(WebHelper.MAIN_URL);
rescueMaxcom();
rescueJB();
}
@After
public void clean() throws Exception {
rescueMaxcom();
rescueJB();
}
/**
* Вводим теже данные которые и были изначально. После изменений должен быть
* redirect в профиль
* @throws IOException
*/
@Test
public void testSimple() throws IOException {
String auth = WebHelper.doLogin(resource, "JB", JB_PASS);
ClientResponse cr = resource
.path("people/JB/edit")
.cookie(new Cookie(WebHelper.AUTH_COOKIE, auth, "/", "127.0.0.1", 1))
.get(ClientResponse.class);
assertEquals(HttpStatus.SC_OK, cr.getStatus());
Document doc = Jsoup.parse(cr.getEntityInputStream(), "UTF-8", resource.getURI().toString());
assertEquals("/people/JB/edit", doc.getElementById("editRegForm").attr("action"));
String name = doc.getElementById("name").val();
String url = doc.getElementById("url").val();
String email = doc.getElementById("email").val();
String town = doc.getElementById("town").val();
String info = doc.getElementById("info").val();
assertEquals(JB_NAME, name);
assertEquals(JB_URL, url);
assertEquals(JB_EMAIL, email);
assertEquals(JB_TOWN, town);
assertEquals(JB_INFO, info);
MultivaluedMap<String, String> formData = new MultivaluedMapImpl();
formData.add("name", name);
formData.add("url", url);
formData.add("email", email);
formData.add("town", town);
formData.add("info", info);
formData.add("csrf", "csrf");
formData.add("oldpass", JB_PASS);
ClientResponse cr2 = resource
.path("people/maxcom/edit")
.cookie(new Cookie(WebHelper.AUTH_COOKIE, auth, "/", "127.0.0.1", 1))
.cookie(new Cookie(CSRFProtectionService.CSRF_COOKIE, "csrf"))
.post(ClientResponse.class, formData);
assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, cr2.getStatus());
assertEquals("http://127.0.0.1:8080/people/JB/profile", cr2.getLocation().toString());
}
@Test
public void testChangePassword() throws IOException {
String auth = WebHelper.doLogin(resource, "maxcom", MAXCOM_PASS);
ClientResponse cr = resource
.path("people/maxcom/edit")
.cookie(new Cookie(WebHelper.AUTH_COOKIE, auth, "/", "127.0.0.1", 1))
.get(ClientResponse.class);
assertEquals(HttpStatus.SC_OK, cr.getStatus());
Document doc = Jsoup.parse(cr.getEntityInputStream(), "UTF-8", resource.getURI().toString());
String name = doc.getElementById("name").val();
String url = doc.getElementById("url").val();
String email = doc.getElementById("email").val();
String town = doc.getElementById("town").val();
String info = doc.getElementById("info").val();
assertEquals(MAXCOM_NAME, name);
assertEquals(MAXCOM_URL, url);
assertEquals(MAXCOM_EMAIL, email);
assertEquals(MAXCOM_TOWN, town);
assertEquals(MAXCOM_INFO, info);
MultivaluedMap<String, String> formData = new MultivaluedMapImpl();
formData.add("name", name);
formData.add("url", url);
formData.add("email", email);
formData.add("town", town);
formData.add("info", info);
formData.add("csrf", "csrf");
formData.add("oldpass", "passwd");
formData.add("password", "passwd2");
formData.add("password2", "passwd2");
ClientResponse cr2 = resource
.path("people/maxcom/edit")
.cookie(new Cookie(WebHelper.AUTH_COOKIE, auth, "/", "127.0.0.1", 1))
.cookie(new Cookie(CSRFProtectionService.CSRF_COOKIE, "csrf"))
.post(ClientResponse.class, formData);
assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, cr2.getStatus());
String newAuth = WebHelper.getAuthCookie(cr2);
assertNotNull(newAuth);
ClientResponse cr3 = resource
.uri(cr2.getLocation())
.cookie(new Cookie(WebHelper.AUTH_COOKIE, newAuth, "/", "127.0.0.1", 1))
.get(ClientResponse.class);
assertEquals(HttpStatus.SC_OK, cr3.getStatus());
MultivaluedMap<String, String> formData2 = new MultivaluedMapImpl();
formData2.add("name", name);
formData2.add("url", url);
formData2.add("email", email);
formData2.add("town", town);
formData2.add("info", info);
formData2.add("csrf", "csrf");
formData2.add("oldpass", "passwd2");
formData2.add("password", "passwd");
formData2.add("password2", "passwd");
ClientResponse cr4 = resource
.path("people/maxcom/edit")
.cookie(new Cookie(WebHelper.AUTH_COOKIE, newAuth, "/", "127.0.0.1", 1))
.cookie(new Cookie(CSRFProtectionService.CSRF_COOKIE, "csrf"))
.post(ClientResponse.class, formData2);
assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, cr4.getStatus());
String newAuth2 = WebHelper.getAuthCookie(cr4);
ClientResponse cr5 = resource
.uri(cr4.getLocation())
.cookie(new Cookie(WebHelper.AUTH_COOKIE, newAuth2, "/", "127.0.0.1", 1))
.get(ClientResponse.class);
assertEquals(HttpStatus.SC_OK, cr5.getStatus());
}
@Test
public void testChange() throws IOException {
String auth = WebHelper.doLogin(resource, "JB", JB_PASS);
ClientResponse cr = resource
.path("people/JB/edit")
.cookie(new Cookie(WebHelper.AUTH_COOKIE, auth, "/", "127.0.0.1", 1))
.get(ClientResponse.class);
assertEquals(HttpStatus.SC_OK, cr.getStatus());
Document doc = Jsoup.parse(cr.getEntityInputStream(), "UTF-8", resource.getURI().toString());
assertEquals("/people/JB/edit", doc.getElementById("editRegForm").attr("action"));
String name = doc.getElementById("name").val();
String url = doc.getElementById("url").val();
String email = doc.getElementById("email").val();
String town = doc.getElementById("town").val();
String info = doc.getElementById("info").val();
assertEquals(JB_NAME, name);
assertEquals(JB_URL, url);
assertEquals(JB_EMAIL, email);
assertEquals(JB_TOWN, town);
assertEquals(JB_INFO, info);
MultivaluedMap<String, String> formData = new MultivaluedMapImpl();
formData.add("name", name);
formData.add("url", url);
formData.add("email", email);
formData.add("town", town);
formData.add("info", info);
formData.add("csrf", "csrf");
ClientResponse cr2 = resource
.path("people/JB/edit")
.cookie(new Cookie(WebHelper.AUTH_COOKIE, auth, "/", "127.0.0.1", 1))
.cookie(new Cookie(CSRFProtectionService.CSRF_COOKIE, "csrf"))
.post(ClientResponse.class, formData);
Document doc2 = Jsoup.parse(cr2.getEntityInputStream(), "UTF-8", resource.getURI().toString());
assertEquals(HttpStatus.SC_OK, cr2.getStatus());
assertEquals("Для изменения регистрации нужен ваш пароль", doc2.select(".error").text());
assertEquals("/people/JB/edit", doc2.getElementById("editRegForm").attr("action"));
}
}