Fixed workspace tests

Mikayla Maki created

Change summary

crates/workspace/src/persistence.rs | 81 ++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+), 2 deletions(-)

Detailed changes

crates/workspace/src/persistence.rs 🔗

@@ -147,14 +147,19 @@ impl WorkspaceDb {
                 DELETE FROM panes WHERE workspace_id = ?1;"})?(workspace.id)
             .context("Clearing old panes")?;
 
+            self.exec_bound(indoc! {"
+                DELETE FROM workspaces WHERE workspace_location = ? AND workspace_id != ?
+                "})?((&workspace.location, workspace.id))
+            .context("clearing out old locations")?;
+            
             // Update or insert
             self.exec_bound(indoc! {
                 "INSERT INTO
                     workspaces(workspace_id, workspace_location, dock_visible, dock_anchor, timestamp) 
                  VALUES 
                     (?1, ?2, ?3, ?4, CURRENT_TIMESTAMP)
-                 ON CONFLICT DO UPDATE SET 
-                 workspace_location = ?2, dock_visible = ?3, dock_anchor = ?4, timestamp = CURRENT_TIMESTAMP"
+                 ON CONFLICT DO UPDATE SET
+                    workspace_location = ?2, dock_visible = ?3, dock_anchor = ?4, timestamp = CURRENT_TIMESTAMP"
             })?((workspace.id, &workspace.location, workspace.dock_position))
             .context("Updating workspace")?;
 
@@ -372,11 +377,83 @@ impl WorkspaceDb {
 #[cfg(test)]
 mod tests {
 
+    use std::sync::Arc;
+
     use db::open_memory_db;
     use settings::DockAnchor;
 
     use super::*;
 
+    #[test]
+    fn test_workspace_id_stability() {
+        env_logger::try_init().ok();
+
+        let db = WorkspaceDb(open_memory_db(Some("test_workspace_id_stability")));
+
+        db.migrate(
+            "test_table",
+            &["CREATE TABLE test_table(
+                text TEXT,
+                workspace_id INTEGER,
+                FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
+                    ON DELETE CASCADE
+            ) STRICT;"],
+        )
+        .unwrap();
+
+        let mut workspace_1 = SerializedWorkspace {
+            id: 1,
+            location: (["/tmp", "/tmp2"]).into(),
+            dock_position: crate::dock::DockPosition::Shown(DockAnchor::Bottom),
+            center_group: Default::default(),
+            dock_pane: Default::default(),
+        };
+
+        let mut workspace_2 = SerializedWorkspace {
+            id: 2,
+            location: (["/tmp"]).into(),
+            dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Expanded),
+            center_group: Default::default(),
+            dock_pane: Default::default(),
+        };
+
+        db.save_workspace(&workspace_1);
+
+        db.exec_bound("INSERT INTO test_table(text, workspace_id) VALUES (?, ?)")
+            .unwrap()(("test-text-1", 1))
+        .unwrap();
+
+        db.save_workspace(&workspace_2);
+
+        db.exec_bound("INSERT INTO test_table(text, workspace_id) VALUES (?, ?)")
+            .unwrap()(("test-text-2", 2))
+        .unwrap();
+
+        workspace_1.location = (["/tmp", "/tmp3"]).into();
+        db.save_workspace(&workspace_1);
+        db.save_workspace(&workspace_1);
+
+        workspace_2.dock_pane.children.push(SerializedItem {
+            kind: Arc::from("Test"),
+            item_id: 10,
+        });
+        db.save_workspace(&workspace_2);
+
+        let test_text_1 = db
+            .select_row_bound::<_, String>("SELECT text FROM test_table WHERE workspace_id = ?")
+            .unwrap()(2)
+        .unwrap()
+        .unwrap();
+        assert_eq!(test_text_1, "test-text-2");
+
+        let test_text_2 = db
+            .select_row_bound::<_, String>("SELECT text FROM test_table WHERE workspace_id = ?")
+            .unwrap()(1)
+        .unwrap()
+        .unwrap();
+        assert_eq!(test_text_2, "test-text-1");
+    }
+
     #[test]
     fn test_full_workspace_serialization() {
         env_logger::try_init().ok();