mirror of
https://github.com/qlik-oss/nebula.js.git
synced 2025-12-20 02:08:58 -05:00
258 lines
5.9 KiB
Markdown
258 lines
5.9 KiB
Markdown
# Spec Command Testing Setup
|
|
|
|
## Overview
|
|
|
|
This document describes the testing infrastructure for the `nebula spec` command, which generates JSON schemas and TypeScript defaults from TypeScript interface definitions.
|
|
|
|
## Test Strategy
|
|
|
|
The spec command is tested as part of the `test-create` CI job, which validates that:
|
|
|
|
1. The TypeScript template can be created successfully
|
|
2. The spec command runs without errors
|
|
3. Generated files have the correct structure and content
|
|
4. The generated files are valid TypeScript/JSON
|
|
|
|
## Template Structure
|
|
|
|
### TypeScript Template (`commands/create/templates/sn/typescript/`)
|
|
|
|
The TypeScript template includes:
|
|
|
|
- **`src/PropertyDef.ts`** - TypeScript interface with JSDoc `@default` annotations
|
|
- **`nebula.config.js`** - Configuration for the spec command
|
|
- **`tsconfig.json`** - TypeScript compiler configuration
|
|
- **`_package.json`** - Includes `ts-json-schema-generator` and TypeScript dependencies
|
|
|
|
### Key Files
|
|
|
|
#### PropertyDef.ts
|
|
|
|
Defines chart properties with JSDoc annotations:
|
|
|
|
```typescript
|
|
export interface ChartProperties {
|
|
/**
|
|
* Chart title
|
|
* @default ""
|
|
*/
|
|
title?: string;
|
|
}
|
|
```
|
|
|
|
#### nebula.config.js
|
|
|
|
Configures the spec command:
|
|
|
|
```javascript
|
|
module.exports = {
|
|
spec: {
|
|
input: 'src/PropertyDef.ts',
|
|
output: 'generated',
|
|
interface: 'ChartProperties',
|
|
},
|
|
};
|
|
```
|
|
|
|
## Test Flow
|
|
|
|
### 1. Template Creation
|
|
|
|
The test script creates a TypeScript visualization project:
|
|
|
|
```bash
|
|
.github/scripts/nebula_create.sh generated/typescript-chart none false false true true true true
|
|
```
|
|
|
|
Parameters:
|
|
|
|
- `PROJECT_NAME`: generated/typescript-chart
|
|
- `PICASSO_TEMPLATE`: none
|
|
- `MASHUP`: false
|
|
- `INSTALL`: false
|
|
- `BUILD`: true
|
|
- `TEST`: true
|
|
- `TYPESCRIPT`: true (enables TypeScript template)
|
|
- `TEST_SPEC`: true (enables spec command testing)
|
|
|
|
### 2. Spec Command Execution
|
|
|
|
The script runs:
|
|
|
|
```bash
|
|
cd generated/typescript-chart
|
|
yarn run spec
|
|
```
|
|
|
|
### 3. Validation
|
|
|
|
The test validates:
|
|
|
|
#### File Creation
|
|
|
|
- `generated/generated-default-properties.ts` exists
|
|
- `generated/*-properties.schema.json` exists (name derived from package.json)
|
|
|
|
#### Schema Structure
|
|
|
|
- Contains `$id` field
|
|
- Contains `definitions` object
|
|
- Valid JSON format
|
|
|
|
#### Defaults Structure
|
|
|
|
- Contains TypeScript const declaration
|
|
- Proper type annotations
|
|
- Imports from PropertyDef
|
|
|
|
### 4. CI Artifacts
|
|
|
|
Generated files are uploaded as artifacts:
|
|
|
|
```yaml
|
|
- name: Store TypeScript spec generated files
|
|
uses: actions/upload-artifact@v5
|
|
with:
|
|
name: typescript-spec-generated
|
|
path: generated/typescript-chart/generated
|
|
```
|
|
|
|
## Test Script (`nebula_create.sh`)
|
|
|
|
### Spec-Specific Logic
|
|
|
|
```bash
|
|
if [ "$TEST_SPEC" = "true" ]; then
|
|
echo "Running spec command..."
|
|
yarn run spec
|
|
|
|
# Verify generated files exist
|
|
if [ ! -f "generated/generated-default-properties.ts" ]; then
|
|
echo "ERROR: generated-default-properties.ts was not created"
|
|
exit 1
|
|
fi
|
|
|
|
# Find schema file dynamically
|
|
SCHEMA_FILE=$(find generated -name "*-properties.schema.json" | head -n 1)
|
|
if [ -z "$SCHEMA_FILE" ]; then
|
|
echo "ERROR: JSON schema file was not created"
|
|
exit 1
|
|
fi
|
|
|
|
# Validate schema structure
|
|
if ! grep -q '"$id"' "$SCHEMA_FILE"; then
|
|
echo "ERROR: Schema file missing $id field"
|
|
exit 1
|
|
fi
|
|
|
|
# Validate defaults structure
|
|
if ! grep -q "const.*Defaults.*:" "generated/generated-default-properties.ts"; then
|
|
echo "ERROR: Defaults file has incorrect structure"
|
|
exit 1
|
|
fi
|
|
fi
|
|
```
|
|
|
|
## CI Workflow
|
|
|
|
### Test-Create Job
|
|
|
|
```yaml
|
|
- name: Create Nebula TypeScript project with spec command test
|
|
run: .github/scripts/nebula_create.sh generated/typescript-chart none false false true true true true
|
|
```
|
|
|
|
This step:
|
|
|
|
1. Creates a TypeScript template project
|
|
2. Links local @nebula.js packages
|
|
3. Runs the spec command
|
|
4. Validates generated files
|
|
5. Builds the project
|
|
6. Runs e2e tests
|
|
|
|
## Extending the Tests
|
|
|
|
### Adding More Validations
|
|
|
|
To add more validation steps, edit `.github/scripts/nebula_create.sh`:
|
|
|
|
```bash
|
|
# Example: Verify specific default values
|
|
if ! grep -q '"showTitles": true' "generated/generated-default-properties.ts"; then
|
|
echo "ERROR: Default value for showTitles not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Example: Validate schema definitions
|
|
if ! jq -e '.definitions.ChartProperties' "$SCHEMA_FILE" > /dev/null; then
|
|
echo "ERROR: ChartProperties definition not found in schema"
|
|
exit 1
|
|
fi
|
|
```
|
|
|
|
### Testing Different Configurations
|
|
|
|
Create additional test runs with different configurations:
|
|
|
|
```yaml
|
|
- name: Test spec with custom config
|
|
run: |
|
|
cd generated/typescript-chart
|
|
echo 'module.exports = { spec: { schemaOnly: true } };' > nebula.config.js
|
|
yarn run spec
|
|
# Validate only schema was generated
|
|
```
|
|
|
|
## Local Testing
|
|
|
|
To test locally:
|
|
|
|
```bash
|
|
# Build the monorepo
|
|
yarn build
|
|
|
|
# Run the test script
|
|
.github/scripts/nebula_create.sh test-project none false false true true true true
|
|
|
|
# Check generated files
|
|
ls -la test-project/generated/
|
|
cat test-project/generated/generated-default-properties.ts
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Missing dependencies**: Ensure `ts-json-schema-generator` is installed
|
|
2. **Invalid TypeScript**: Check `PropertyDef.ts` syntax
|
|
3. **Schema generation fails**: Verify `tsconfig.json` is valid
|
|
4. **Defaults not extracted**: Ensure `@default` JSDoc tags are present
|
|
|
|
### Debug Output
|
|
|
|
Add debugging to the test script:
|
|
|
|
```bash
|
|
if [ "$TEST_SPEC" = "true" ]; then
|
|
echo "=== Debug: Running spec command ==="
|
|
yarn run spec --verbose
|
|
|
|
echo "=== Debug: Generated files ==="
|
|
ls -lah generated/
|
|
|
|
echo "=== Debug: Schema content ==="
|
|
cat generated/*-properties.schema.json | jq '.'
|
|
fi
|
|
```
|
|
|
|
## Future Enhancements
|
|
|
|
Potential improvements to the testing setup:
|
|
|
|
1. **Unit tests**: Add Jest tests for the spec command itself
|
|
2. **Snapshot testing**: Compare generated files against snapshots
|
|
3. **Multiple templates**: Test with different TypeScript configurations
|
|
4. **Integration tests**: Verify generated files work in actual charts
|
|
5. **Performance testing**: Measure generation time for large interfaces
|