java/sql-dk/test/info/globalcode/sql/dk/CLIParserTest.java
author František Kučera <franta-hg@frantovo.cz>
Tue, 26 Feb 2019 18:19:49 +0100
branchv_0
changeset 236 a3ec71fa8e17
parent 168 0e8108da0305
permissions -rw-r--r--
Avoid reusing/rewriting the DB connection properties.
There was weird random errors while testing connection to multiple DB in parallel when one of them was meta connection to same DB connection.
Two kinds of exception: 1) missing password 2) „Passing DB password as CLI parameter is insecure!“
franta-hg@16
     1
/**
franta-hg@16
     2
 * SQL-DK
franta-hg@16
     3
 * Copyright © 2013 František Kučera (frantovo.cz)
franta-hg@16
     4
 *
franta-hg@16
     5
 * This program is free software: you can redistribute it and/or modify
franta-hg@16
     6
 * it under the terms of the GNU General Public License as published by
franta-hg@16
     7
 * the Free Software Foundation, either version 3 of the License, or
franta-hg@16
     8
 * (at your option) any later version.
franta-hg@16
     9
 *
franta-hg@16
    10
 * This program is distributed in the hope that it will be useful,
franta-hg@16
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
franta-hg@16
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
franta-hg@16
    13
 * GNU General Public License for more details.
franta-hg@16
    14
 *
franta-hg@16
    15
 * You should have received a copy of the GNU General Public License
franta-hg@16
    16
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
franta-hg@16
    17
 */
franta-hg@6
    18
package info.globalcode.sql.dk;
franta-hg@6
    19
franta-hg@6
    20
import info.globalcode.sql.dk.CLIParser.Tokens;
franta-hg@12
    21
import static info.globalcode.sql.dk.CLIParser.TYPE_NAME_SEPARATOR;
franta-hg@72
    22
import info.globalcode.sql.dk.InfoLister.InfoType;
franta-hg@168
    23
import java.io.ByteArrayInputStream;
franta-hg@12
    24
import java.util.Collection;
franta-hg@6
    25
import static org.testng.Assert.*;
franta-hg@6
    26
import org.testng.annotations.BeforeMethod;
franta-hg@6
    27
import org.testng.annotations.Test;
franta-hg@6
    28
franta-hg@6
    29
/**
franta-hg@6
    30
 *
franta-hg@6
    31
 * @author Ing. František Kučera (frantovo.cz)
franta-hg@6
    32
 */
franta-hg@6
    33
public class CLIParserTest {
franta-hg@6
    34
franta-hg@7
    35
	private static final String DATABASE_NAME_1 = "some database 1";
franta-hg@7
    36
	private static final String SQL_1 = "SELECT * FROM table1";
franta-hg@7
    37
	private static final String DATA_1 = "aaa";
franta-hg@7
    38
	private static final String DATA_2 = "bbb";
franta-hg@7
    39
	private static final String DATA_3 = "ccc";
franta-hg@12
    40
	private static final String NAME_1 = "param1";
franta-hg@12
    41
	private static final String NAME_2 = "param2";
franta-hg@12
    42
	private static final String NAME_3 = "param3";
franta-hg@6
    43
	private CLIParser parser;
franta-hg@6
    44
franta-hg@6
    45
	@BeforeMethod
franta-hg@6
    46
	public void setUpMethod() throws Exception {
franta-hg@6
    47
		parser = new CLIParser();
franta-hg@6
    48
	}
franta-hg@6
    49
franta-hg@168
    50
	private CLIOptions parseOptions(String[] args) throws CLIParserException {
franta-hg@168
    51
		return parser.parseOptions(args, new ByteArrayInputStream("".getBytes()));
franta-hg@168
    52
	}
franta-hg@168
    53
franta-hg@6
    54
	@Test
franta-hg@12
    55
	public void testParseOptions_QueryNow_NoParams() throws InvalidOptionsException, CLIParserException {
franta-hg@12
    56
		String[] args = new String[]{
franta-hg@12
    57
			Tokens.DB, DATABASE_NAME_1,
franta-hg@12
    58
			Tokens.SQL, SQL_1};
franta-hg@168
    59
		CLIOptions options = parseOptions(args);
franta-hg@12
    60
		options.validate();
franta-hg@12
    61
franta-hg@12
    62
		assertEquals(options.getDatabaseName(), DATABASE_NAME_1);
franta-hg@12
    63
		assertEquals(options.getSql(), SQL_1);
franta-hg@12
    64
		assertEquals(options.getMode(), CLIOptions.MODE.QUERY_NOW);
franta-hg@12
    65
		assertTrue(options.getNamedParameters().isEmpty(), "Named parameters should be empty.");
franta-hg@12
    66
		assertTrue(options.getNumberedParameters().isEmpty(), "Numbered parameters should be empty.");
franta-hg@12
    67
	}
franta-hg@12
    68
franta-hg@12
    69
	@Test
franta-hg@9
    70
	public void testParseOptions_QueryNow_Numbered() throws InvalidOptionsException, CLIParserException {
franta-hg@11
    71
		String[] args = new String[]{
franta-hg@11
    72
			Tokens.DB, DATABASE_NAME_1,
franta-hg@11
    73
			Tokens.SQL, SQL_1,
franta-hg@11
    74
			Tokens.DATA, DATA_1, DATA_2, DATA_3};
franta-hg@168
    75
		CLIOptions options = parseOptions(args);
franta-hg@6
    76
		options.validate();
franta-hg@6
    77
franta-hg@6
    78
		assertEquals(options.getDatabaseName(), DATABASE_NAME_1);
franta-hg@6
    79
		assertEquals(options.getSql(), SQL_1);
franta-hg@7
    80
		assertEquals(options.getMode(), CLIOptions.MODE.QUERY_NOW);
franta-hg@7
    81
		assertEquals(options.getNumberedParameters().size(), 3);
franta-hg@7
    82
		assertEquals(options.getNumberedParameters().get(0).getValue(), DATA_1);
franta-hg@7
    83
		assertEquals(options.getNumberedParameters().get(1).getValue(), DATA_2);
franta-hg@7
    84
		assertEquals(options.getNumberedParameters().get(2).getValue(), DATA_3);
franta-hg@7
    85
		assertEquals(options.getNumberedParameters().get(0).getType(), Parameter.DEFAULT_TYPE);
franta-hg@7
    86
		assertEquals(options.getNumberedParameters().get(1).getType(), Parameter.DEFAULT_TYPE);
franta-hg@7
    87
		assertEquals(options.getNumberedParameters().get(2).getType(), Parameter.DEFAULT_TYPE);
franta-hg@7
    88
	}
franta-hg@7
    89
franta-hg@7
    90
	@Test
franta-hg@10
    91
	public void testParseOptions_QueryNow_Numbered_withTypes() throws InvalidOptionsException, CLIParserException {
franta-hg@10
    92
		String[] args = new String[]{
franta-hg@10
    93
			Tokens.DB, DATABASE_NAME_1,
franta-hg@10
    94
			Tokens.SQL, SQL_1,
franta-hg@68
    95
			Tokens.TYPES, " INTEGER,VARCHAR, BOOLEAN",
franta-hg@10
    96
			Tokens.DATA, DATA_1, DATA_2, DATA_3};
franta-hg@168
    97
		CLIOptions options = parseOptions(args);
franta-hg@10
    98
		options.validate();
franta-hg@10
    99
franta-hg@10
   100
		assertEquals(options.getDatabaseName(), DATABASE_NAME_1);
franta-hg@10
   101
		assertEquals(options.getSql(), SQL_1);
franta-hg@10
   102
		assertEquals(options.getMode(), CLIOptions.MODE.QUERY_NOW);
franta-hg@10
   103
		assertEquals(options.getNumberedParameters().size(), 3);
franta-hg@10
   104
		assertEquals(options.getNumberedParameters().get(0).getValue(), DATA_1);
franta-hg@10
   105
		assertEquals(options.getNumberedParameters().get(1).getValue(), DATA_2);
franta-hg@10
   106
		assertEquals(options.getNumberedParameters().get(2).getValue(), DATA_3);
franta-hg@68
   107
		assertEquals(options.getNumberedParameters().get(0).getType(), SQLType.INTEGER);
franta-hg@68
   108
		assertEquals(options.getNumberedParameters().get(1).getType(), SQLType.VARCHAR);
franta-hg@68
   109
		assertEquals(options.getNumberedParameters().get(2).getType(), SQLType.BOOLEAN);
franta-hg@10
   110
	}
franta-hg@10
   111
franta-hg@10
   112
	@Test
franta-hg@9
   113
	public void testParseOptions_QueryNow_Named() throws InvalidOptionsException, CLIParserException {
franta-hg@11
   114
		String[] args = new String[]{
franta-hg@11
   115
			Tokens.DB, DATABASE_NAME_1,
franta-hg@12
   116
			Tokens.SQL, SQL_1,
franta-hg@52
   117
			Tokens.DATA_NAMED, NAME_1, DATA_1, NAME_2, DATA_2, NAME_3, DATA_3};
franta-hg@168
   118
		CLIOptions options = parseOptions(args);
franta-hg@7
   119
		options.validate();
franta-hg@7
   120
franta-hg@7
   121
		assertEquals(options.getDatabaseName(), DATABASE_NAME_1);
franta-hg@7
   122
		assertEquals(options.getSql(), SQL_1);
franta-hg@7
   123
		assertEquals(options.getMode(), CLIOptions.MODE.QUERY_NOW);
franta-hg@12
   124
		assertEquals(options.getNamedParameters().size(), 3);
franta-hg@12
   125
		assertNamedParameter(options.getNamedParameters(), NAME_1, DATA_1, Parameter.DEFAULT_TYPE);
franta-hg@12
   126
		assertNamedParameter(options.getNamedParameters(), NAME_2, DATA_2, Parameter.DEFAULT_TYPE);
franta-hg@12
   127
		assertNamedParameter(options.getNamedParameters(), NAME_3, DATA_3, Parameter.DEFAULT_TYPE);
franta-hg@12
   128
	}
franta-hg@12
   129
franta-hg@12
   130
	@Test
franta-hg@12
   131
	public void testParseOptions_QueryNow_Named_withTypes() throws InvalidOptionsException, CLIParserException {
franta-hg@12
   132
		String[] args = new String[]{
franta-hg@12
   133
			Tokens.DB, DATABASE_NAME_1,
franta-hg@12
   134
			Tokens.SQL, SQL_1,
franta-hg@12
   135
			Tokens.NAME_PREFIX, "$",
franta-hg@68
   136
			Tokens.TYPES, " " + NAME_1 + TYPE_NAME_SEPARATOR + "INTEGER" + "," + NAME_3 + TYPE_NAME_SEPARATOR + "BOOLEAN",
franta-hg@52
   137
			Tokens.DATA_NAMED, NAME_1, DATA_1, NAME_2, DATA_2, NAME_3, DATA_3};
franta-hg@168
   138
		CLIOptions options = parseOptions(args);
franta-hg@12
   139
		options.validate();
franta-hg@12
   140
franta-hg@12
   141
		assertEquals(options.getDatabaseName(), DATABASE_NAME_1);
franta-hg@12
   142
		assertEquals(options.getSql(), SQL_1);
franta-hg@12
   143
		assertEquals(options.getMode(), CLIOptions.MODE.QUERY_NOW);
franta-hg@12
   144
		assertEquals(options.getNamedParameters().size(), 3);
franta-hg@68
   145
		assertNamedParameter(options.getNamedParameters(), NAME_1, DATA_1, SQLType.INTEGER);
franta-hg@13
   146
		assertNamedParameter(options.getNamedParameters(), NAME_2, DATA_2, Parameter.DEFAULT_TYPE);
franta-hg@68
   147
		assertNamedParameter(options.getNamedParameters(), NAME_3, DATA_3, SQLType.BOOLEAN);
franta-hg@12
   148
	}
franta-hg@12
   149
franta-hg@68
   150
	private void assertNamedParameter(Collection<NamedParameter> params, String name, Object value, SQLType type) {
franta-hg@12
   151
		for (NamedParameter p : params) {
franta-hg@12
   152
			if (name.equals(p.getName())) {
franta-hg@12
   153
				assertEquals(p.getValue(), value, "value does not match – name: " + name);
franta-hg@12
   154
				assertEquals(p.getType(), type, "value does not match – name: " + name);
franta-hg@12
   155
				return;
franta-hg@12
   156
			}
franta-hg@12
   157
		}
franta-hg@12
   158
		fail("Named parameter not found: " + name);
franta-hg@7
   159
	}
franta-hg@7
   160
franta-hg@7
   161
	@Test
franta-hg@9
   162
	public void testParseOptions_PrepareBatch() throws InvalidOptionsException, CLIParserException {
franta-hg@11
   163
		String[] args = new String[]{
franta-hg@11
   164
			Tokens.BATCH,
franta-hg@11
   165
			Tokens.SQL, SQL_1};
franta-hg@168
   166
		CLIOptions options = parseOptions(args);
franta-hg@7
   167
		options.validate();
franta-hg@7
   168
franta-hg@7
   169
		assertEquals(options.getSql(), SQL_1);
franta-hg@7
   170
		assertEquals(options.getMode(), CLIOptions.MODE.PREPARE_BATCH);
franta-hg@7
   171
	}
franta-hg@7
   172
franta-hg@7
   173
	@Test
franta-hg@9
   174
	public void testParseOptions_ExecuteBatch() throws InvalidOptionsException, CLIParserException {
franta-hg@11
   175
		String[] args = new String[]{
franta-hg@11
   176
			Tokens.BATCH,
franta-hg@11
   177
			Tokens.DB, DATABASE_NAME_1};
franta-hg@168
   178
		CLIOptions options = parseOptions(args);
franta-hg@7
   179
		options.validate();
franta-hg@7
   180
franta-hg@7
   181
		assertEquals(options.getDatabaseName(), DATABASE_NAME_1);
franta-hg@7
   182
		assertEquals(options.getMode(), CLIOptions.MODE.EXECUTE_BATCH);
franta-hg@6
   183
	}
franta-hg@14
   184
franta-hg@14
   185
	@Test
franta-hg@14
   186
	public void testParseOptions_ShowInfo_Help() throws InvalidOptionsException, CLIParserException {
franta-hg@14
   187
		String[] args = new String[]{Tokens.INFO_HELP};
franta-hg@168
   188
		CLIOptions options = parseOptions(args);
franta-hg@14
   189
		options.validate();
franta-hg@14
   190
franta-hg@14
   191
		assertEquals(options.getMode(), CLIOptions.MODE.JUST_SHOW_INFO);
franta-hg@14
   192
		assertEquals(options.getShowInfo().size(), 1);
franta-hg@72
   193
		assertTrue(options.getShowInfo().contains(InfoType.HELP));
franta-hg@14
   194
	}
franta-hg@6
   195
}