1 |
|
2 | 'use strict';
|
3 |
|
4 | const aws = require('aws-sdk');
|
5 | const path = require('path');
|
6 | const dynograte = require('../');
|
7 | const uuid = require('node-uuid');
|
8 | const chai = require('chai');
|
9 | const expect = require('chai').expect;
|
10 | const _createDynamoTable = require('../lib/util/createDynamoTable');
|
11 | const _putAttrItem = require('../lib/util/putAttrItem');
|
12 | const _createDummySchema = require('./util/createDummySchema');
|
13 | const _deleteDynamoTable = require('./util/deleteDynamoTable');
|
14 | const _addGlobalSecondaryKey = require('./util/addDummyGlobalSecondaryKey');
|
15 | const MigrationTableSchema = require('../lib/MigrationTableSchema');
|
16 | const config = require('../config');
|
17 |
|
18 | const attr = require('dynamodb-data-types').AttributeValue;
|
19 |
|
20 | require('chai').should();
|
21 | chai.config.includeStack = true;
|
22 |
|
23 | const dynamodb = new aws.DynamoDB(config.dynamodb);
|
24 |
|
25 | function _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 |
|
61 | describe('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 | });
|