'use strict'; const assert = require('assert/strict'); const fs = require('fs'); const os = require('os'); const path = require('path'); const { compileInput } = require('../src/compile/compiler'); const { ensureRevisionStore } = require('../src/compile/road-revisions'); const { editPreview, editState, rebaseEdits, saveEdits } = require('../workbench/server'); const workspace = fs.mkdtempSync(path.join(os.tmpdir(), 'workbench-edit-api-')); const input = { areaId: 'edit-api-test', osmFile: path.join(workspace, 'source.osm'), outDir: path.join(workspace, 'outputs', 'native-road'), stagingDir: path.join(workspace, 'outputs', '_pipeline'), overridesFile: path.join(workspace, 'native-road-overrides.json'), trafficSignalsFile: path.join(workspace, 'native-traffic-signals.json'), options: { edgeLines: false, junctionTemplates: { enabled: false, references: [] } }, }; fs.copyFileSync(path.join(__dirname, 'fixtures', 'fengshu-er-road.osm'), input.osmFile); fs.writeFileSync(input.overridesFile, `${JSON.stringify({ schema: 'native-road-overrides/v1', overrides: [] })}\n`); fs.writeFileSync( input.trafficSignalsFile, `${JSON.stringify({ schema: 'native-traffic-signals/v1', provenance: 'empty', assemblies: { type: 'FeatureCollection', features: [] } })}\n`, ); const initialized = ensureRevisionStore(workspace, input.options); const area = compileInput({ ...input, areaConfigSnapshotFile: initialized.paths.activeAreaConfig, editsFile: initialized.paths.activeEdits, }).area; const state = editState(area); assert.equal(state.active, true); assert.equal(state.documentVersion, 0); assert.equal(state.handles.schema, 'road-edit-handles/v1'); assert.equal(state.activeRevisionId, 'rev-0001'); const trackedFiles = [ initialized.paths.activeEdits, initialized.paths.activeState, initialized.paths.activeAreaConfig, ].map((file) => ({ file, bytes: fs.readFileSync(file), mtimeMs: fs.statSync(file).mtimeMs, })); const preview = editPreview(area, { previewSeq: 17, document: state.document }); assert.equal(preview.ok, true); assert.equal(preview.previewSeq, 17); assert.equal(preview.degraded, false); assert.equal(preview.handles.schema, 'road-edit-handles/v1'); assert.ok(preview.layers.roadSurface); for (const tracked of trackedFiles) { assert.deepEqual(fs.readFileSync(tracked.file), tracked.bytes, `${tracked.file} bytes unchanged by preview`); assert.equal(fs.statSync(tracked.file).mtimeMs, tracked.mtimeMs, `${tracked.file} mtime unchanged by preview`); } const saved = saveEdits(area, { expectedDocumentVersion: 0, document: state.document }); assert.equal(saved.documentVersion, 1); const beforeConflict = fs.readFileSync(initialized.paths.activeEdits); assert.throws( () => saveEdits(area, { expectedDocumentVersion: 0, document: state.document }), (error) => error.statusCode === 409 && error.current.documentVersion === 1, ); assert.deepEqual(fs.readFileSync(initialized.paths.activeEdits), beforeConflict, '409 does not write the document'); const checkpoint = require('../src/compile/road-revisions').createCheckpoint(workspace, 'Preview checkpoint'); assert.equal(checkpoint.manifest.id, 'rev-0002'); const rebased = rebaseEdits(area, checkpoint.manifest.id); assert.equal(rebased.counts.exact, 0); assert.deepEqual(rebased.constraints, []); fs.rmSync(workspace, { recursive: true, force: true }); console.log('workbench edit API tests passed');