Skip to content

Commit cbf1350

Browse files
committed
add tests
1 parent 0a05063 commit cbf1350

File tree

4 files changed

+77
-48
lines changed

4 files changed

+77
-48
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ dependencies {
3737

3838
implementation("com.konghq:unirest-java-core:4.4.7")
3939
testImplementation("com.squareup.okhttp3:mockwebserver3:5.1.0")
40+
testImplementation("org.mockito:mockito-core:5.18.0")
4041
}
4142

4243
tasks.test {

app/src/main/java/hexlet/code/controller/UrlsController.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,7 @@ public static void show(Context ctx) throws SQLException {
4848
public static void create(Context ctx) throws SQLException, URISyntaxException {
4949

5050
try {
51-
var url = new URI(ctx.formParam("url")).normalize().toURL();
52-
var protocol = url.getProtocol();
53-
var authority = url.getAuthority();
54-
var urlName = String.format("%s://%s", protocol, authority);
51+
var urlName = normalizeUrlName(ctx.formParam("url"));
5552

5653
if (UrlRepository.findByName(urlName).isPresent()) {
5754
throw new IllegalArgumentException("Страница уже существует");
@@ -61,18 +58,24 @@ public static void create(Context ctx) throws SQLException, URISyntaxException {
6158

6259
ctx.sessionAttribute("flash", "Страница успешно добавлена");
6360
ctx.sessionAttribute("flash-type", "alert alert-success");
64-
ctx.redirect(NamedRoutes.rootPath());
65-
66-
} catch (MalformedURLException | IllegalArgumentException e) {
6761

68-
if (e instanceof MalformedURLException) {
69-
ctx.sessionAttribute("flash", "Некорректный URL");
70-
} else {
71-
ctx.sessionAttribute("flash", e.getMessage());
72-
}
62+
} catch (URISyntaxException | MalformedURLException e) {
63+
ctx.sessionAttribute("flash", "Некорректный URL");
64+
ctx.sessionAttribute("flash-type", "alert alert-danger");
7365

66+
} catch (IllegalArgumentException e) {
67+
ctx.sessionAttribute("flash", e.getMessage());
7468
ctx.sessionAttribute("flash-type", "alert alert-danger");
69+
70+
} finally {
7571
ctx.redirect(NamedRoutes.rootPath());
7672
}
7773
}
74+
75+
public static String normalizeUrlName(String rawUrl) throws URISyntaxException, MalformedURLException {
76+
var url = new URI(rawUrl).normalize().toURL();
77+
var protocol = url.getProtocol();
78+
var authority = url.getAuthority();
79+
return String.format("%s://%s", protocol, authority);
80+
}
7881
}

app/src/main/java/hexlet/code/repository/UrlCheckRepository.java

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.sql.Statement;
77
import java.util.ArrayList;
88
import java.util.List;
9-
import java.util.Optional;
109

1110
public class UrlCheckRepository extends BaseRepository {
1211

@@ -29,28 +28,28 @@ public static void save(UrlCheck check) throws SQLException {
2928
}
3029
}
3130

32-
public static Optional<UrlCheck> find(Long id) throws SQLException {
33-
var sql = "SELECT * FROM url_checks WHERE id = ?";
34-
try (
35-
var conn = dataSource.getConnection();
36-
var stmt = conn.prepareStatement(sql)
37-
) {
38-
stmt.setLong(1, id);
39-
40-
var rs = stmt.executeQuery();
41-
if (rs.next()) {
42-
var check = UrlCheck.builder()
43-
.id(id)
44-
.statusCode(rs.getInt("status_code"))
45-
.urlId(rs.getLong("url_id"))
46-
.createdAt(rs.getTimestamp("created_at"))
47-
.build();
48-
return Optional.of(check);
49-
} else {
50-
return Optional.empty();
51-
}
52-
}
53-
}
31+
// public static Optional<UrlCheck> find(Long id) throws SQLException {
32+
// var sql = "SELECT * FROM url_checks WHERE id = ?";
33+
// try (
34+
// var conn = dataSource.getConnection();
35+
// var stmt = conn.prepareStatement(sql)
36+
// ) {
37+
// stmt.setLong(1, id);
38+
//
39+
// var rs = stmt.executeQuery();
40+
// if (rs.next()) {
41+
// var check = UrlCheck.builder()
42+
// .id(id)
43+
// .statusCode(rs.getInt("status_code"))
44+
// .urlId(rs.getLong("url_id"))
45+
// .createdAt(rs.getTimestamp("created_at"))
46+
// .build();
47+
// return Optional.of(check);
48+
// } else {
49+
// return Optional.empty();
50+
// }
51+
// }
52+
// }
5453

5554
public static List<UrlCheck> getEntities() throws SQLException {
5655
var sql = "SELECT * FROM url_checks";

app/src/test/java/hexlet/code/AppTest.java

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package hexlet.code;
22

3+
import hexlet.code.controller.UrlsController;
34
import hexlet.code.model.Url;
45
import hexlet.code.repository.UrlRepository;
56
import hexlet.code.util.NamedRoutes;
67
import io.javalin.Javalin;
7-
import io.javalin.http.NotFoundResponse;
8+
import io.javalin.http.Context;
89
import io.javalin.testtools.JavalinTest;
910
import mockwebserver3.MockResponse;
1011
import mockwebserver3.MockWebServer;
12+
13+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
14+
import static org.mockito.Mockito.mock;
15+
import static org.mockito.Mockito.times;
16+
import static org.mockito.Mockito.verify;
17+
import static org.mockito.Mockito.when;
1118
import okhttp3.Headers;
1219
import org.junit.jupiter.api.AfterAll;
1320
import org.junit.jupiter.api.BeforeEach;
@@ -20,16 +27,22 @@
2027
import static org.junit.jupiter.api.Assertions.assertTrue;
2128

2229
public final class AppTest {
30+
private Context ctx;
2331
private static MockWebServer server;
32+
private String rawUrl;
2433
private Javalin app;
2534

2635
@BeforeEach
2736
public void setUp() throws SQLException, IOException {
37+
ctx = mock(Context.class);
38+
2839
server = new MockWebServer();
2940
var response = new MockResponse(200, new Headers.Builder().build(), "i'm so tired");
3041
server.enqueue(response);
3142
server.start();
3243

44+
rawUrl = server.url("/").toString();
45+
3346
app = App.getApp();
3447
}
3548

@@ -86,31 +99,44 @@ public void testUrlNotFound() {
8699
}
87100

88101
@Test
89-
public void testSaveUrl() {
90-
var urlName = "https://one.com";
102+
public void testInvalidUrl() {
103+
JavalinTest.test(app, (server, client) -> {
104+
when(ctx.formParam("url")).thenReturn(rawUrl);
91105

106+
UrlsController.create(ctx);
107+
verify(ctx).sessionAttribute("flash", "Страница успешно добавлена");
108+
verify(ctx).sessionAttribute("flash-type", "alert alert-success");
109+
110+
assertDoesNotThrow(() -> UrlsController.create(ctx));
111+
verify(ctx).sessionAttribute("flash", "Страница уже существует");
112+
verify(ctx).sessionAttribute("flash-type", "alert alert-danger");
113+
114+
verify(ctx, times(2)).redirect(NamedRoutes.rootPath());
115+
});
116+
}
117+
118+
@Test
119+
public void testPostUrl() {
92120
JavalinTest.test(app, (server, client) -> {
93-
var requestBody = "url=" + urlName;
121+
var requestBody = "url=" + rawUrl;
94122
var postResponse = client.post(NamedRoutes.urlsPath(), requestBody);
95-
var url = UrlRepository.findByName(urlName).orElseThrow(NotFoundResponse::new);
96-
97-
assertEquals(urlName, url.getName());
98123
assertEquals(200, postResponse.code());
99124
assertTrue(postResponse.body().string().contains("Главная страница"));
100125

126+
var urlName = UrlsController.normalizeUrlName(rawUrl);
101127
var getResponse = client.get(NamedRoutes.urlsPath());
102128
assertTrue(getResponse.body().string().contains(urlName));
103129
});
104130
}
105131

106132
@Test
107-
public void testUrlCheck() throws SQLException {
108-
var urlName = server.url("/").toString();
109-
var url = new Url(urlName);
110-
UrlRepository.save(url);
111-
var urlId = UrlRepository.findByName(urlName).get().getId();
112-
133+
public void testPostUrlCheck() {
113134
JavalinTest.test(app, (server, client) -> {
135+
var urlName = UrlsController.normalizeUrlName(rawUrl);
136+
var url = new Url(urlName);
137+
UrlRepository.save(url);
138+
var urlId = UrlRepository.findByName(urlName).get().getId();
139+
114140
var postResponse = client.post(NamedRoutes.urlChecksPath(urlId));
115141
assertEquals(200, postResponse.code());
116142
});

0 commit comments

Comments
 (0)