Compare commits

...

19 Commits

Author SHA1 Message Date
Christian Georgi
2b03529a4c PDF export PoC 2023-03-14 15:28:26 +01:00
dependabot[bot]
bed293f1b2 Bump @sap/cds from 6.6.0 to 6.6.1
Bumps [@sap/cds](https://cap.cloud.sap/) from 6.6.0 to 6.6.1.

---
updated-dependencies:
- dependency-name: "@sap/cds"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-10 14:23:03 +01:00
dependabot[bot]
50b13f60ce Bump @sap/cds from 6.5.0 to 6.6.0
Bumps [@sap/cds](https://cap.cloud.sap/) from 6.5.0 to 6.6.0.

---
updated-dependencies:
- dependency-name: "@sap/cds"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 16:05:58 +01:00
dependabot[bot]
f889c27338 Bump @sap/eslint-plugin-cds from 2.6.1 to 2.6.3
Bumps [@sap/eslint-plugin-cds](https://cap.cloud.sap/) from 2.6.1 to 2.6.3.

---
updated-dependencies:
- dependency-name: "@sap/eslint-plugin-cds"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-28 11:56:46 +01:00
dependabot[bot]
624c6c5c72 Bump axios from 1.3.3 to 1.3.4
Bumps [axios](https://github.com/axios/axios) from 1.3.3 to 1.3.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.3.3...v1.3.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-28 11:52:58 +01:00
Mara Kiefer
12fd91ca4f Use eslint probe, not validate in VS Code settings
- Parsing error as see in issue https://github.tools.sap/cap/issues/issues/13123
- Related to [VS Code ESLint settings options](https://github.com/microsoft/vscode-eslint/blob/main/README.md#settings-options)
- Should use `eslint.probe` instead of `eslint.validate`

eslint.probe - an array for language identifiers for which the ESLint extension should be activated and should try to validate the file. If validation fails for probed languages the extension says silent. Defaults to ["javascript", "javascriptreact", "typescript", "typescriptreact", "html", "vue", "markdown"].

eslint.validate - an array of language identifiers specifying the files for which validation is to be enforced. This is an old legacy setting and should in normal cases not be necessary anymore. Defaults to ["javascript", "javascriptreact"].
2023-02-28 11:49:01 +01:00
Daniel
535981dc7e Fixing cds lint issues 2023-02-22 13:39:05 +01:00
Daniel
d15d0535d9 Updated package-lock.json -> fixed vulnerability 2023-02-17 17:39:23 +01:00
dependabot[bot]
430d3a46c4 Bump axios from 1.3.1 to 1.3.2
Bumps [axios](https://github.com/axios/axios) from 1.3.1 to 1.3.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.3.1...v1.3.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-06 17:55:15 +01:00
dependabot[bot]
308e6b932a Bump http-cache-semantics from 4.1.0 to 4.1.1
Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/kornelski/http-cache-semantics/releases)
- [Commits](https://github.com/kornelski/http-cache-semantics/commits)

---
updated-dependencies:
- dependency-name: http-cache-semantics
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-02 13:38:42 +01:00
dependabot[bot]
703d45fab0 Bump axios from 1.3.0 to 1.3.1
Bumps [axios](https://github.com/axios/axios) from 1.3.0 to 1.3.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.3.0...v1.3.1)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-02 13:29:01 +01:00
dependabot[bot]
63c21c5a96 Bump axios from 1.2.6 to 1.3.0
Bumps [axios](https://github.com/axios/axios) from 1.2.6 to 1.3.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.2.6...v1.3.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-01 13:22:51 +01:00
dependabot[bot]
e0c6b16b15 Bump axios from 1.2.4 to 1.2.6
Bumps [axios](https://github.com/axios/axios) from 1.2.4 to 1.2.6.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.2.4...v1.2.6)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-30 17:16:47 +01:00
dependabot[bot]
0771fc06e6 Bump @sap/cds from 6.4.0 to 6.5.0
Bumps [@sap/cds](https://cap.cloud.sap/) from 6.4.0 to 6.5.0.

---
updated-dependencies:
- dependency-name: "@sap/cds"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-30 17:14:23 +01:00
dependabot[bot]
dc90cad8f4 Bump axios from 1.2.3 to 1.2.4
Bumps [axios](https://github.com/axios/axios) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.2.3...v1.2.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-25 13:34:30 +01:00
Christian Georgi
f731a95bd1 Fix indentation 2023-01-18 14:57:15 +01:00
dependabot[bot]
2cd092be10 Bump axios from 1.2.2 to 1.2.3
Bumps [axios](https://github.com/axios/axios) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/1.2.2...v1.2.3)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-18 13:19:55 +01:00
Daniel Hutzel
a1c2f32408 Cleanup (#440)
* Cleanup

* minor cleanups
2023-01-13 09:08:20 +01:00
dependabot[bot]
8a6a42f109 Bump axios from 1.2.1 to 1.2.2
Bumps [axios](https://github.com/axios/axios) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.2.1...1.2.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-09 11:11:29 +01:00
20 changed files with 1238 additions and 2658 deletions

View File

@@ -1,29 +1,31 @@
{
"extends": [
"eslint:recommended",
"plugin:@sap/cds/recommended"
],
"env": {
"browser": true,
"es2022": true,
"node": true,
"jest": true,
"mocha": true
},
"globals": {
"SELECT": true,
"INSERT": true,
"UPSERT": true,
"UPDATE": true,
"DELETE": true,
"CREATE": true,
"DROP": true,
"cds": true
},
"rules": {
"no-console": "off",
"require-atomic-updates": "off",
"extends": [
"plugin:@sap/cds/recommended",
"eslint:recommended"
],
"env": {
"browser": true,
"es2022": true,
"node": true,
"jest": true,
"mocha": true
},
"globals": {
"SELECT": true,
"INSERT": true,
"UPSERT": true,
"UPDATE": true,
"DELETE": true,
"CREATE": true,
"DROP": true,
"CDL": true,
"CQL": true,
"cds": true
},
"rules": {
"no-console": "off",
"require-atomic-updates": "off",
"require-await":"warn",
"no-unused-vars": ["warn", { "argsIgnorePattern": "_" }]
}
}
}

View File

@@ -1 +0,0 @@
*.tgz

View File

@@ -1,81 +0,0 @@
const { exec } = require ('child_process')
const isWin = process.platform === 'win32'
const express = require ('express')
const fs = require ('fs')
const app = express()
const { PORT=4444 } = process.env
const [,,port=PORT,scope='@capire'] = process.argv
const cwd = __dirname
// clean up on start (exit handler might not complete on Windows)
exec(isWin ? 'del *.tgz' : 'rm *.tgz', {cwd})
app.use('/-/:tarball', (req,res,next) => {
console.debug ('GET', req.params)
try {
const { tarball } = req.params
const pkgFull = tarball.substring(0, tarball.lastIndexOf('-'))
const [, pkg ] = /^\w+-(.+)/.exec(pkgFull)
fs.lstat(tarball,(err => {
if (err) console.debug (`npm pack ../${pkg}`)
if (err) exec(`npm pack ../${pkg}`,{cwd},next)
else next()
}))
} catch (e) {
console.error(e)
res.sendStatus(500)
}
})
app.use('/-', express.static(__dirname))
app.get('/*', (req,res)=>{
const urlRegex = /^\/(@[\w-]+)\/(.+)/
const url = decodeURIComponent(req.url)
console.debug ('GET',url)
try {
if (!urlRegex.test(url)) return res.sendStatus(404)
const [, scpe, pkg ] = urlRegex.exec(url)
const package = require (`${scpe}/${pkg}/package.json`)
const tarball = `${scpe.slice(1)}-${pkg}-${package.version}.tgz`
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md
res.json({
"name": package.name,
"dist-tags": {
"latest": package.version
},
"versions": {
[package.version]: {
"name": package.name,
"version": package.version,
"dist": {
"tarball": `${server.url}/-/${tarball}`
},
}
},
})
} catch (e) {
if (e.code === 'MODULE_NOT_FOUND') return res.sendStatus(404)
console.error(e); throw e
}
})
const server = app.listen(port, ()=>{
const url = server.url = `http://localhost:${server.address().port}`
console.log (`npm set ${scope}:registry=${url}`)
exec(`npm set ${scope}:registry=${url}`)
console.log (`${scope} registry listening on ${url}`)
})
const _exit = ()=>{
server.close()
exec(`npm conf rm "${scope}:registry"`, ()=> { process.exit() })
}
process.on ('SIGTERM',_exit)
process.on ('SIGHUP',_exit)
process.on ('SIGINT',_exit)
process.on ('SIGUSR2',_exit)

20
.vscode/launch.json vendored
View File

@@ -13,7 +13,7 @@
"<node_internals>/**",
"**/node_modules/**",
"**/cds/lib/lazy.js",
"**/cds/lib/req/cls.js",
"**/cds/lib/req/cds-context.js",
"**/odata-v4/okra/**"
]
},
@@ -26,10 +26,24 @@
"<node_internals>/**",
"**/node_modules/**",
"**/cds/lib/lazy.js",
"**/cds/lib/req/cls.js",
"**/cds/lib/req/cds-context.js",
"**/odata-v4/okra/**"
]
}
},
{
"name": "Debug Mocha Tests",
"type": "node",
"request": "attach",
"port": 9229,
"continueOnAttach": true,
"skipFiles": [
"<node_internals>/**",
"**/node_modules/**",
"**/cds/lib/lazy.js",
"**/cds/lib/req/cds-context.js",
"**/odata-v4/okra/**",
]
},
],
"inputs": [
{

View File

@@ -10,12 +10,13 @@
"<node_internals>/**",
"**/node_modules/**",
"**/cds/lib/lazy.js",
"**/cds/lib/req/cls.js",
"**/cds/lib/req/cds-context.js",
"**/odata-v4/okra/**"
]
},
"mochaExplorer.debuggerConfig": "Debug Mocha Tests",
"mochaExplorer.parallel": true,
"eslint.validate": [
"eslint.probe": [
"cds",
"csn",
"csv",

View File

@@ -4,21 +4,21 @@
* currencies, if not obtained through @capire/common.
*/
module.exports = async (db)=>{
module.exports = async (tx)=>{
const has_common = db.model.definitions['sap.common.Currencies'].elements.numcode
const has_common = tx.model.definitions['sap.common.Currencies']?.elements.numcode
if (has_common) return
const already_filled = await db.exists('sap.common.Currencies',{code:'EUR'})
const already_filled = await tx.exists('sap.common.Currencies',{code:'EUR'})
if (already_filled) return
await INSERT.into ('sap.common.Currencies') .columns (
'code','symbol','name'
await tx.run (INSERT.into ('sap.common.Currencies') .columns (
[ 'code', 'symbol', 'name' ]
) .rows (
[ 'EUR','€','Euro' ],
[ 'USD','$','US Dollar' ],
[ 'GBP','£','British Pound' ],
[ 'ILS','₪','Shekel' ],
[ 'JPY','¥','Yen' ],
)
[ 'EUR', '€', 'Euro' ],
[ 'USD', '$', 'US Dollar' ],
[ 'GBP', '£', 'British Pound' ],
[ 'ILS', '₪', 'Shekel' ],
[ 'JPY', '¥', 'Yen' ],
))
}

View File

@@ -1,5 +1,15 @@
using CatalogService from '@capire/bookstore';
using from '@sap/cds-pdf-export';
annotate CatalogService with @(
Capabilities: { SupportedFormats : [ 'application/pdf' ] },
PDF.Features: {
DocumentDescriptionReference : '/-pdf/',
DocumentDescriptionCollection : 'createDocumentDescription'
}
);
////////////////////////////////////////////////////////////////////////////
//
// Books Object Page

View File

@@ -43,6 +43,16 @@
"[production]": {
"model": "db/hana"
}
},
"pdf": {
"kind": "btp-adobe-forms",
"vcap": {
"label": "adsrestapi"
},
"[pdfme]": {
"kind": "export-pdf",
"impl": "./pdfme.js"
}
}
},
"hana": {

38
fiori/pdfme.js Normal file
View File

@@ -0,0 +1,38 @@
const { generate, BLANK_PDF } = require("@pdfme/generator");
/**
* Generate PDF with @pdfme/generator library
*/
module.exports = async (data, headers) => {
let inputs = data
let x = 0, y = 0;
const width = 30;
const height = 5;
const tableSchema = {}
for (const entry of headers) {
x += width;
tableSchema[entry.Name] = {
type: 'text',
position: { x, y: 10 },
width,
height
}
}
for (const row of data) {
for (const [key, value] of Object.entries(row)) {
if (typeof value !== 'string') row[key] = ''+value // stringify
}
}
const template = {
basePdf: BLANK_PDF,
schemas: [tableSchema]
};
const pdf = await generate({ template, inputs });
return pdf;
};

View File

@@ -1,8 +1,8 @@
const cds = require("@sap/cds")
// install OData v2 adapter
const cds = require("@sap/cds")
const proxy = require('@sap/cds-odata-v2-adapter-proxy')
const proxyOpts = global.it ? { target:'auto' } : {} // for tests, set 'auto' to detect port dynamically
cds.on('bootstrap', app => app.use(proxy(proxyOpts)))
const opts = global.it ? { target:'auto' } : {} // for tests, set 'auto' to detect port dynamically
cds.on('bootstrap', app => app.use(proxy(opts))) // install proxy
cds.log('cov2ap','silent') // suppress anoying log outpout, e.g. for `npm run mocha -- --reporter nyan`
module.exports = require('@capire/bookstore/server.js')

3456
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -20,6 +20,7 @@
"./reviews"
],
"devDependencies": {
"@sap/eslint-plugin-cds": "^2.6.1",
"axios": "^1",
"chai": "^4.3.4",
"chai-as-promised": "^7.1.1",
@@ -29,13 +30,12 @@
},
"scripts": {
"cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules",
"registry": "node .registry/server.js",
"bookshop": "cds watch bookshop",
"fiori": "cds watch fiori",
"hello": "cds watch hello",
"media": "cds watch media",
"mocha": "npx mocha || echo",
"jest": "npx jest",
"mocha": "CDS_TEST_SILENT=y npx mocha",
"jest": "npx jest --silent",
"start": "cds watch fiori",
"test": "npm run jest -- --silent",
"test:hello": "cd hello && npm test"
@@ -48,7 +48,8 @@
},
"mocha": {
"recursive": true,
"parallel": true
"parallel": true,
"timeout": 6666
},
"license": "SAP SAMPLE CODE LICENSE",
"private": true

View File

@@ -1,7 +1,7 @@
# Overview of Samples
The following list gives an overview of the samples provided in subdirectories.
Each sub directory essentially is an individual npm package arranged in an [all-in-one monorepo](all-in-one-monorepo) umbrella setup.
Each sub directory essentially is an individual npm package arranged in an [all-in-one monorepo](#all-in-one-monorepo) umbrella setup.
## [@capire/hello-world](hello)

View File

@@ -3,8 +3,9 @@ const cds = require('@sap/cds/lib')
describe('cap/samples - Custom Handlers', () => {
const { GET, POST, expect } = cds.test(__dirname+'/../bookshop')
if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch
else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases
beforeAll(()=>{
cds.User.default = cds.User.Privileged // hard core monkey patch
})
it('should reject out-of-stock orders', async () => {
await POST `/browse/submitOrder ${{ book: 201, quantity: 5 }}`

View File

@@ -1,10 +1,12 @@
const cds = require('@sap/cds/lib')
describe('cap/samples - Fiori APIs - v2', () => {
describe('cap/samples - Fiori APIs - v2', function() {
const { GET, expect, axios } = cds.test ('@capire/fiori', '--with-mocks')
axios.defaults.auth = { username: 'alice', password: 'admin' }
// if (this.timeout) this.timeout(1e6)
it('serves $metadata documents in v2', async () => {
const { headers, data } = await GET `/v2/browse/$metadata`
expect(headers).to.contain({

View File

@@ -16,21 +16,21 @@ describe('cap/samples - Hierarchical Data', ()=>{
before ('bootstrap sqlite in-memory db...', async()=>{
await cds.deploy (model) .to ('sqlite::memory:')
expect (cds.db) .to.exist
expect (cds.db.model) .to.exist
expect (cds.db.model) .to.exist
})
it ('supports deeply nested inserts', ()=> INSERT.into (Cats,
{ ID:100, name:'Some Cats...', children:[
{ ID:101, name:'Cat', children:[
{ ID:102, name:'Kitty', children:[
{ ID:103, name:'Kitty Cat', children:[
{ ID:104, name:'Aristocat' } ]},
{ ID:105, name:'Kitty Bat' } ]},
{ ID:106, name:'Catwoman', children:[
{ ID:107, name:'Catalina' } ]} ]},
{ ID:108, name:'Catweazle' }
]}
))
{ ID:100, name:'Some Cats...', children:[
{ ID:101, name:'Cat', children:[
{ ID:102, name:'Kitty', children:[
{ ID:103, name:'Kitty Cat', children:[
{ ID:104, name:'Aristocat' } ]},
{ ID:105, name:'Kitty Bat' } ]},
{ ID:106, name:'Catwoman', children:[
{ ID:107, name:'Catalina' } ]} ]},
{ ID:108, name:'Catweazle' }
]}
))
it ('supports nested reads', async()=>{
if (require('semver').gte(cds.version, '5.9.0')) {
@@ -101,12 +101,12 @@ describe('cap/samples - Hierarchical Data', ()=>{
})
it ('supports cascaded deletes', async()=>{
const affectedRows = await DELETE.from (Cats) .where ({ID:[102,106]})
expect (affectedRows) .to.be.greaterThan (0)
const affectedRows = await DELETE.from (Cats) .where ({ID:[102,106]})
expect (affectedRows) .to.be.greaterThan (0)
const expected = [
{ ID:100, name:'Some Cats...' },
{ ID:101, name:'Cat' },
{ ID:108, name:'Catweazle' }
{ ID:100, name:'Some Cats...' },
{ ID:101, name:'Cat' },
{ ID:108, name:'Catweazle' }
]
expect ( await SELECT`ID,name`.from(Cats) ).to.eql (expected)
})

View File

@@ -1,8 +1,12 @@
const cds = require('@sap/cds/lib')
describe('cap/samples - Localized Data', () => {
const { GET, expect, cds } = require('@sap/cds/lib').test (__dirname)
if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch
else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases
const { GET, expect } = cds.test (__dirname)
beforeAll(()=>{
cds.User.default = cds.User.Privileged // hard core monkey patch
})
it('serves localized $metadata documents', async () => {
const { data } = await GET(`/browse/$metadata?sap-language=de`, { headers: { 'accept-language': 'de' }})

View File

@@ -1,16 +1,13 @@
const cds = require('@sap/cds/lib')
const {resolve} = require('path')
describe('cap/samples - Messaging', ()=>{
const { expect } = cds.test
const { expect } = cds.test.in(__dirname,'..')
const _model = '@capire/reviews'
const Reviews = 'sap.capire.reviews.Reviews'
if (cds.User.default) cds.User.default = cds.User.Privileged // hard core monkey patch
else cds.User = cds.User.Privileged // hard core monkey patch for older cds releases
beforeAll(() => { cds.root = resolve(__dirname, '..') })
afterAll(() => { cds.root = process.cwd() })
beforeAll(()=>{
cds.User.default = cds.User.Privileged // hard core monkey patch
})
it ('should bootstrap sqlite in-memory db', async()=>{
const db = await cds.deploy (_model) .to ('sqlite::memory:')
@@ -35,6 +32,7 @@ describe('cap/samples - Messaging', ()=>{
it ('should add review', async ()=>{
const review = { subject: "201", title: "Captivating", rating: ++N }
cds._debug = 1
const response = await srv.create ('Reviews') .entries (review)
expect (response) .to.containSubset (review)
})

View File

@@ -4,47 +4,6 @@ describe('cap/samples - Bookshop APIs', () => {
const { GET, expect, axios } = cds.test ('@capire/bookshop')
axios.defaults.auth = { username: 'alice', password: 'admin' }
// Genres
const Drama = {
"name": "Drama",
"descr": null,
"ID": 11,
"parent_ID": 10
}
const Mystery = {
"name": "Mystery",
"descr": null,
"ID": 16,
"parent_ID": 10
}
const Romance = {
"name": "Romance",
"descr": null,
"ID": 15,
"parent_ID": 10
}
// Currencies
const GBP = {
"name": "British Pound",
"descr": null,
"code": "GBP",
"symbol": "£"
}
const USD = {
"name": "US Dollar",
"descr": null,
"code": "USD",
"symbol": "$"
}
const JPY = {
"name": "Yen",
"descr": null,
"code": "JPY",
"symbol": "¥"
}
it('serves $metadata documents in v4', async () => {
const { headers, status, data } = await GET `/browse/$metadata`
expect(status).to.equal(200)
@@ -57,6 +16,9 @@ describe('cap/samples - Bookshop APIs', () => {
})
it('serves ListOfBooks?$expand=genre,currency', async () => {
const Mystery = { ID: 16, name: 'Mystery', descr: null, parent_ID: 10 }
const Romance = { ID: 15, name: 'Romance', descr: null, parent_ID: 10 }
const USD = { code: 'USD', name: 'US Dollar', descr: null, symbol: '$' }
const { data } = await GET `/browse/ListOfBooks ${{
params: { $search: 'Po', $select: `title,author`, $expand:`genre,currency` },
}}`
@@ -126,14 +88,10 @@ describe('cap/samples - Bookshop APIs', () => {
})
it('serves user info', async () => {
{
const { data } = await GET (`/user/me`)
expect(data).to.containSubset({ id: 'alice', locale:'en' })
}
{
const { data } = await GET (`/user/me`, {auth: { username: 'joe' }})
expect(data).to.containSubset({ id: 'joe', locale:'en' })
}
const { data: alice } = await GET `/user/me`
expect(alice).to.containSubset({ id: 'alice', locale:'en' })
const { data: joe } = await GET (`/user/me`, {auth: { username: 'joe' }})
expect(joe).to.containSubset({ id: 'joe', locale:'en' })
})
})

View File

@@ -1,57 +0,0 @@
const cds = require('@sap/cds/lib')
const { fork } = require('child_process')
const { resolve } = require('path')
const verbose = process.env.CDS_TEST_VERBOSE
describe('cap/samples - Local NPM registry', () => {
const { expect } = cds.test
// ||true
let registry
let axios
const cwd = resolve(__dirname, '..')
before(async ()=> {
const env = Object.assign(process.env, {PORT:'0'})
const res = await exec (resolve(cwd, '.registry/server.js'), {cwd, stdio: 'pipe', env})
registry = res.cp
axios = require('axios').create ({ baseURL: res.url, validateStatus: (status)=>status<500 })
})
after(done => { registry.once('exit',done); registry.kill() })
for (const mod of ['bookshop', 'data-viewer', 'fiori','orders','reviews']) {
it(`should serve ${mod}`, async () => {
const resp = await axios.get(`/@capire/${mod}`)
expect(resp.data).to.containSubset({name: `@capire/${mod}`, versions:{}})
const versions = Object.values(resp.data.versions)
await axios.get(versions[0].dist.tarball)
})
}
it(`should return 404 for unknown packages`, async () => {
let resp = await axios.get(`/@capire/foo`)
expect(resp.status).to.equal(404)
resp = await axios.get(`/foo`)
expect(resp.status).to.equal(404)
})
})
function exec (script, opts) {
return new Promise((resolve, reject)=> {
const cp = fork (script, [], opts)
.on('error', err => reject(new Error(err)))
cp.stdout.on('data', chunk => {
if (verbose) console.log(chunk.toString())
if (chunk.toString().match(/listening.*(http:.*:\d+)/i)) {
resolve({cp, url:RegExp.$1})
}
})
cp.stderr.on('data', chunk => {
if (verbose) console.error(chunk.toString())
})
})
}