Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions packages/pipeline/src/distribution/importResolver.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { type Dataset, Distribution } from '@lde/dataset';
import type { Importer } from '@lde/sparql-importer';
import { ImportFailed, ImportSuccessful } from '@lde/sparql-importer';
import type { SparqlServer } from '@lde/sparql-server';
import {
type DistributionResolver,
Expand Down Expand Up @@ -66,7 +65,7 @@ export class ImportResolver implements DistributionResolver {
const importStart = Date.now();
const importResult = await this.options.importer.import(dataset);

if (importResult instanceof ImportSuccessful) {
if (importResult.type === 'successful') {
await this.options.server.start();

const distribution = Distribution.sparql(
Expand All @@ -87,7 +86,7 @@ export class ImportResolver implements DistributionResolver {
dataset,
'No SPARQL endpoint or importable data dump available',
probeResults,
importResult instanceof ImportFailed ? importResult : undefined,
importResult.type === 'failed' ? importResult : undefined,
);
}

Expand Down
99 changes: 45 additions & 54 deletions packages/pipeline/test/distribution/importResolver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
type DistributionResolver,
} from '../../src/distribution/index.js';
import { Dataset, Distribution } from '@lde/dataset';
import { ImportSuccessful, ImportFailed } from '@lde/sparql-importer';
import type { ImportSuccessful, ImportFailed } from '@lde/sparql-importer';
import type { SparqlServer } from '@lde/sparql-server';
import { describe, it, expect, vi } from 'vitest';

Expand Down Expand Up @@ -78,14 +78,13 @@ describe('ImportResolver', () => {
);

const mockImporter = {
import: vi
.fn()
.mockResolvedValue(
new ImportSuccessful(
Distribution.sparql(new URL('http://localhost:7878/sparql')),
'test-graph',
),
import: vi.fn().mockResolvedValue({
type: 'successful',
distribution: Distribution.sparql(
new URL('http://localhost:7878/sparql'),
),
identifier: 'test-graph',
} satisfies ImportSuccessful),
};

const server = makeServer();
Expand Down Expand Up @@ -118,11 +117,11 @@ describe('ImportResolver', () => {
new URL('http://localhost:7878/sparql'),
);
const mockImporter = {
import: vi
.fn()
.mockResolvedValue(
new ImportSuccessful(importedDistribution, 'test-graph'),
),
import: vi.fn().mockResolvedValue({
type: 'successful',
distribution: importedDistribution,
identifier: 'test-graph',
} satisfies ImportSuccessful),
};

const server = makeServer();
Expand Down Expand Up @@ -163,17 +162,14 @@ describe('ImportResolver', () => {
);

const mockImporter = {
import: vi
.fn()
.mockResolvedValue(
new ImportFailed(
new Distribution(
new URL('http://example.org/data.nt'),
'application/n-triples',
),
'Parse error',
),
import: vi.fn().mockResolvedValue({
type: 'failed',
distribution: new Distribution(
new URL('http://example.org/data.nt'),
'application/n-triples',
),
error: 'Parse error',
} satisfies ImportFailed),
};

const resolver = new ImportResolver(inner, {
Expand All @@ -184,7 +180,7 @@ describe('ImportResolver', () => {

expect(result).toBeInstanceOf(NoDistributionAvailable);
const noDistribution = result as NoDistributionAvailable;
expect(noDistribution.importFailed).toBeInstanceOf(ImportFailed);
expect(noDistribution.importFailed?.type).toBe('failed');
expect(noDistribution.importFailed!.error).toBe('Parse error');
expect(noDistribution.probeResults).toHaveLength(1);
});
Expand All @@ -201,14 +197,13 @@ describe('ImportResolver', () => {
const inner = makeInnerResolver(resolved);

const mockImporter = {
import: vi
.fn()
.mockResolvedValue(
new ImportSuccessful(
Distribution.sparql(new URL('http://localhost:7878/sparql')),
'test-graph',
),
import: vi.fn().mockResolvedValue({
type: 'successful',
distribution: Distribution.sparql(
new URL('http://localhost:7878/sparql'),
),
identifier: 'test-graph',
} satisfies ImportSuccessful),
};

const server = makeServer();
Expand Down Expand Up @@ -241,17 +236,14 @@ describe('ImportResolver', () => {
const inner = makeInnerResolver(resolved);

const mockImporter = {
import: vi
.fn()
.mockResolvedValue(
new ImportFailed(
new Distribution(
new URL('http://example.org/data.nt'),
'application/n-triples',
),
'Parse error',
),
import: vi.fn().mockResolvedValue({
type: 'failed',
distribution: new Distribution(
new URL('http://example.org/data.nt'),
'application/n-triples',
),
error: 'Parse error',
} satisfies ImportFailed),
};

const resolver = new ImportResolver(inner, {
Expand All @@ -264,7 +256,7 @@ describe('ImportResolver', () => {
expect(result).toBeInstanceOf(NoDistributionAvailable);
const noDistribution = result as NoDistributionAvailable;
expect(noDistribution.probeResults).toHaveLength(1);
expect(noDistribution.importFailed).toBeInstanceOf(ImportFailed);
expect(noDistribution.importFailed?.type).toBe('failed');
});

it('default strategy preserves existing sparql-first behaviour', async () => {
Expand Down Expand Up @@ -296,14 +288,13 @@ describe('ImportResolver', () => {
);

const mockImporter = {
import: vi
.fn()
.mockResolvedValue(
new ImportSuccessful(
Distribution.sparql(new URL('http://localhost:7878/sparql')),
'test-graph',
),
import: vi.fn().mockResolvedValue({
type: 'successful',
distribution: Distribution.sparql(
new URL('http://localhost:7878/sparql'),
),
identifier: 'test-graph',
} satisfies ImportSuccessful),
};

const server = makeServer();
Expand Down Expand Up @@ -355,11 +346,11 @@ describe('ImportResolver', () => {
importedDistribution.subjectFilter = '?s a <http://example.org/Type> .';

const mockImporter = {
import: vi
.fn()
.mockResolvedValue(
new ImportSuccessful(importedDistribution, 'test-graph'),
),
import: vi.fn().mockResolvedValue({
type: 'successful',
distribution: importedDistribution,
identifier: 'test-graph',
} satisfies ImportSuccessful),
};

const server = makeServer();
Expand Down
8 changes: 6 additions & 2 deletions packages/pipeline/test/distribution/report.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, it, expect } from 'vitest';
import { Store } from 'n3';
import { Distribution } from '@lde/dataset';
import { ImportFailed } from '@lde/sparql-importer';
import type { ImportFailed } from '@lde/sparql-importer';
import {
probeResultsToQuads,
NetworkError,
Expand Down Expand Up @@ -179,7 +179,11 @@ describe('probeResultsToQuads', () => {
headers: { 'Content-Length': '1000' },
}),
);
const importError = new ImportFailed(distribution, 'Parse error');
const importError: ImportFailed = {
type: 'failed',
distribution,
error: 'Parse error',
};

const store = await collect(
probeResultsToQuads(
Expand Down
38 changes: 21 additions & 17 deletions packages/pipeline/test/distribution/resolveDistributions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
type DistributionResolver,
} from '../../src/distribution/index.js';
import { Dataset, Distribution } from '@lde/dataset';
import { ImportFailed } from '@lde/sparql-importer';
import type { ImportFailed } from '@lde/sparql-importer';
import {
SparqlProbeResult,
DataDumpProbeResult,
Expand All @@ -22,29 +22,29 @@ async function collect<T>(iterable: AsyncIterable<T>): Promise<T[]> {
}

function mockResolver(
result: ResolvedDistribution | NoDistributionAvailable
result: ResolvedDistribution | NoDistributionAvailable,
): DistributionResolver {
return { resolve: async () => result };
}

describe('resolveDistributions', () => {
it('returns resolved distribution and probe report quads', async () => {
const distribution = Distribution.sparql(
new URL('http://example.org/sparql')
new URL('http://example.org/sparql'),
);
const probeResult = new SparqlProbeResult(
'http://example.org/sparql',
new Response('{}', {
status: 200,
headers: { 'Content-Type': 'application/sparql-results+json' },
})
}),
);
const dataset = new Dataset({
iri: new URL('http://example.org/dataset'),
distributions: [distribution],
});
const resolver = mockResolver(
new ResolvedDistribution(distribution, [probeResult])
new ResolvedDistribution(distribution, [probeResult]),
);

const result = await resolveDistributions(dataset, resolver);
Expand All @@ -64,14 +64,14 @@ describe('resolveDistributions', () => {
});
const networkError = new NetworkError(
'http://example.org/sparql',
'Connection refused'
'Connection refused',
);
const resolver = mockResolver(
new NoDistributionAvailable(
dataset,
'No SPARQL endpoint or importable data dump available',
[networkError]
)
[networkError],
),
);

const result = await resolveDistributions(dataset, resolver);
Expand All @@ -81,7 +81,7 @@ describe('resolveDistributions', () => {
const quads = await collect(result.quads);
expect(quads.length).toBeGreaterThan(0);
const errorQuad = quads.find(
(q) => q.predicate.value === 'https://schema.org/error'
(q) => q.predicate.value === 'https://schema.org/error',
);
expect(errorQuad).toBeDefined();
expect(errorQuad!.object.value).toBe('Connection refused');
Expand All @@ -90,7 +90,7 @@ describe('resolveDistributions', () => {
it('returns null distribution and import error quads when importer fails', async () => {
const dataDumpDistribution = new Distribution(
new URL('http://example.org/data.nt'),
'application/n-triples'
'application/n-triples',
);
const dataset = new Dataset({
iri: new URL('http://example.org/dataset'),
Expand All @@ -101,16 +101,20 @@ describe('resolveDistributions', () => {
new Response('', {
status: 200,
headers: { 'Content-Length': '1000' },
})
}),
);
const importFailed = new ImportFailed(dataDumpDistribution, 'Parse error');
const importFailed: ImportFailed = {
type: 'failed',
distribution: dataDumpDistribution,
error: 'Parse error',
};
const resolver = mockResolver(
new NoDistributionAvailable(
dataset,
'No SPARQL endpoint or importable data dump available',
[probeResult],
importFailed
)
importFailed,
),
);

const result = await resolveDistributions(dataset, resolver);
Expand All @@ -122,21 +126,21 @@ describe('resolveDistributions', () => {
const errorQuad = quads.find(
(q) =>
q.predicate.value === 'https://schema.org/error' &&
q.object.value === 'Parse error'
q.object.value === 'Parse error',
);
expect(errorQuad).toBeDefined();
});

it('works with a custom DistributionResolver implementation', async () => {
const distribution = Distribution.sparql(
new URL('http://custom.org/sparql')
new URL('http://custom.org/sparql'),
);
const probeResult = new SparqlProbeResult(
'http://custom.org/sparql',
new Response('{}', {
status: 200,
headers: { 'Content-Type': 'application/sparql-results+json' },
})
}),
);
const dataset = new Dataset({
iri: new URL('http://custom.org/dataset'),
Expand Down
Loading