@typetron/framework 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc-old.js +208 -0
- package/Cache/Cache.ts +13 -0
- package/Cache/Stores/DatabaseStore.ts +120 -0
- package/Cache/Stores/FileStore.ts +69 -0
- package/Cache/Stores/MemoryStore.ts +71 -0
- package/Cache/index.ts +5 -0
- package/Cache/types.ts +4 -0
- package/Container/ClassResolver.ts +106 -0
- package/Container/Container.ts +144 -0
- package/Container/Contracts.ts +3 -0
- package/Container/Decorators.ts +20 -0
- package/Container/Metadata.ts +16 -0
- package/Container/Resolver.ts +27 -0
- package/Container/index.ts +5 -0
- package/Database/Clauses/Where.ts +0 -0
- package/Database/Connection.ts +52 -0
- package/Database/Decorators.ts +142 -0
- package/Database/Drivers/DatabaseDriver.ts +37 -0
- package/Database/Drivers/MySQL/Alter/index.ts +55 -0
- package/Database/Drivers/MySQL/ColumnDefinition.ts +16 -0
- package/Database/Drivers/MySQL/Create.ts +47 -0
- package/Database/Drivers/MySQL/MysqlDriver.ts +123 -0
- package/Database/Drivers/MySQL/Schema.ts +82 -0
- package/Database/Drivers/MySQL/index.ts +13 -0
- package/Database/Drivers/SQL/Schema.ts +73 -0
- package/Database/Drivers/SQL/Statements/Alter.ts +22 -0
- package/Database/Drivers/SQL/Statements/BaseStatement.ts +55 -0
- package/Database/Drivers/SQL/Statements/Delete.ts +20 -0
- package/Database/Drivers/SQL/Statements/Insert.ts +24 -0
- package/Database/Drivers/SQL/Statements/Select.ts +55 -0
- package/Database/Drivers/SQL/Statements/Update.ts +33 -0
- package/Database/Drivers/SQL/index.ts +8 -0
- package/Database/Drivers/SQLite/Create.ts +45 -0
- package/Database/Drivers/SQLite/Schema.ts +54 -0
- package/Database/Drivers/SQLite/SqliteDriver.ts +144 -0
- package/Database/Drivers/SQLite/index.ts +15 -0
- package/Database/Drivers/SchemaContract.ts +11 -0
- package/Database/Drivers/Statement.ts +16 -0
- package/Database/Drivers/index.ts +4 -0
- package/Database/Entity.ts +377 -0
- package/Database/EntityNotFoundError.ts +5 -0
- package/Database/EntityProxyHandler.ts +43 -0
- package/Database/EntityQuery.ts +197 -0
- package/Database/Expression.ts +3 -0
- package/Database/Fields.ts +816 -0
- package/Database/Helpers.ts +12 -0
- package/Database/List.ts +71 -0
- package/Database/Migrations/Migration.ts +10 -0
- package/Database/Migrations/MigrationHistory.ts +20 -0
- package/Database/Migrations/Migrator.ts +122 -0
- package/Database/Migrations/index.ts +3 -0
- package/Database/ORM/BaseRelationship.ts +10 -0
- package/Database/Query.ts +374 -0
- package/Database/Seeders/Seeder.ts +3 -0
- package/Database/Seeders/SeederManager.ts +27 -0
- package/Database/Seeders/index.ts +2 -0
- package/Database/StringExpression.ts +9 -0
- package/Database/Types.ts +165 -0
- package/Database/index.ts +23 -0
- package/Encryption/index.ts +51 -0
- package/Forms/Decorators.ts +29 -0
- package/Forms/Form.ts +70 -0
- package/Forms/FormFields.ts +36 -0
- package/Forms/index.ts +3 -0
- package/Framework/App.ts +10 -0
- package/Framework/Application.ts +118 -0
- package/Framework/Auth/Auth.ts +122 -0
- package/Framework/Auth/Authenticatable.ts +9 -0
- package/Framework/Auth/User.ts +27 -0
- package/Framework/Auth/index.ts +29 -0
- package/Framework/Config/AppConfig.ts +25 -0
- package/Framework/Config/AuthConfig.ts +9 -0
- package/Framework/Config/BaseConfig.ts +9 -0
- package/Framework/Config/CacheConfig.ts +38 -0
- package/Framework/Config/DatabaseConfig.ts +21 -0
- package/Framework/Config/MailConfig.ts +30 -0
- package/Framework/Config/index.ts +6 -0
- package/Framework/Middleware/AuthMiddleware.ts +31 -0
- package/Framework/Middleware/CorsMiddleware.ts +32 -0
- package/Framework/Middleware/StaticAssetsMiddleware.ts +76 -0
- package/Framework/Middleware/index.ts +2 -0
- package/Framework/Provider.ts +9 -0
- package/Framework/Providers/CacheProvider.ts +28 -0
- package/Framework/Providers/DatabaseProvider.ts +36 -0
- package/Framework/Providers/MailProvider.ts +31 -0
- package/Framework/Providers/WebsocketsProvider.ts +120 -0
- package/Framework/Resolvers/AuthResolver.ts +23 -0
- package/Framework/Resolvers/EntityResolver.ts +41 -0
- package/Framework/Resolvers/FormResolver.ts +37 -0
- package/Framework/RootDir.ts +1 -0
- package/Framework/index.ts +8 -0
- package/Frontend/Angular/index.ts +24 -0
- package/Frontend/Websockets/index.ts +86 -0
- package/Mail/MailAddress.ts +4 -0
- package/Mail/MailTransport.ts +6 -0
- package/Mail/Mailable.ts +16 -0
- package/Mail/Mailer.ts +27 -0
- package/Mail/PendingMail.ts +68 -0
- package/Mail/SentMessage.ts +20 -0
- package/Mail/Transports/MemoryTransport.ts +13 -0
- package/Mail/Transports/SendGridTransport.ts +95 -0
- package/Mail/index.ts +3 -0
- package/Models/Model.ts +41 -0
- package/Models/index.ts +54 -0
- package/Router/BaseController.ts +7 -0
- package/Router/Decorators.ts +224 -0
- package/Router/Guard.ts +10 -0
- package/Router/Http/Contracts.ts +4 -0
- package/Router/Http/ErrorHandler.ts +45 -0
- package/Router/Http/ErrorHandlerInterface.ts +6 -0
- package/Router/Http/Errors/HttpError.ts +15 -0
- package/Router/Http/Handler.ts +183 -0
- package/Router/Http/HttpRoute.ts +110 -0
- package/Router/Http/Middleware.ts +7 -0
- package/Router/Http/Request.ts +225 -0
- package/Router/Http/Response.ts +35 -0
- package/Router/Http/index.ts +85 -0
- package/Router/Metadata.ts +34 -0
- package/Router/Middleware.ts +16 -0
- package/Router/Request.ts +65 -0
- package/Router/Route.ts +16 -0
- package/Router/RouteNotFoundError.ts +5 -0
- package/Router/Router.ts +35 -0
- package/Router/Servers/index.ts +6 -0
- package/Router/Servers/node.ts +49 -0
- package/Router/Servers/uNetworking.ts +151 -0
- package/Router/Websockets/Handler.ts +82 -0
- package/Router/Websockets/Middleware.ts +7 -0
- package/Router/Websockets/Request.ts +3 -0
- package/Router/Websockets/WebsocketRoute.ts +61 -0
- package/Router/Websockets/index.ts +57 -0
- package/Router/Websockets/types.ts +23 -0
- package/Router/index.ts +6 -0
- package/Storage/File.ts +30 -0
- package/Storage/Image.ts +19 -0
- package/Storage/InvalidImage.ts +3 -0
- package/Storage/Storage.ts +98 -0
- package/Storage/index.ts +4 -0
- package/Storage/utils.ts +18 -0
- package/Support/Array.ts +184 -0
- package/Support/Math.ts +12 -0
- package/Support/Metadata.ts +31 -0
- package/Support/String.ts +38 -0
- package/Support/index.ts +19 -0
- package/Support/utils.ts +7 -0
- package/Testing/TestCase.ts +193 -0
- package/Validation/Rule.ts +9 -0
- package/Validation/RuleInterface.ts +10 -0
- package/Validation/Rules/Email.ts +20 -0
- package/Validation/Rules/FileExtension.ts +21 -0
- package/Validation/Rules/MaxLength.ts +17 -0
- package/Validation/Rules/MinLength.ts +18 -0
- package/Validation/Rules/Optional.ts +18 -0
- package/Validation/Rules/Required.ts +29 -0
- package/Validation/Validator.ts +7 -0
- package/Validation/index.ts +12 -0
- package/benchmark-index.js +20 -0
- package/benchmark.ts +47 -0
- package/package.json +7 -3
- package/tests/Cache/DatabaseStoreTest.ts +110 -0
- package/tests/Cache/FileStoreTest.ts +93 -0
- package/tests/Cache/MemoryStoreTest.ts +92 -0
- package/tests/Container/ContainerTest.ts +336 -0
- package/tests/Database/Drivers/MySQL/AlterTest.ts +100 -0
- package/tests/Database/Drivers/MySQL/CreateTest.ts +39 -0
- package/tests/Database/Drivers/MysqlDriverTest.ts +140 -0
- package/tests/Database/Drivers/SqliteDriverTest.ts +126 -0
- package/tests/Database/Entities/Article.ts +21 -0
- package/tests/Database/Entities/Profile.ts +21 -0
- package/tests/Database/Entities/Role.ts +15 -0
- package/tests/Database/Entities/User.ts +35 -0
- package/tests/Database/EntityRelationshipsTest.ts +475 -0
- package/tests/Database/EntityTest.ts +202 -0
- package/tests/Database/Migrations/RunnerTest.ts +96 -0
- package/tests/Database/Migrations/migrations/1.createUserTable.ts +12 -0
- package/tests/Database/Migrations/migrations/2.createArticlesTable.ts +12 -0
- package/tests/Database/QueryTest.ts +573 -0
- package/tests/Database/SchemaTest.ts +32 -0
- package/tests/Database/Seeders/RunnerTest.ts +30 -0
- package/tests/Database/Seeders/seeders/RandomSeeder.ts +10 -0
- package/tests/Database/utils.ts +16 -0
- package/tests/Forms/FormsTest.ts +59 -0
- package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.ts +129 -0
- package/tests/Framework/Resolvers/EntityResolverTest.ts +48 -0
- package/tests/Framework/Router/RouterTest.ts +33 -0
- package/tests/Mail/MailerTest.ts +76 -0
- package/tests/Model/ModelTest.ts +183 -0
- package/tests/Router/HttpHandlerTest.ts +72 -0
- package/tests/Router/RequestTest.ts +77 -0
- package/tests/Router/WebSocketsHandlerTest.ts +51 -0
- package/tests/Storage/StorageTest.ts +97 -0
- package/tests/Support/ArrayTest.ts +167 -0
- package/tests/Support/StringTest.ts +18 -0
- package/tests/Validation/RulesTest.ts +54 -0
- package/types.d.ts +8 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const path = require('path')
|
|
2
|
+
const fs = require('fs')
|
|
3
|
+
|
|
4
|
+
const tsConfigPaths = require('tsconfig-paths')
|
|
5
|
+
const appTsConfigPath = path.join(process.cwd(), 'tsconfig.json')
|
|
6
|
+
const tsConfig = require(path.join(__dirname, 'tsconfig.json'))
|
|
7
|
+
|
|
8
|
+
require('ts-node').register({
|
|
9
|
+
project : fs.existsSync(appTsConfigPath) ? appTsConfigPath : path.join(__dirname, 'tsconfig.json'),
|
|
10
|
+
transpileOnly : true,
|
|
11
|
+
skipIgnore : true,
|
|
12
|
+
preferTsExts : true,
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
tsConfigPaths.register({
|
|
16
|
+
baseUrl : __dirname,
|
|
17
|
+
paths : tsConfig.compilerOptions.paths
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
require('./benchmark')
|
package/benchmark.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// clinic flame -- node -r ts-node/register -r tsconfig-paths/register benchmark.js
|
|
2
|
+
|
|
3
|
+
import 'reflect-metadata'
|
|
4
|
+
import '@Typetron/Support'
|
|
5
|
+
import { Handler, Http, Request } from './Router/Http'
|
|
6
|
+
import { Container } from './Container'
|
|
7
|
+
import { Get } from './Router'
|
|
8
|
+
import Method = Http.Method
|
|
9
|
+
|
|
10
|
+
class Controller {
|
|
11
|
+
@Get()
|
|
12
|
+
read() {
|
|
13
|
+
return 'Hello world!!!'
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function main() {
|
|
18
|
+
|
|
19
|
+
const app = new Container()
|
|
20
|
+
const handler = app.get(Handler)
|
|
21
|
+
|
|
22
|
+
handler.addRoute('', Method.GET, Controller, 'read', 'read')
|
|
23
|
+
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
// const request = await Request.capture({
|
|
27
|
+
// url: 'http://localhost:3000',
|
|
28
|
+
// method: 'GET',
|
|
29
|
+
// headers: {}
|
|
30
|
+
// })
|
|
31
|
+
// await handler.handle(app, request)
|
|
32
|
+
|
|
33
|
+
console.time('test')
|
|
34
|
+
for (let i = 0; i < 1_000_000_0; i++) {
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
const request = await Request.capture({
|
|
38
|
+
url: 'http://localhost:3000',
|
|
39
|
+
method: 'GET',
|
|
40
|
+
headers: {}
|
|
41
|
+
})
|
|
42
|
+
await handler.handle(app, request)
|
|
43
|
+
}
|
|
44
|
+
console.timeEnd('test')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
main()
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@typetron/framework",
|
|
3
3
|
"description": "Modern Node.js framework for modern apps written in Typescript",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "0.5.
|
|
5
|
+
"version": "0.5.4",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"typetron",
|
|
8
8
|
"framework",
|
|
@@ -15,11 +15,12 @@
|
|
|
15
15
|
"name": "Ionel Lupu"
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
-
"build": "tsc",
|
|
18
|
+
"build": "tsc && cp package.json build/",
|
|
19
19
|
"dev": "tsc --watch",
|
|
20
20
|
"test": "mocha",
|
|
21
21
|
"test:watch": "mocha --watch",
|
|
22
22
|
"preversion": "npm test",
|
|
23
|
+
"publish": "npm publish ./build",
|
|
23
24
|
"lint": "eslint ."
|
|
24
25
|
},
|
|
25
26
|
"engines": {
|
|
@@ -63,6 +64,9 @@
|
|
|
63
64
|
"url": "https://github.com/typetron/framework.git"
|
|
64
65
|
},
|
|
65
66
|
"files": [
|
|
66
|
-
"
|
|
67
|
+
"**/*.ts",
|
|
68
|
+
"**/*.js",
|
|
69
|
+
"**/*.ts.map",
|
|
70
|
+
"**/*.js.map"
|
|
67
71
|
]
|
|
68
72
|
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { suite, test } from '@testdeck/mocha'
|
|
2
|
+
import { CacheItem, DatabaseStore } from '@Typetron/Cache'
|
|
3
|
+
import { expect } from 'chai'
|
|
4
|
+
import { createHash } from 'crypto'
|
|
5
|
+
import { Connection, Query, SqliteDriver } from '@Typetron/Database'
|
|
6
|
+
import { Storage } from '@Typetron/Storage'
|
|
7
|
+
|
|
8
|
+
const tableName = 'cache'
|
|
9
|
+
const databaseFilePath = './tests/Cache/database.sqlite'
|
|
10
|
+
|
|
11
|
+
@suite
|
|
12
|
+
class DatabaseStoreTest {
|
|
13
|
+
|
|
14
|
+
databaseStore = new DatabaseStore(tableName)
|
|
15
|
+
|
|
16
|
+
static async before() {
|
|
17
|
+
Query.connection = new Connection(new SqliteDriver(databaseFilePath))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static async after() {
|
|
21
|
+
await new Storage().deleteDirectory(databaseFilePath)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private getCacheRecord(name: string) {
|
|
25
|
+
const cacheKeyHash = createHash('sha1').update(name).digest('hex')
|
|
26
|
+
return Query.table<CacheItem<unknown>>(tableName).where('name', cacheKeyHash).first()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@test
|
|
30
|
+
async returnsUndefinedIfRecordDoesntExist() {
|
|
31
|
+
const value = await this.databaseStore.get('tests')
|
|
32
|
+
expect(value).to.be.undefined
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@test
|
|
36
|
+
async testPutCreatesRecord() {
|
|
37
|
+
const contents = 'test'
|
|
38
|
+
|
|
39
|
+
await this.databaseStore.set('foo', contents)
|
|
40
|
+
|
|
41
|
+
const cacheRecord = await this.getCacheRecord('foo')
|
|
42
|
+
expect(cacheRecord).to.exist
|
|
43
|
+
expect((cacheRecord as CacheItem<any>).value).to.be.equal(JSON.stringify(contents))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@test
|
|
47
|
+
async testExpirationValueIsWrittenInCacheRecord() {
|
|
48
|
+
const durationInSeconds = 60
|
|
49
|
+
const expirationTime = Date.now() + durationInSeconds * 1000
|
|
50
|
+
|
|
51
|
+
await this.databaseStore.set('expireTest', 'value', durationInSeconds)
|
|
52
|
+
const cacheRecord = await this.getCacheRecord('expireTest')
|
|
53
|
+
|
|
54
|
+
expect(cacheRecord).to.exist
|
|
55
|
+
expect(new Date((cacheRecord as CacheItem<unknown>).date ?? Infinity).getTime()).to.be.closeTo(expirationTime, 1000) // Allowing a 1-second difference
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@test
|
|
59
|
+
async testCacheValueIsUndefinedIfExpired() {
|
|
60
|
+
const durationInSeconds = -60 // Setting a past expiration
|
|
61
|
+
|
|
62
|
+
await this.databaseStore.set('anotherExpiredTest', 'value', durationInSeconds)
|
|
63
|
+
|
|
64
|
+
const value = await this.databaseStore.get('anotherExpiredTest')
|
|
65
|
+
expect(value).to.be.undefined
|
|
66
|
+
|
|
67
|
+
const cacheRecord = await this.getCacheRecord('anotherExpiredTest')
|
|
68
|
+
expect(cacheRecord).to.be.undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@test
|
|
72
|
+
async testDeleteMethodDeletesRecordFromDatabase() {
|
|
73
|
+
await this.databaseStore.set('deleteTest', 'value')
|
|
74
|
+
|
|
75
|
+
await this.databaseStore.delete('deleteTest')
|
|
76
|
+
|
|
77
|
+
const cacheRecord = await this.getCacheRecord('deleteTest')
|
|
78
|
+
expect(cacheRecord).to.be.undefined
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@test
|
|
82
|
+
async testFlushMethodDeletesAllRecords() {
|
|
83
|
+
await this.databaseStore.set('flushTest', 'value')
|
|
84
|
+
|
|
85
|
+
await this.databaseStore.flush()
|
|
86
|
+
|
|
87
|
+
const allRecords = await Query.table(tableName).get()
|
|
88
|
+
expect(allRecords.length).to.be.equal(0)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@test
|
|
92
|
+
async testRememberMethodCreatesRecordIfNotExists() {
|
|
93
|
+
const value = await this.databaseStore.remember('rememberTest', 'defaultValue', 60)
|
|
94
|
+
|
|
95
|
+
expect(value).to.equal('defaultValue')
|
|
96
|
+
|
|
97
|
+
const cacheRecord = await this.getCacheRecord('rememberTest')
|
|
98
|
+
expect(cacheRecord).to.exist
|
|
99
|
+
expect((cacheRecord as CacheItem<any>).value).to.be.equal(JSON.stringify('defaultValue'))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@test
|
|
103
|
+
async testRememberMethodReturnsExistingValue() {
|
|
104
|
+
await this.databaseStore.set('rememberTest2', 'existingValue')
|
|
105
|
+
|
|
106
|
+
const value = await this.databaseStore.remember('rememberTest2', 'defaultValue', 60)
|
|
107
|
+
|
|
108
|
+
expect(value).to.equal('existingValue')
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { suite, test } from '@testdeck/mocha'
|
|
2
|
+
import { FileStore } from '@Typetron/Cache'
|
|
3
|
+
import { Storage } from '@Typetron/Storage'
|
|
4
|
+
import { expect } from 'chai'
|
|
5
|
+
|
|
6
|
+
const directory = './tests/Cache/.cache'
|
|
7
|
+
|
|
8
|
+
@suite
|
|
9
|
+
class FileStoreTest {
|
|
10
|
+
storage = new Storage()
|
|
11
|
+
fileStore = new FileStore(this.storage, directory)
|
|
12
|
+
|
|
13
|
+
static async after() {
|
|
14
|
+
const storage = new Storage()
|
|
15
|
+
if (await storage.exists(directory)) {
|
|
16
|
+
await storage.deleteDirectory(directory)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@test
|
|
21
|
+
async returnsUndefinedIfKeyDoesNotExist() {
|
|
22
|
+
const value = await this.fileStore.get('nonexistentKey')
|
|
23
|
+
expect(value).to.be.undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@test
|
|
27
|
+
async canStoreAndRetrieveData() {
|
|
28
|
+
await this.fileStore.set('testKey', 'testValue')
|
|
29
|
+
const value = await this.fileStore.get('testKey')
|
|
30
|
+
expect(value).to.equal('testValue')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@test
|
|
34
|
+
async canDeleteData() {
|
|
35
|
+
await this.fileStore.set('testKey', 'testValue')
|
|
36
|
+
await this.fileStore.delete('testKey')
|
|
37
|
+
const value = await this.fileStore.get('testKey')
|
|
38
|
+
expect(value).to.be.undefined
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@test
|
|
42
|
+
async canFlushAllData() {
|
|
43
|
+
await this.fileStore.set('key1', 'value1')
|
|
44
|
+
await this.fileStore.set('key2', 'value2')
|
|
45
|
+
await this.fileStore.flush()
|
|
46
|
+
const value1 = await this.fileStore.get('key1')
|
|
47
|
+
const value2 = await this.fileStore.get('key2')
|
|
48
|
+
expect(value1).to.be.undefined
|
|
49
|
+
expect(value2).to.be.undefined
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@test
|
|
53
|
+
async respectsExpiration() {
|
|
54
|
+
await this.fileStore.set('expiringKey', 'expiringValue', 0.01)
|
|
55
|
+
await new Promise(resolve => setTimeout(resolve, 11))
|
|
56
|
+
const value = await this.fileStore.get('expiringKey')
|
|
57
|
+
expect(value).to.be.undefined
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@test
|
|
61
|
+
async canCheckIfKeyExists() {
|
|
62
|
+
await this.fileStore.set('testKey', 'testValue')
|
|
63
|
+
const exists = await this.fileStore.has('testKey')
|
|
64
|
+
expect(exists).to.be.true
|
|
65
|
+
const nonExistent = await this.fileStore.has('nonexistentKey')
|
|
66
|
+
expect(nonExistent).to.be.false
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@test
|
|
70
|
+
async canRememberValue() {
|
|
71
|
+
const value = await this.fileStore.remember('rememberKey', 'rememberValue', 0.01)
|
|
72
|
+
expect(value).to.equal('rememberValue')
|
|
73
|
+
await new Promise(resolve => setTimeout(resolve, 11))
|
|
74
|
+
const expiredValue = await this.fileStore.get('rememberKey')
|
|
75
|
+
expect(expiredValue).to.be.undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@test
|
|
79
|
+
async getMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
|
|
80
|
+
const value1 = await this.fileStore.get('nonexistentKey', 'defaultValue')
|
|
81
|
+
expect(value1).to.equal('defaultValue')
|
|
82
|
+
const value2 = await this.fileStore.get('nonexistentKey', () => 'defaultValue')
|
|
83
|
+
expect(value2).to.equal('defaultValue')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@test
|
|
87
|
+
async rememberMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
|
|
88
|
+
const value1 = await this.fileStore.remember('nonexistentKey', 'defaultValue', 0.01)
|
|
89
|
+
expect(value1).to.equal('defaultValue')
|
|
90
|
+
const value2 = await this.fileStore.remember('nonexistentKey2', () => 'defaultValue', 0.01)
|
|
91
|
+
expect(value2).to.equal('defaultValue')
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { suite, test } from '@testdeck/mocha'
|
|
2
|
+
import { MemoryStore } from '@Typetron/Cache'
|
|
3
|
+
import { expect } from 'chai'
|
|
4
|
+
|
|
5
|
+
@suite
|
|
6
|
+
class MemoryStoreTest {
|
|
7
|
+
memoryStore = new MemoryStore()
|
|
8
|
+
|
|
9
|
+
@test
|
|
10
|
+
async returnsUndefinedIfKeyDoesNotExist() {
|
|
11
|
+
const value = await this.memoryStore.get('nonexistentKey')
|
|
12
|
+
expect(value).to.be.undefined
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@test
|
|
16
|
+
async canStoreAndRetrieveData() {
|
|
17
|
+
await this.memoryStore.set('testKey', 'testValue')
|
|
18
|
+
expect(this.memoryStore.cache.has('testKey')).to.be.true
|
|
19
|
+
const value = await this.memoryStore.get('testKey')
|
|
20
|
+
expect(value).to.equal('testValue')
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@test
|
|
24
|
+
async canDeleteData() {
|
|
25
|
+
await this.memoryStore.set('testKey', 'testValue')
|
|
26
|
+
await this.memoryStore.delete('testKey')
|
|
27
|
+
const value = await this.memoryStore.get('testKey')
|
|
28
|
+
expect(value).to.be.undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@test
|
|
32
|
+
async canFlushAllData() {
|
|
33
|
+
await this.memoryStore.set('key1', 'value1')
|
|
34
|
+
await this.memoryStore.set('key2', 'value2')
|
|
35
|
+
await this.memoryStore.flush()
|
|
36
|
+
const value1 = await this.memoryStore.get('key1')
|
|
37
|
+
const value2 = await this.memoryStore.get('key2')
|
|
38
|
+
expect(value1).to.be.undefined
|
|
39
|
+
expect(value2).to.be.undefined
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@test
|
|
43
|
+
async respectsExpiration() {
|
|
44
|
+
await this.memoryStore.set('expiringKey', 'expiringValue', 0.01)
|
|
45
|
+
await new Promise(resolve => setTimeout(resolve, 11))
|
|
46
|
+
const value = await this.memoryStore.get('expiringKey')
|
|
47
|
+
expect(value).to.be.undefined
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@test
|
|
51
|
+
async canCheckIfKeyExists() {
|
|
52
|
+
await this.memoryStore.set('testKey', 'testValue')
|
|
53
|
+
const exists = await this.memoryStore.has('testKey')
|
|
54
|
+
expect(exists).to.be.true
|
|
55
|
+
const nonExistent = await this.memoryStore.has('nonexistentKey')
|
|
56
|
+
expect(nonExistent).to.be.false
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@test
|
|
60
|
+
async canRememberValue() {
|
|
61
|
+
const value = await this.memoryStore.remember('rememberKey', 'rememberValue', 0.01)
|
|
62
|
+
expect(value).to.equal('rememberValue')
|
|
63
|
+
expect(this.memoryStore.cache.has('rememberKey')).to.be.true
|
|
64
|
+
await new Promise(resolve => setTimeout(resolve, 11))
|
|
65
|
+
const expiredValue = await this.memoryStore.get('rememberKey')
|
|
66
|
+
expect(expiredValue).to.be.undefined
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@test
|
|
70
|
+
async getMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
|
|
71
|
+
// Non-function default value
|
|
72
|
+
const value1 = await this.memoryStore.get('nonexistentKey', 'defaultValue')
|
|
73
|
+
expect(value1).to.equal('defaultValue')
|
|
74
|
+
|
|
75
|
+
// Function default value
|
|
76
|
+
const value2 = await this.memoryStore.get('nonexistentKey', () => 'defaultValue')
|
|
77
|
+
expect(value2).to.equal('defaultValue')
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@test
|
|
81
|
+
async rememberMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
|
|
82
|
+
// Non-function default value
|
|
83
|
+
const value1 = await this.memoryStore.remember('nonexistentKey', 'defaultValue', 0.01)
|
|
84
|
+
expect(value1).to.equal('defaultValue')
|
|
85
|
+
expect(this.memoryStore.cache.has('nonexistentKey')).to.be.true
|
|
86
|
+
|
|
87
|
+
// Function default value
|
|
88
|
+
const value2 = await this.memoryStore.remember('nonexistentKey2', () => 'defaultValue', 0.01)
|
|
89
|
+
expect(value2).to.equal('defaultValue')
|
|
90
|
+
expect(this.memoryStore.cache.has('nonexistentKey2')).to.be.true
|
|
91
|
+
}
|
|
92
|
+
}
|