summaryrefslogtreecommitdiff
path: root/src/main/java/com/mavlushechka/a1qa/utils/Database.java
blob: 1926618b5abce8090a5734b2c3f789dbdce270e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.mavlushechka.a1qa.utils;

import com.mavlushechka.a1qa.models.User;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class Database {

    private static final String name = JsonParser.parseData("config", "database.name");
    private static final Connection connection;
    private static final User user = new User(JsonParser.parseData("config", "database.user.name"),
            JsonParser.parseData("config", "database.user.password"));


    static {
        try {
            Class.forName(JsonParser.parseData("config", "database.driver"));
            connection = DriverManager.getConnection(JsonParser.parseData("config", "database.url") + "/" + name, user.name(), user.password());
        } catch (SQLException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }


    private Database() {
    }

    public static List<String> getTests() {
        return executeQuery("SELECT project.name, test.name, TIMESTAMPDIFF(MICROSECOND, test.start_time, test.end_time) as min_working_time"
                + " FROM project INNER JOIN test ON project.id = test.project_id ORDER BY project.name, test.name;",
                Map.of("project.name", String.class,"test.name", String.class,"min_working_time", Long.class));
    }

    public static List<String> getTestsCount() {
        return executeQuery("SELECT project.name, (SELECT COUNT(*) FROM test WHERE test.project_id = project.id) AS `tests_count` FROM project;",
                Map.of("project.name", String.class, "tests_count", Long.class));
    }

    public static List<String> getTestsByLowerDate(LocalDate localDate) {
        return executeQuery("SELECT project.name, test.name, test.start_time FROM project JOIN test ON project.id = test.project_id"
                + " WHERE test.start_time >= '%s' ORDER BY project.name, test.name;".formatted(localDate),
                Map.of("project.name", String.class, "test.name", String.class, "start_time", LocalDate.class));
    }

    public static List<String> getBrowserTestsCount() {
        return executeQuery("SELECT test.browser, COUNT(*) as count FROM test WHERE test.browser = 'firefox'"
                + " UNION"
                + " SELECT test.browser, COUNT(*) as count FROM test WHERE test.browser = 'chrome';",
                Map.of("browser", String.class, "count", Long.class));
    }

    private static List<String> executeQuery(String sql, Map<String, Class<?>> expectedData) {
        ArrayList<String> foundData = new ArrayList<>();

        try (PreparedStatement preparedStatement = connection.prepareStatement(sql);
             ResultSet resultSet = preparedStatement.executeQuery()) {
            while (resultSet.next()) {
                StringBuilder dataStringRepresentationBuilder = new StringBuilder();

                dataStringRepresentationBuilder.append("{");
                for (String expectedDataKey : expectedData.keySet()) {
                    dataStringRepresentationBuilder
                            .append(expectedDataKey)
                            .append("=")
                            .append(resultSet.getObject(expectedDataKey, expectedData.get(expectedDataKey)))
                            .append(",");
                }
                dataStringRepresentationBuilder.deleteCharAt(dataStringRepresentationBuilder.toString().length() - 1);
                dataStringRepresentationBuilder.append("}");

                foundData.add(dataStringRepresentationBuilder.toString());
            }
        } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }

        return foundData;
    }

}