This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch 
gh-readonly-queue/main/pr-6645-2a9c1e3022107a48a6470caf1a5630726a863059
in repository https://gitbox.apache.org/repos/asf/texera.git

commit cf4990f9d49a14facff0be19925b89ad269d48b5
Author: Matthew B. <[email protected]>
AuthorDate: Mon Jul 20 15:07:26 2026 -0700

    test(frontend): add unit tests for dataset-file parsing (#6645)
    
    ### What changes were proposed in this PR?
    - Add `frontend/src/app/common/type/dataset-file.spec.ts`, a new Vitest
    spec for the dataset-file path helpers, which previously had no
    dedicated unit tests.
    - Cover parseFilePathToDatasetFile for single and nested relative paths,
    with empty-segment filtering for leading, trailing, and double slashes.
    - Cover the fewer-than-four-segment throw path.
    - Cover parseDatasetFileToFilePath and both round-trip directions.
    ### Any related issues, documentation, discussions?
    Closes: #6644
    ### How was this PR tested?
    - Run: `cd frontend && node --max-old-space-size=8192
    ./node_modules/nx/dist/bin/nx.js test gui --watch=false
    --include=src/app/common/type/dataset-file.spec.ts`, expect all 7 tests
    passing.
    - Test-only change; no production code is modified.
    ### Was this PR authored or co-authored using generative AI tooling?
    Co-authored with Claude Opus 4.8 in compliance with ASF
---
 frontend/src/app/common/type/dataset-file.spec.ts | 85 +++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/frontend/src/app/common/type/dataset-file.spec.ts 
b/frontend/src/app/common/type/dataset-file.spec.ts
new file mode 100644
index 0000000000..76acdfe914
--- /dev/null
+++ b/frontend/src/app/common/type/dataset-file.spec.ts
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { DatasetFile, parseDatasetFileToFilePath, parseFilePathToDatasetFile } 
from "./dataset-file";
+
+describe("parseFilePathToDatasetFile", () => {
+  it("parses owner, dataset, version, and single-segment relative path", () => 
{
+    const result = 
parseFilePathToDatasetFile("/[email protected]/twitterDataset/v1/tw1.csv");
+    expect(result).toEqual({
+      ownerEmail: "[email protected]",
+      datasetName: "twitterDataset",
+      versionName: "v1",
+      fileRelativePath: "tw1.csv",
+    });
+  });
+
+  it("joins remaining segments into a nested relative path", () => {
+    const result = 
parseFilePathToDatasetFile("/[email protected]/twitterDataset/v1/california/irvine/tw1.csv");
+    expect(result.ownerEmail).toBe("[email protected]");
+    expect(result.datasetName).toBe("twitterDataset");
+    expect(result.versionName).toBe("v1");
+    expect(result.fileRelativePath).toBe("california/irvine/tw1.csv");
+  });
+
+  it("ignores empty segments from leading, trailing, and duplicate slashes", 
() => {
+    const result = 
parseFilePathToDatasetFile("//[email protected]//twitterDataset/v1/dir//file.csv/");
+    expect(result).toEqual({
+      ownerEmail: "[email protected]",
+      datasetName: "twitterDataset",
+      versionName: "v1",
+      fileRelativePath: "dir/file.csv",
+    });
+  });
+
+  it("throws when there are fewer than four path segments", () => {
+    expect(() => 
parseFilePathToDatasetFile("/[email protected]/twitterDataset/v1")).toThrow("Invalid
 file path format");
+    expect(() => parseFilePathToDatasetFile("")).toThrow("Invalid file path 
format");
+    expect(() => 
parseFilePathToDatasetFile("/just/three/parts")).toThrow("Invalid file path 
format");
+  });
+});
+
+describe("parseDatasetFileToFilePath", () => {
+  it("assembles a slash-delimited path with a leading slash", () => {
+    const datasetFile: DatasetFile = {
+      ownerEmail: "[email protected]",
+      datasetName: "twitterDataset",
+      versionName: "v1",
+      fileRelativePath: "california/irvine/tw1.csv",
+    };
+    
expect(parseDatasetFileToFilePath(datasetFile)).toBe("/[email protected]/twitterDataset/v1/california/irvine/tw1.csv");
+  });
+});
+
+describe("dataset-file round trips", () => {
+  it("path -> DatasetFile -> path is stable for a canonical path", () => {
+    const path = 
"/[email protected]/twitterDataset/v1/california/irvine/tw1.csv";
+    
expect(parseDatasetFileToFilePath(parseFilePathToDatasetFile(path))).toBe(path);
+  });
+
+  it("DatasetFile -> path -> DatasetFile is stable for a canonical object", () 
=> {
+    const datasetFile: DatasetFile = {
+      ownerEmail: "[email protected]",
+      datasetName: "sensorData",
+      versionName: "v42",
+      fileRelativePath: "2026/reading.json",
+    };
+    
expect(parseFilePathToDatasetFile(parseDatasetFileToFilePath(datasetFile))).toEqual(datasetFile);
+  });
+});

Reply via email to