Newer
Older
uid.database / src / test / java / ua / net / uid / utils / db / query / QueryBuilderTest.java
package ua.net.uid.utils.db.query;

import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

public class QueryBuilderTest {
    @Test
    void appendQueryPart() {
        QueryBuilder builder1 = new QueryBuilder().append((QueryPart) null);
        assertEquals("", builder1.getQuery());
        assertArrayEquals(new Object[]{}, builder1.getParams());

        QueryBuilder builder2 = new QueryBuilder().append(
                new SimpleQueryPart("field = ? AND type != ?", 1, 2)
        );
        assertEquals("field = ? AND type != ?", builder2.getQuery());
        assertArrayEquals(new Object[]{1, 2}, builder2.getParams());
    }

    @Test
    void appendQueryPartWithPrefix() {
        QueryBuilder builder1 = new QueryBuilder().append(
                " WHERE ", (QueryPart) null
        );
        assertEquals("", builder1.getQuery());
        assertArrayEquals(new Object[]{}, builder1.getParams());

        QueryBuilder builder2 = new QueryBuilder().append(
                " WHERE ",
                new SimpleQueryPart("field = ? AND type != ?", 1, 2)
        );
        assertEquals(" WHERE field = ? AND type != ?", builder2.getQuery());
        assertArrayEquals(new Object[]{1, 2}, builder2.getParams());
    }

    @Test
    void appendCharSequence() {
        QueryBuilder builder1 = new QueryBuilder().append((CharSequence) null);
        assertEquals("", builder1.getQuery());
        assertArrayEquals(new Object[]{}, builder1.getParams());

        QueryBuilder builder2 = new QueryBuilder().append((CharSequence) "");
        assertEquals("", builder2.getQuery());
        assertArrayEquals(new Object[]{}, builder2.getParams());

        QueryBuilder builder3 = new QueryBuilder().append((CharSequence) "test");
        assertEquals("test", builder3.getQuery());
        assertArrayEquals(new Object[]{}, builder3.getParams());
    }

    @Test
    void appendCharSequenceWithParamsMustThrow1() {
        assertThrows(IllegalArgumentException.class, () -> new QueryBuilder().append((CharSequence) null, 1, 2));
    }

    @Test
    void appendCharSequenceWithParamsMustThrow2() {
        assertThrows(IllegalArgumentException.class, () -> new QueryBuilder().append((CharSequence) "", 1, 2));
    }

    @Test
    void appendCharSequenceWithParams() {
        QueryBuilder builder1 = new QueryBuilder().append((CharSequence) "test", 1, 2);
        assertEquals("test", builder1.getQuery());
        assertArrayEquals(new Object[]{1, 2}, builder1.getParams());
    }

    @Test
    void appendString() {
        QueryBuilder builder1 = new QueryBuilder().append((String) null);
        assertEquals("", builder1.getQuery());
        assertArrayEquals(new Object[]{}, builder1.getParams());

        QueryBuilder builder2 = new QueryBuilder().append("");
        assertEquals("", builder2.getQuery());
        assertArrayEquals(new Object[]{}, builder2.getParams());

        QueryBuilder builder3 = new QueryBuilder().append("test");
        assertEquals("test", builder3.getQuery());
        assertArrayEquals(new Object[]{}, builder3.getParams());
    }

    @Test
    void appendStringWithParamsMustThrow1() {
        assertThrows(IllegalArgumentException.class, () -> new QueryBuilder().append(null, 1, 2));
    }

    @Test
    void appendStringWithParamsMustThrow2() {
        assertThrows(IllegalArgumentException.class, () -> new QueryBuilder().append("", 1, 2));
    }

    @Test
    void appendStringWithParams() {
        QueryBuilder builder1 = new QueryBuilder().append("test", 1, 2);
        assertEquals("test", builder1.getQuery());
        assertArrayEquals(new Object[]{1, 2}, builder1.getParams());
    }

    @Test
    void complexTest() {
        QueryBuilder builder = new QueryBuilder()
                .append("SELECT t.*")
                .append(" FROM test AS t INNER JOIN cross AS c ON (t.type = c.id AND c.mask = ?)", 1)
                .append(" WHERE ", Condition.and(
                        Condition.not("disabled"),
                        Condition.raw("BIT_AND(access, ?) = ?", 2, 3)
                ))
                .append(" HAVING ", Condition.and())
                .append(Order.by().desc("t.date"))
                .append(" LIMIT ? OFFSET ?", 4, 5);
        assertEquals(
                "SELECT t.* FROM test AS t INNER JOIN cross AS c ON (t.type = c.id AND c.mask = ?) WHERE (NOT(disabled)) AND (BIT_AND(access, ?) = ?) ORDER BY t.date DESC LIMIT ? OFFSET ?",
                builder.getQuery()
        );
        assertArrayEquals(new Object[]{1, 2, 3, 4, 5}, builder.getParams());
        //System.out.println(builder.getQuery());
    }


    static class SimpleQueryPart implements QueryPart {
        private final String part;
        private final Object[] args;

        SimpleQueryPart(String part, Object... args) {
            this.part = part;
            this.args = args;
        }

        @Override
        public void build(StringBuilder builder) {
            builder.append(part);
        }

        @Override
        public void bind(List<Object> params) {
            if (args != null && args.length > 0) {
                Collections.addAll(params, args);
            }
        }
    }
}