001 /*
002 * Copyright 2002-2006 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.settings.jdbc;
017
018 import java.util.List;
019 import java.util.Map;
020
021 import javax.sql.DataSource;
022
023 import org.springframework.jdbc.core.JdbcTemplate;
024 import org.springframework.jdbc.datasource.DriverManagerDataSource;
025 import org.springframework.richclient.settings.Settings;
026 import org.springframework.richclient.settings.SettingsAbstractTests;
027
028 /**
029 * @author Peter De Bruycker
030 */
031 public class JdbcSettingsTests extends SettingsAbstractTests {
032 private DataSource dataSource;
033 private JdbcTemplate jdbcTemplate;
034
035 public JdbcSettingsTests() {
036 }
037
038 protected Settings createSettings() {
039 return new JdbcSettings(dataSource, "user", Integer.valueOf(5), "test");
040 }
041
042 protected void doSetUp() throws Exception {
043 dataSource = createDataSource();
044 jdbcTemplate = new JdbcTemplate(dataSource);
045
046 // setup the schema
047 jdbcTemplate.execute("DROP TABLE SETTINGS_VALUES IF EXISTS");
048 jdbcTemplate.execute("DROP TABLE SETTINGS IF EXISTS");
049
050 jdbcTemplate.execute("CREATE TABLE SETTINGS (ID INTEGER IDENTITY, KEY VARCHAR(250) NOT NULL, PARENT INTEGER, USER VARCHAR(250) NOT NULL, CONSTRAINT SYS_CT_52 UNIQUE(KEY,USER))");
051 jdbcTemplate.execute("CREATE TABLE SETTINGS_VALUES (SETTINGS_ID INTEGER NOT NULL, KEY VARCHAR(250) NOT NULL, VALUE VARCHAR(250), PRIMARY KEY(SETTINGS_ID,KEY), CONSTRAINT SYS_FK_48 FOREIGN KEY(SETTINGS_ID) REFERENCES SETTINGS(ID))");
052 }
053
054 /**
055 * Creates a <code>DataSource</code> using hsqldb in memory-only mode
056 * @return the <code>DataSource</code>
057 */
058 private static DataSource createDataSource() {
059 DriverManagerDataSource ds = new DriverManagerDataSource();
060 ds.setDriverClassName("org.hsqldb.jdbcDriver");
061 ds.setUrl("jdbc:hsqldb:mem:test-database");
062 ds.setUsername("sa");
063
064 return ds;
065 }
066
067 public void testLoadExistingSettings() throws Exception {
068 jdbcTemplate.execute("INSERT INTO SETTINGS (ID, KEY, USER) VALUES (55, 'test-key', 'test-user')");
069 jdbcTemplate.execute("INSERT INTO SETTINGS_VALUES (SETTINGS_ID, KEY, VALUE) VALUES (55, 'key0', 'true')");
070 jdbcTemplate.execute("INSERT INTO SETTINGS_VALUES (SETTINGS_ID, KEY, VALUE) VALUES (55, 'key1', '25')");
071
072 JdbcSettings settings = new JdbcSettings(dataSource, "test-user", Integer.valueOf(55), "test-key");
073 settings.load();
074 }
075
076 public void testLoadHierarchy() throws Exception {
077
078 }
079
080 public void testSaveHierarchy() throws Exception {
081 JdbcSettings settings = new JdbcSettings(dataSource, "test-user", null, "test-key");
082 settings.setBoolean("boolean-value", true);
083
084 JdbcSettings childSettings = (JdbcSettings)settings.getSettings("child");
085 childSettings.setString("string", "test");
086 childSettings.save();
087
088 assertEquals(Integer.valueOf(0), settings.getId());
089 assertEquals(Integer.valueOf(1), childSettings.getId());
090 }
091
092 public void testSaveNewSettings() throws Exception {
093 JdbcSettings settings = new JdbcSettings(dataSource, "test-user", null, "test-key");
094
095 assertEquals("name not set", "test-key", settings.getName());
096 assertEquals("user not set", "test-user", settings.getUser());
097 assertNull("id must be null until first save", settings.getId());
098
099 settings.setBoolean("boolean-value", true);
100 settings.setString("string-value", "value");
101
102 settings.save();
103
104 assertEquals(Integer.valueOf(0), settings.getId());
105
106 assertEquals(1, jdbcTemplate.queryForInt("SELECT count(*) FROM SETTINGS"));
107 Map map = jdbcTemplate.queryForMap("SELECT * FROM SETTINGS WHERE ID = 0");
108 assertEquals(Integer.valueOf(0), map.get("ID"));
109 assertEquals("test-key", map.get("KEY"));
110 assertEquals(null, map.get("PARENT"));
111 assertEquals("test-user", map.get("USER"));
112
113 assertEquals(2, jdbcTemplate.queryForInt("SELECT count(*) FROM SETTINGS_VALUES"));
114 List values = jdbcTemplate.queryForList("SELECT * FROM SETTINGS_VALUES");
115 assertEquals(2, values.size());
116 Map first = (Map) values.get(0);
117 Map second = (Map) values.get(1);
118
119 assertEquals(Integer.valueOf(0), first.get("SETTINGS_ID"));
120 assertEquals(Integer.valueOf(0), second.get("SETTINGS_ID"));
121
122 assertEquals("boolean-value", first.get("KEY"));
123 assertEquals("true", first.get("VALUE"));
124
125 assertEquals("string-value", second.get("KEY"));
126 assertEquals("value", second.get("VALUE"));
127 }
128 }