Skip to content

Commit

Permalink
feat(dao): add other photo methods (delete, get, etc.)
Browse files Browse the repository at this point in the history
  • Loading branch information
Benjamin Reed committed Feb 19, 2019
1 parent f2a341e commit c67b0ec
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 54 deletions.
35 changes: 34 additions & 1 deletion src/dao/PhotoDAO.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { AbstractDAO } from './AbstractDAO';
import { TwitarrError } from '../api/TwitarrError';
import { TwitarrHTTPOptions } from '../api/TwitarrHTTPOptions';
import { TwitarrResult } from '../api/TwitarrResult';
import { PhotoDetails } from '../model/PhotoDetails';

const URI = require('urijs'); // tslint:disable-line
Expand All @@ -15,6 +14,40 @@ if (typeof FormData === 'undefined') {
require('buffer'); // tslint:disable-line no-var-requires

export class PhotoDAO extends AbstractDAO {
/**
* Retrieve a photo's metadata.
*/
public async get(id: string) {
const options = new TwitarrHTTPOptions()
.withParameter('app', 'plain');

return this.http.get('/api/v2/photo/' + id, options).then((result) => {
return PhotoDetails.fromRest(result.data.photo);
});
}

/**
* Update the "original filename" metadata on a photo.
*/
public async put(id: string, newFileName: string) {
const options = new TwitarrHTTPOptions()
.withParameter('app', 'plain');

options.data = {
original_filename: newFileName,
};
return this.http.put('/api/v2/photo/' + id, options).then((result) => {
return PhotoDetails.fromRest(result.data.photo);
});
}

/**
* Delete/remove a photo..
*/
public async remove(id: string) {
return this.http.httpDelete('/api/v2/photo/' + id);
}

/**
* Post a photo.
*/
Expand Down
29 changes: 28 additions & 1 deletion test/dao/PhotoDAO.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ declare const describe, beforeEach, it, expect;
import { PhotoDAO } from '../../src/dao/PhotoDAO';
import { PhotoDetails } from '../../src/model/PhotoDetails';
import { TwitarrAuthConfig } from '../../src/api/TwitarrAuthConfig';
import { TwitarrResult } from '../../src/api/TwitarrResult';
import { TwitarrServer } from '../../src/api/TwitarrServer';

import { MockHTTP } from '../rest/MockHTTP';
import { Util } from '../../src/internal/Util';

const SERVER_NAME = 'Demo';
const SERVER_URL = 'http://demo.twitarr.com/';
Expand All @@ -24,6 +24,24 @@ describe('dao/PhotoDAO', () => {
mockHTTP = new MockHTTP(server);
dao = new PhotoDAO(mockHTTP);
});
describe('#get', () => {
it('get(id)', async (done) => {
const ret = await dao.get('12345');
expect(ret).toBeDefined();
expect(ret).toBeInstanceOf(PhotoDetails);
expect(ret.original_filename).toEqual('foo.png');
done();
});
});
describe('#put', () => {
it('put(id, filename)', async (done) => {
const ret = await dao.put('12345', 'bar.png');
expect(ret).toBeDefined();
expect(ret).toBeInstanceOf(PhotoDetails);
expect(ret.original_filename).toEqual('bar.png');
done();
});
});
describe('#post', () => {
it('post()', async (done) => {
const ret = await dao.post('foo.png', new Buffer([]));
Expand All @@ -33,4 +51,13 @@ describe('dao/PhotoDAO', () => {
done();
});
});
describe('#remove', () => {
it('remove(id)', async (done) => {
const ret = await dao.remove('12345');
expect(ret).toBeDefined();
expect(ret).toBeInstanceOf(TwitarrResult);
expect(ret.isSuccess()).toBeTruthy();
done();
});
});
});
17 changes: 17 additions & 0 deletions test/data/photo-foo-png.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"photo": {
"animated": false,
"id": "5c672f16daf15adc05421b4a",
"md5_hash": "b7edc72c0773bb13528dbb391c335e02",
"original_filename": "foo.png",
"sizes": {
"full": "477x477",
"medium_thumb": "477x477",
"small_thumb": "200x200"
},
"store_filename": "23289524-d90b-4552-aa92-918744590320.png",
"upload_time": 1550266134083,
"uploader": "kvort"
},
"status": "ok"
}
99 changes: 47 additions & 52 deletions test/rest/MockHTTP.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,19 @@ const getError = (method: string, urlObj: any, options?: TwitarrHTTPOptions) =>
return new Error(message);
};

/** Wrap in a JSON 'ok' result. */
const jsonOK = (contents: any) => {
const ret = TwitarrResult.ok(contents);
ret.type = 'application/json';
return Promise.resolve(ret);
};

/** Deep copy. */
const getJsonFromFile = (file: string) => {
const json = require(file);
return JSON.parse(JSON.stringify(json));
};

export class MockHTTP extends AbstractHTTP {
/** make an HTTP get call -- this should be overridden by the implementation */
public get(url: string, options?: TwitarrHTTPOptions) {
Expand All @@ -47,7 +54,7 @@ export class MockHTTP extends AbstractHTTP {

switch (urlObj.toString()) {
case 'http://demo.twitarr.com/api/v2/text/welcome': {
return jsonOK(require('../data/welcome.json'));
return jsonOK(getJsonFromFile('../data/welcome.json'));
}
case '/api/v2/user/new_seamail': {
return jsonOK({
Expand All @@ -56,76 +63,79 @@ export class MockHTTP extends AbstractHTTP {
});
}
case '/api/v2/seamail?app=plain': {
return jsonOK(require('../data/seamail.json'));
return jsonOK(getJsonFromFile('../data/seamail.json'));
}
case '/api/v2/seamail?app=plain&unread=true': {
return jsonOK(require('../data/seamail-unread-true.json'));
return jsonOK(getJsonFromFile('../data/seamail-unread-true.json'));
}
case '/api/v2/seamail?app=plain&after=1549827395180': {
return jsonOK(require('../data/seamail-after-epoch.json'));
return jsonOK(getJsonFromFile('../data/seamail-after-epoch.json'));
}
case '/api/v2/seamail_threads?app=plain': {
return jsonOK(require('../data/seamail_threads.json'));
return jsonOK(getJsonFromFile('../data/seamail_threads.json'));
}
case '/api/v2/seamail_threads?app=plain&exclude_read_messages=true': {
return jsonOK(require('../data/seamail_threads-exclude_read_messages-true.json'));
return jsonOK(getJsonFromFile('../data/seamail_threads-exclude_read_messages-true.json'));
}
case '/api/v2/seamail_threads?app=plain&unread=true': {
return jsonOK(require('../data/seamail_threads-unread-true.json'));
return jsonOK(getJsonFromFile('../data/seamail_threads-unread-true.json'));
}
case '/api/v2/seamail_threads?app=plain&after=1549827390000': {
return jsonOK(require('../data/seamail_threads-after-epoch.json'));
return jsonOK(getJsonFromFile('../data/seamail_threads-after-epoch.json'));
}
case '/api/v2/seamail/5c607d43ea204f5815755cda?app=plain': {
return jsonOK(require('../data/seamail-5c607d43ea204f5815755cda.json'));
return jsonOK(getJsonFromFile('../data/seamail-5c607d43ea204f5815755cda.json'));
}
case '/api/v2/seamail/5c607d43ea204f5815755cda?app=plain&skip_mark_read=true': {
return jsonOK(require('../data/seamail-5c607d43ea204f5815755cda.json'));
return jsonOK(getJsonFromFile('../data/seamail-5c607d43ea204f5815755cda.json'));
}
case '/api/v2/stream?app=plain': {
return jsonOK(require('../data/stream.json'));
return jsonOK(getJsonFromFile('../data/stream.json'));
}
case '/api/v2/stream?app=plain&limit=5': {
return jsonOK(require('../data/stream-limit-5.json'));
return jsonOK(getJsonFromFile('../data/stream-limit-5.json'));
}
case '/api/v2/stream?app=plain&limit=20': {
return jsonOK(require('../data/stream.json'));
return jsonOK(getJsonFromFile('../data/stream.json'));
}
case '/api/v2/stream?app=plain&hashtag=hashtag': {
return jsonOK(require('../data/stream-hashtag.json'));
return jsonOK(getJsonFromFile('../data/stream-hashtag.json'));
}
case '/api/v2/stream?app=plain&newer_posts=true': {
return jsonOK(require('../data/stream-empty.json'));
return jsonOK(getJsonFromFile('../data/stream-empty.json'));
}
case '/api/v2/stream?app=plain&author=rangerrick': {
return jsonOK(require('../data/stream-rangerrick.json'));
return jsonOK(getJsonFromFile('../data/stream-rangerrick.json'));
}
case '/api/v2/stream?app=plain&mentions=rangerrick': {
return jsonOK(require('../data/stream-mentions-rangerrick.json'));
return jsonOK(getJsonFromFile('../data/stream-mentions-rangerrick.json'));
}
case '/api/v2/stream?app=plain&include_author=true&mentions=rangerrick': {
return jsonOK(require('../data/stream-mentions-rangerrick-include-author.json'));
return jsonOK(getJsonFromFile('../data/stream-mentions-rangerrick-include-author.json'));
}
case '/api/v2/stream?app=plain&start=0': {
return jsonOK(require('../data/stream.json'));
return jsonOK(getJsonFromFile('../data/stream.json'));
}
case '/api/v2/stream?app=plain&starred=true': {
return jsonOK(require('../data/stream-mentions-rangerrick.json'));
return jsonOK(getJsonFromFile('../data/stream-mentions-rangerrick.json'));
}
case '/api/v2/thread/5c63275ad86b930ad6739cb8?app=plain': {
return jsonOK(require('../data/stream-thread.json'));
return jsonOK(getJsonFromFile('../data/stream-thread.json'));
}
case '/api/v2/thread/5c63275ad86b930ad6739cb8?app=plain&limit=1': {
return jsonOK(require('../data/stream-thread-limit.json'));
return jsonOK(getJsonFromFile('../data/stream-thread-limit.json'));
}
case '/api/v2/thread/5c63275ad86b930ad6739cb8?app=plain&limit=1&page=1': {
return jsonOK(require('../data/stream-thread-limit-page-1.json'));
return jsonOK(getJsonFromFile('../data/stream-thread-limit-page-1.json'));
}
case '/api/v2/stream/m/rangerrick?app=plain': {
return jsonOK(require('../data/stream-mentions-rangerrick-include-author.json'));
return jsonOK(getJsonFromFile('../data/stream-mentions-rangerrick-include-author.json'));
}
case '/api/v2/stream/h/hashtag?app=plain': {
return jsonOK(require('../data/stream-hashtag.json'));
return jsonOK(getJsonFromFile('../data/stream-hashtag.json'));
}
case '/api/v2/photo/12345?app=plain': {
return jsonOK(getJsonFromFile('../data/photo-foo-png.json'));
}
}

Expand All @@ -139,13 +149,11 @@ export class MockHTTP extends AbstractHTTP {
}

switch (urlObj.toString()) {
/*
case 'rest/alarms/404725?ack=true': {
const result = TwitarrResult.ok('');
result.type = 'text/plain';
return Promise.resolve(result);
case '/api/v2/photo/12345?app=plain': {
const ret = getJsonFromFile('../data/photo-foo-png.json');
ret.photo.original_filename = options.data.original_filename;
return jsonOK(ret);
}
*/
}

return Promise.reject(getError('PUT', urlObj, options));
Expand Down Expand Up @@ -181,24 +189,24 @@ export class MockHTTP extends AbstractHTTP {
}
case '/api/v2/seamail': {
if (options.data.subject === 'Test Subject' && options.data.text === 'Test Message' && options.data.users.length === 2) {
return jsonOK(require('../data/seamail-create-response.json'));
return jsonOK(getJsonFromFile('../data/seamail-create-response.json'));
}
break;
}
case '/api/v2/seamail/5c607d43ea204f5815755cda': {
if (options.data.text === 'another message') {
return jsonOK(require('../data/seamail-post.json'));
return jsonOK(getJsonFromFile('../data/seamail-post.json'));
}
break;
}
case '/api/v2/stream': {
if (options.data.text === 'this is a twitter post!' && Util.isEmpty(options.data.parent, options.data.photo)) {
return jsonOK(require('../data/stream-mentions-rangerrick-include-author.json'));
return jsonOK(getJsonFromFile('../data/stream-mentions-rangerrick-include-author.json'));
}
break;
}
case '/api/v2/tweet/5c63275ad86b930ad6739cb8': {
return jsonOK(require('../data/stream-mentions-rangerrick-include-author.json'));
return jsonOK(getJsonFromFile('../data/stream-mentions-rangerrick-include-author.json'));
}
case '/api/v2/tweet/5c63275ad86b930ad6739cb8/locked/true': {
return jsonOK({
Expand Down Expand Up @@ -249,6 +257,9 @@ export class MockHTTP extends AbstractHTTP {
status: 'ok',
});
}
case '/api/v2/photo/12345': {
return Promise.resolve(TwitarrResult.ok(undefined, undefined, 204, undefined));
}
}

return Promise.reject(getError('DELETE', urlObj, options));
Expand All @@ -263,23 +274,7 @@ export class MockHTTP extends AbstractHTTP {
switch (urlObj.toString()) {
case '/api/v2/photo': {
if (fileName === 'foo.png') {
return jsonOK({
photo: {
animated: false,
id: '5c672f16daf15adc05421b4a',
md5_hash: 'b7edc72c0773bb13528dbb391c335e02',
original_filename: 'foo.png',
sizes: {
full: '477x477',
medium_thumb: '477x477',
small_thumb: '200x200',
},
store_filename: '23289524-d90b-4552-aa92-918744590320.png',
upload_time: 1550266134083,
uploader: 'kvort',
},
status: 'ok',
});
return jsonOK(getJsonFromFile('../data/photo-foo-png.json'));
}
}
}
Expand Down

0 comments on commit c67b0ec

Please sign in to comment.