Revision: 3371
Author: mo.jeff
Date: Wed Mar 10 15:32:56 2010
Log: Added a Test Case for ArchitectSessionPersisterTest, specifically testing it's integration with the SPJSONPersister.
http://code.google.com/p/power-architect/source/detail?r=3371

Added:
 /trunk/regress/ca/sqlpower/architect/enterprise
/trunk/regress/ca/sqlpower/architect/enterprise/ArchitectSessionPersisterTest.java

=======================================
--- /dev/null
+++ /trunk/regress/ca/sqlpower/architect/enterprise/ArchitectSessionPersisterTest.java Wed Mar 10 15:32:56 2010
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2010, SQL Power Group Inc.
+ *
+ * This file is part of Power*Architect.
+ *
+ * Power*Architect is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Power*Architect is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package ca.sqlpower.architect.enterprise;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import ca.sqlpower.architect.ArchitectProject;
+import ca.sqlpower.architect.ArchitectSession;
+import ca.sqlpower.architect.ArchitectSessionContextImpl;
+import ca.sqlpower.architect.ArchitectSessionImpl;
+import ca.sqlpower.dao.MessageSender;
+import ca.sqlpower.dao.SPPersistenceException;
+import ca.sqlpower.dao.SPPersister.DataType;
+import ca.sqlpower.dao.json.SPJSONMessageDecoder;
+import ca.sqlpower.dao.json.SPJSONPersister;
+import ca.sqlpower.dao.session.SessionPersisterSuperConverter;
+import ca.sqlpower.sqlobject.DatabaseConnectedTestCase;
+import ca.sqlpower.sqlobject.SQLDatabase;
+import ca.sqlpower.sqlobject.SQLObject;
+import ca.sqlpower.sqlobject.SQLObjectRoot;
+
+/**
+ * A test suite to ensure the proper functionality of the {...@link ArchitectSessionPersister}.
+ */
+public class ArchitectSessionPersisterTest extends DatabaseConnectedTestCase {
+
+    private ArchitectSessionPersister persister;
+    private ArchitectSession session;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+ session = new ArchitectSessionImpl(new ArchitectSessionContextImpl(), "test"); + SessionPersisterSuperConverter converter = new ArchitectPersisterSuperConverter(getPLIni(), session.getWorkspace()); + persister = new ArchitectSessionPersister("test", session.getWorkspace(), converter);
+        persister.setSession(session);
+    }
+
+    /**
+     * Tests adding a SQLDatabase to an ArchitectSession through an
+ * {...@link SPJSONPersister} hooked up to n {...@link ArchitectSessionPersister}
+     */
+ public void testPersistSQLDatabaseWithJSONPersister() throws Exception {
+        SPJSONMessageDecoder decoder = new SPJSONMessageDecoder(persister);
+ SPJSONPersister jsonPersister = new SPJSONPersister(new DirectJsonMessageSender(decoder));
+
+        jsonPersister.begin();
+ jsonPersister.persistObject(session.getRootObject().getUUID(), SQLDatabase.class.getName(), "database", 0); + jsonPersister.persistProperty("database", "dataSource", DataType.STRING, "regression_test");
+        jsonPersister.commit();
+
+        SQLObjectRoot root = session.getRootObject();
+        SQLObject rootChild = root.getChild(0);
+        assertTrue(rootChild instanceof SQLDatabase);
+        assertEquals("database", rootChild.getUUID());
+        assertEquals("regression_test", rootChild.getName());
+    }
+
+    /**
+     * Test changing the project name through the {...@link SPJSONPersister}
+     */
+    public void testChangePropertyWithJSONPersister() throws Exception {
+        SPJSONMessageDecoder decoder = new SPJSONMessageDecoder(persister);
+ SPJSONPersister jsonPersister = new SPJSONPersister(new DirectJsonMessageSender(decoder));
+
+        jsonPersister.begin();
+ jsonPersister.persistProperty(session.getWorkspace().getUUID(), "name", DataType.STRING, "", "newProjectName");
+        jsonPersister.commit();
+
+        ArchitectProject project = session.getWorkspace();
+        assertEquals("newProjectName", project.getName());
+    }
+
+    /**
+     * Sends JSON messages directly to the JSON decoder
+     */
+ private class DirectJsonMessageSender implements MessageSender<JSONObject> {
+
+        private final SPJSONMessageDecoder decoder;
+
+        private JSONArray array;
+
+        public DirectJsonMessageSender(SPJSONMessageDecoder decoder) {
+            this.decoder = decoder;
+            this.array = new JSONArray();
+        }
+
+        public void clear() {
+            // messages get sent directly so no need to 'clear'
+        }
+
+        public void flush() throws SPPersistenceException {
+            decoder.decode(array.toString());
+            array = new JSONArray();
+            // I wish JSONArray had a clear, but since this is just a test
+            // class, I'm not that concerned of any performance hit from
+            // creating a new object at this point.
+        }
+
+ public void send(JSONObject content) throws SPPersistenceException {
+            array.put(content);
+        }
+
+    }
+}

Reply via email to