Skip to content

Commit

Permalink
Change plugin and runner declaration (#14)
Browse files Browse the repository at this point in the history
* Change plugin and runner declaration

* Bump version

* Update packages
  • Loading branch information
abdala authored Oct 15, 2024
1 parent 33b9f03 commit 6377961
Show file tree
Hide file tree
Showing 62 changed files with 1,943 additions and 1,750 deletions.
2 changes: 1 addition & 1 deletion assert/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cgauge/assert",
"version": "0.3.1",
"version": "0.4.0",
"description": "Extra assert library",
"type": "module",
"repository": {
Expand Down
13 changes: 2 additions & 11 deletions docs/docs/dtc/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,8 @@ It is possible to configure custom loaders, runners, test types and plugins.
// dtc.config.js
export default {
loader: async (filePath) => customLoader(filePath),
runner: new CustomTestRunner(),
plugins: {
unit: [new CustomPlugin()],
customTestType: [new CustomPlugin(), new AnotherPlugin()],
},
runner: customTestRunner,
plugins: ['../local/plugin.js', '@package/dtc-plugin'],
testRegex: /.*\.dtc\.[jt]s?$/
}
```
Expand All @@ -29,9 +26,3 @@ export default {
```sh
npx dtc -c dtc.config.js
```

## Executing a custom test type

```sh
npx dtc -c dtc.config.js -t customTestType
```
14 changes: 6 additions & 8 deletions docs/docs/dtc/quick-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,12 @@ export const greeting = (name) => `Hello ${name}`
// hello.dtc.js
export default {
name: 'My first test case',
unit: {
act: {
import: 'greeting',
from: './hello.js',
arguments: ['World']
},
assert: 'Hello World'
}
act: {
import: 'greeting',
from: './hello.js',
arguments: ['World']
},
assert: 'Hello World'
}
```

Expand Down
8 changes: 4 additions & 4 deletions dtc-aws-plugin/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cgauge/dtc-aws-plugin",
"version": "0.3.1",
"version": "0.4.0",
"description": "AWS plugin for Declarative TestCases",
"repository": {
"type": "git",
Expand All @@ -15,9 +15,9 @@
"author": "Abdala Cerqueira",
"license": "LGPL-3.0-or-later",
"dependencies": {
"@cgauge/assert": "^0.3.0",
"@cgauge/dtc": "^0.3.0",
"@cgauge/nock-aws": "^0.3.0",
"@cgauge/assert": "^0.4.0",
"@cgauge/dtc": "^0.4.0",
"@cgauge/nock-aws": "^0.4.0",
"@aws-sdk/client-dynamodb": "^3.645.0",
"@aws-sdk/client-eventbridge": "^3.645.0",
"@aws-sdk/client-lambda": "^3.645.0",
Expand Down
71 changes: 0 additions & 71 deletions dtc-aws-plugin/src/LambdaPlugin.ts

This file was deleted.

26 changes: 0 additions & 26 deletions dtc-aws-plugin/src/SnsPlugin.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {Plugin, isRecord, debug} from '@cgauge/dtc'
import {isRecord, debug} from '@cgauge/dtc'
import {DynamoDB, AttributeValue} from '@aws-sdk/client-dynamodb'
import {DynamoDBDocument} from '@aws-sdk/lib-dynamodb'
import extraAssert from '@cgauge/assert'
Expand Down Expand Up @@ -105,36 +105,34 @@ const cleanDynamoItems = async (clean: DynamoClean) => {
}
}

export class DynamoDbPlugin implements Plugin {
async arrange(args: unknown): Promise<void> {
if (!isDynamoArrange(args) || !Array.isArray(args.dynamodb)) {
return
}

await Promise.all(args.dynamodb.map(executeDynamoStatement))
export const arrange = async (args: unknown) => {
if (!isDynamoArrange(args) || !Array.isArray(args.dynamodb)) {
return
}

async act(args: unknown): Promise<void> {
if (!isDynamoAct(args)) {
return
}
await Promise.all(args.dynamodb.map(executeDynamoStatement))
}

await documentClient.put({TableName: args.table, Item: args.item})
export const act = async (args: unknown) => {
if (!isDynamoAct(args)) {
return
}

async assert(args: unknown): Promise<void> {
if (!isDynamoAssert(args) || !Array.isArray(args.dynamodb)) {
return
}
await documentClient.put({TableName: args.table, Item: args.item})
}

await Promise.all(args.dynamodb.map(assertExists))
export const assert = async (args: unknown) => {
if (!isDynamoAssert(args) || !Array.isArray(args.dynamodb)) {
return
}

async clean(args: unknown) {
if (!isDynamoClean(args) || !Array.isArray(args.dynamodb)) {
return
}
await Promise.all(args.dynamodb.map(assertExists))
}

await Promise.all(args.dynamodb.map(cleanDynamoItems))
export const clean = async (args: unknown) => {
if (!isDynamoClean(args) || !Array.isArray(args.dynamodb)) {
return
}

await Promise.all(args.dynamodb.map(cleanDynamoItems))
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {Plugin, isRecord} from '@cgauge/dtc'
import {isRecord} from '@cgauge/dtc'
import {EventBridge} from '@aws-sdk/client-eventbridge'

type EventBridgeCall = {
Expand All @@ -13,8 +13,7 @@ const isEventBridgeAct = (v: unknown): v is EventBridgeCall =>

const eventBridge = new EventBridge({})

export class EventBridgePlugin implements Plugin {
async act(args: unknown): Promise<void> {
export const act = async (args: unknown) => {
if (!isEventBridgeAct(args)) {
return
}
Expand All @@ -31,4 +30,3 @@ export class EventBridgePlugin implements Plugin {
],
})
}
}
8 changes: 4 additions & 4 deletions dtc-aws-plugin/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export * from './DynamoDbPlugin.js'
export * from './EventBridge.js'
export * from './LambdaPlugin.js'
export * from './SnsPlugin.js'
export * as DynamoDbPlugin from './dynamo-db-plugin.js'
export * as EventBridgePlugin from './event-bridge-plugin.js'
export * as LambdaPlugin from './lambda-plugin.js'
export * as SnsPlugin from './sns-plugin.js'
69 changes: 69 additions & 0 deletions dtc-aws-plugin/src/lambda-plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import {isRecord} from '@cgauge/dtc'
import {Lambda} from '@aws-sdk/client-lambda'
import extraAssert from '@cgauge/assert'

type LambdaCall = {
functionName: string
payload: Record<string, unknown>
}

const isLambdaAct = (v: unknown): v is LambdaCall => isRecord(v) && 'functionName' in v && 'payload' in v

const lambda = new Lambda({})

export const invokeLambda = async (functionName: string, event: unknown): Promise<any> => {
const response = await lambda.invoke({
FunctionName: functionName,
Payload: Buffer.from(JSON.stringify(event)),
})

const payload = new TextDecoder('utf-8').decode(response.Payload)

return JSON.parse(payload)
}

let response: unknown | undefined

export const arrange = async (args: unknown) => {
if (!isRecord(args) || !('lambda' in args)) {
return
}

if (!Array.isArray(args.lambda)) {
return
}

await Promise.all(args.lambda.map((v) => invokeLambda(v.functionName, v.payload)))
}

export const act = async (args: unknown) => {
if (!isLambdaAct(args)) {
return
}

response = await invokeLambda(args.functionName, args.payload)
}

export const assert = async (args: unknown) => {
if (!isRecord(args) || !('lambda' in args)) {
return
}

if (!isRecord(args.lambda)) {
return
}

extraAssert.objectContains(args.lambda, response as Record<string, unknown>)
}

export const clean = async (args: unknown) => {
if (!isRecord(args) || !('lambda' in args)) {
return
}

if (!Array.isArray(args.lambda)) {
return
}

await Promise.all(args.lambda.map((v) => invokeLambda(v.functionName, v.payload)))
}
24 changes: 24 additions & 0 deletions dtc-aws-plugin/src/sns-plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {isRecord} from '@cgauge/dtc'
import {MessageAttributeValue, SNS} from '@aws-sdk/client-sns'

type SnsCall = {
topic: string
message: Record<string, unknown>
messageAttributes?: Record<string, MessageAttributeValue>
}

const isSnsAct = (v: unknown): v is SnsCall => isRecord(v) && 'topic' in v && 'message' in v

const sns = new SNS({})

export const act = async (args: unknown) => {
if (!isSnsAct(args)) {
return
}

await sns.publish({
TopicArn: args.topic,
Message: JSON.stringify(args.message),
MessageAttributes: args.messageAttributes,
})
}
Loading

0 comments on commit 6377961

Please sign in to comment.