UNPKG

4.64 kBJavaScriptView Raw
1/*jshint -W030 */
2'use strict';
3
4const aws = require('aws-sdk');
5const path = require('path');
6const dynograte = require('../');
7const uuid = require('node-uuid');
8const chai = require('chai');
9const expect = require('chai').expect;
10const _createDynamoTable = require('../lib/util/createDynamoTable');
11const _putAttrItem = require('../lib/util/putAttrItem');
12const _createDummySchema = require('./util/createDummySchema');
13const _deleteDynamoTable = require('./util/deleteDynamoTable');
14const _addGlobalSecondaryKey = require('./util/addDummyGlobalSecondaryKey');
15const MigrationTableSchema = require('../lib/MigrationTableSchema');
16const config = require('../config');
17
18const attr = require('dynamodb-data-types').AttributeValue;
19
20require('chai').should();
21chai.config.includeStack = true;
22
23const dynamodb = new aws.DynamoDB(config.dynamodb);
24
25function _createAndValidateSecondaryKey(dynamodb, tableName) {
26 let putItem = {
27 id: uuid.v4(),
28 homeId: uuid.v4(),
29 petId: uuid.v4(),
30 testId: uuid.v4(),
31 test: 'test'
32 };
33
34 return new Promise((resolve, reject) => {
35 return _addGlobalSecondaryKey(dynamodb, tableName)
36 .then(() => {
37 return _putAttrItem(dynamodb, tableName, putItem);
38 })
39 .then(() => {
40 dynamodb.getItem({
41 Key: attr.wrap({
42 id: putItem.id,
43 homeId: putItem.homeId
44 }),
45 TableName: tableName
46 }, (err, data) => {
47 if (err) {
48 return reject(err);
49 }
50
51 expect(data).to.deep.equal({
52 Item: attr.wrap(putItem)
53 });
54
55 return resolve(data);
56 });
57 });
58 });
59}
60
61describe('Migration table test', function() {
62 let randomTableName;
63
64 beforeEach(() => {
65 const dummySchema = _createDummySchema();
66 randomTableName = dummySchema.TableName;
67
68 return _createDynamoTable(dynamodb, dummySchema)
69 .then(() => {
70 return _putAttrItem(dynamodb, randomTableName, {
71 'id': uuid.v4(),
72 'homeId': uuid.v4(),
73 'petId': uuid.v4(),
74 'test': 'test'
75 });
76 });
77 });
78
79 describe('Migration table already exists', () => {
80 let randomMigrationTableName;
81 let schema = MigrationTableSchema;
82
83 beforeEach(() => {
84 randomMigrationTableName = schema.TableName = uuid.v4();
85 return _createDynamoTable(dynamodb, schema);
86 });
87
88 afterEach(() => {
89 return _deleteDynamoTable(dynamodb, randomMigrationTableName)
90 .then(() => {
91 return _deleteDynamoTable(dynamodb, randomTableName);
92 });
93 });
94
95 it('should allow passing migrator functions as array to dynograte', () => {
96 return dynograte.migrate({
97 dynamodb,
98 migrationTableName: randomMigrationTableName
99 }, [
100 (dynamodb) => {
101 return _createAndValidateSecondaryKey(dynamodb, randomTableName);
102 },
103 (dynamodb) => {
104 return Promise.resolve();
105 }
106 ]);
107 });
108
109 it('should allow passing single migrator function to dynograte', () => {
110 return dynograte.migrate({
111 dynamodb,
112 migrationTableName: randomMigrationTableName
113 }, (dynamodb) => {
114 return _createAndValidateSecondaryKey(dynamodb, randomTableName);
115 });
116 });
117 });
118
119 describe('Migration table does not exist', () => {
120 let randomMigrationTableName;
121
122 beforeEach(() => {
123 randomMigrationTableName = `dynograte-${uuid.v4()}`;
124 });
125
126 afterEach(() => {
127 return _deleteDynamoTable(dynamodb, randomMigrationTableName)
128 .then(() => {
129 return _deleteDynamoTable(dynamodb, randomTableName);
130 });
131 });
132
133 it('should allow migrating when migration table does not exist', () => {
134 return dynograte.migrate({
135 dynamodb,
136 migrationTableName: randomMigrationTableName
137 }, (dynamodb) => {
138 return _createAndValidateSecondaryKey(dynamodb, randomTableName);
139 });
140 });
141 });
142
143 describe('Migration from a directory', () => {
144 let randomMigrationTableName;
145
146 beforeEach(() => {
147 randomMigrationTableName = `dynograte-${uuid.v4()}`;
148 });
149
150 afterEach(() => {
151 return _deleteDynamoTable(dynamodb, randomMigrationTableName)
152 .then(() => {
153 return _deleteDynamoTable(dynamodb, randomTableName);
154 });
155 });
156
157 it('should migrate from a specified directory of files', () => {
158 let migrationDir = path.resolve(__dirname, './dynamodb-migrations');
159
160 return dynograte.migrate({
161 dynamodb,
162 migrationTableName: randomMigrationTableName,
163 migrationDir: migrationDir
164 });
165 });
166 });
167});