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    }