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 }