Преглед изворни кода

修复BUG,增加消息收发单元测试

Sand пре 8 година
родитељ
комит
0d6ba426e8

+ 128 - 136
src/doctor/endpoints/chats.endpoint.js

@ -51,26 +51,28 @@ router.post(APIv1.Chats.SM, function (req, res) {
    }
    // 字段判断
    if (message.to == null || message.title == null) {
        throw {httpStatus: 406, message: 'Missing fields.'}
    var testing = objectUtil.fieldsCheck(message, "to", "title", "summary", "contentType", "content");
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }
    // 消息处理
    user.getUserStatus(message.to, function (err, userStatus) {
    user.getUserStatus(message.to, function (err, rows) {
        if (err) {
            console.log("Lookup system message receiver failed: ", err);
            
            throw {httpStatus: 500, message: "Lookup system message receiver failed: "};
        }
        if(userStatus.length == 0){
            throw {httpStatus: 404, message: "User not found."};
            res.status(500).send({message: "Lookup system message receiver failed."});
            return;
        }
        res.writeHead(200);
        if (rows.length == 0) {
            res.status(404).send({message: "User not found: " + message.to});
            return;
        }
        var pushable = userStatus.length > 0 && userStatus[0].is_online;
        var notifyMessage = JSON.stringify({type: message.contentType, content: message.content});
        var pushable = rows.length > 0 && rows[0].is_online;
        var notifyMessage = JSON.stringify({type: 'system_msg', content: message.content});
        var userStatus = rows[0];
        // 保存该条推送信息
        systemMsg.save(message.to,
@ -80,12 +82,15 @@ router.post(APIv1.Chats.SM, function (req, res) {
            message.content,
            function (err, result) {
                if (err) {
                    log.error("Save system message failed, ", err);
                    log.error("Save system notify message failed, ", err);
                    throw {httpStatus: 500, message: "Save system message failed."};
                    res.status(500).send({message: "Save system notify message failed."});
                } else {
                    // 先结束网络连接,再处理后续操作,减少客户端等待
                    res.status(200).send();
                    // 保存通知到数据库中
                    notifyMessage.saveMessage(message.to,
                    notifyMsg.save(message.to,
                        message.contentType,
                        message.title,
                        message.summary,
@ -93,12 +98,12 @@ router.post(APIv1.Chats.SM, function (req, res) {
                        pushable,
                        function (err, result) {
                            if (err) {
                                log.error("Save system message failed, ", err);
                                log.error("Save system notify message failed, ", err);
                                throw {httpStatus: 500, message: "Save system notify message failed."};
                                res.status(500).send({message: "Save system notify message failed."});
                            } else {
                                if (pushable == true) {
                                    if (userStatus.platform == PLATFORMS.iOS) {
                                if (pushable) {
                                    if (userStatus.platform === PLATFORMS.iOS) {
                                        getui.pushAPN(message.to,
                                            userStatus.token,
                                            message.contentType,
@ -108,7 +113,7 @@ router.post(APIv1.Chats.SM, function (req, res) {
                                            function (err, result) {
                                                err != null ? console.log(err) : console.log(result);
                                            });
                                    } else if (PLATFORMS.iOS.Android) {
                                    } else if (userStatus.platform === PLATFORMS.Android) {
                                        getui.pushAndroid(userStatus.client_id,
                                            message.contentType,
                                            message.title,
@ -125,8 +130,6 @@ router.post(APIv1.Chats.SM, function (req, res) {
                }
            });
    });
    res.writeHead(200);
});
/**
@ -153,57 +156,50 @@ router.post(APIv1.Chats.PM, function (req, res) {
    }
    // 字段判断
    if (message.from == null || message.to == null || message.contentType == null || message.content == null) {
        throw {httpStatus: 406, message: 'Missing fields.'}
    var testing = objectUtil.fieldsCheck(message, "from", "to", "contentType", "content");
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }
    // 处理消息
    user.isExist(message.to, function (err, result) {
    user.isExist(message.to, function (err, rows) {
        if (err) {
            console.log('Lookup receiving users failed: ', err);
            throw {httpStatus: 500, message: 'Lookup receiving users failed.'};
            res.status(500).send({message: 'Lookup receiving users failed.'});
            return;
        }
        if (result.length == 0) {
            throw {httpStatus: 404, message: 'Receiving users not found.'};
        if (rows.length == 0) {
            res.status(404).send({message: 'Receiving users not found.'});
            return;
        }
        // 保存消息
        privateMsg.save(message.to, message.from, message.contentType, message.content, function (err, result) {
            if (err) {
                throw {httpStatus: 500, message: 'Save private message failed.'};
                res.status(500).send({message: 'Save private message failed.'});
                return;
            }
            res.writeHead(200);
            // 结束网络连接,后续操作继续执行
            res.status(200).send();
            // 更新自身的聊天统计信息
            msgStats.updateP2PChatInfo(message.from,
                message.to,
                message.from,
                CHANNELS.Private,
                message.content,
                function (err, result) {
                    if (err) log.error(err);
                });
            msgStats.updateP2PChatInfo(message.from, message.to, message.from, message.contentType, message.content, function (err, result) {
                if (err) log.error(err);
            });
            // 更新对端的聊天统计信息
            msgStats.updateP2PChatInfo(message.to,
                message.from,
                message.from,
                message.contentType,
                message.content,
                function (err, result) {
                    if (err) log.error(err);
                });
            msgStats.updateP2PChatInfo(message.to, message.from, message.from, message.contentType, message.content, function (err, result) {
                if (err) log.error(err);
            });
            // 获取对方状态,即对端的系统平台,token等信息,并推送通知消息给对端
            user.getUserStatus(message.to, function (err, result) {
                if (err) {
                    log.error('Get users status failed: ' + message.to);
                    throw {httpStatus: 500, message: 'Find target users failed.'};
                    log.error('Get target user status for private message failed: ' + message.to);
                    return;
                }
                // 构建通知消息
@ -228,57 +224,49 @@ router.post(APIv1.Chats.PM, function (req, res) {
                    }
                }
                var notifyMessage = JSON.stringify({type: 'p2p_msg', from: message.from});
                var notifyMessage = JSON.stringify({type: 'p2p_msg', from_uid: message.from});
                // 保存通知消息到数据库中并根据用户在线状态推送此消息
                notifyMsg.saveNotifyMessage(message.to,
                    message.contentType,
                    title,
                    content,
                    notifyMessage,
                    pushable,
                    function (err, result) {
                        if (err) {
                            log.error('Save private notify message failed, ', err);
                        } else {
                            if (pushable === true) {
                                if (data.platform === PLATFORMS.iOS) {
                                    getui.pushAPN(message.to,
                                        data.token,
                                        message.contentType,
                                        title,
                                        content,
                                        notifyMessage,
                                        function (err, result) {
                                            if (err != null) {
                                                console.log(err);
                                            } else {
                                                console.log(result);
                                            }
                                        });
                                } else if (data.platform === PLATFORMS.Android) {
                                    getui.pushAndroid(data.client_id,
                                        message.contentType,
                                        title,
                                        content,
                                        notifyMessage,
                                        data.status,
                                        function (err, result) {
                                            if (err != null) {
                                                console.log(err);
                                            } else {
                                                console.log(result);
                                            }
                                        });
                                }
                notifyMsg.save(message.to, message.contentType, title, content, notifyMessage, pushable, function (err, result) {
                    if (err) {
                        log.error('Save private notify message failed, ', err);
                    } else {
                        if (pushable === true) {
                            if (target.platform === PLATFORMS.iOS) {
                                getui.pushAPN(message.to,
                                    target.token,
                                    message.contentType,
                                    title,
                                    content,
                                    notifyMessage,
                                    function (err, result) {
                                        if (err != null) {
                                            console.log(err);
                                        } else {
                                            console.log(result);
                                        }
                                    });
                            } else if (target.platform === PLATFORMS.Android) {
                                getui.pushAndroid(data.client_id,
                                    message.contentType,
                                    title,
                                    content,
                                    notifyMessage,
                                    target.status,
                                    function (err, result) {
                                        if (err != null) {
                                            console.log(err);
                                        } else {
                                            console.log(result);
                                        }
                                    });
                            }
                        }
                    });
                    }
                });
            });
        });
    });
    res.writeHead(200);
});
/**
@ -304,58 +292,62 @@ router.post(APIv1.Chats.GM, function (req, res) {
    }
    // 字段判断
    if (message.from == null || message.group == null || message.contentType == null || message.content == null) {
        throw {httpStatus: 406, message: 'Missing fields.'}
    var testing = objectUtil.fieldsCheck(message, 'from', 'at', 'group', 'groupType', 'contentType', 'content');
    if (!testing.pass) {
        throw {httpStatus: 406, message: testing.message}
    }
    // 消息处理
    group.isGroupMember(message.group, message.groupType, message.from, function (err, result) {
        if (err) {
            throw {httpStatus: 500, message: 'Check group member failed.'};
            log.error('Check group member failed: ', err);
            res.status(500).send({message: 'Check group member failed.'});
            return;
        }
        if (result.length == 0) {
            throw {httpStatus: 404, message: 'Group member not found. Member id: ' + message.from};
            res.status(404).send({message: 'Member with id "' + message.from + '" is not in group "' + message.group + '"'});
            return;
        }
        // 保存群组消息
        groupMsg.saveMessage(message.from, message.group, message.at, message.contentType, message.content, function (err, result) {
        groupMsg.save(message.from, message.group, message.at, message.contentType, message.content, function (err, result) {
            if (err) {
                throw {httpStatus: 500, message: 'Save group message failed.'};
                log.error('Save group message failed: ', err);
                res.status(500).send({message: 'Save group message failed.'});
                return;
            }
            res.writeHead(200);
            // 统计信息
            msgStats.updateGroupChatInfo(message.from,
                message.group,
                message.from,
                0,
                message.contentType,
                message.content,
                false,
                function (err, result) {
                    if (err) log.error(err);
                });
            // 关闭网络连接后执行后续操作
            res.status(200).send();
            // 更新组内统计信息
            msgStats.updateGroupChatInfo(message.from, message.group, message.from, 0, message.contentType, message.content, false, function (err, result) {
                if (err) log.error(err);
            });
            // 推送通知消息给群组成员
            group.getMembers(message.group, message.groupType, function (err, result) {
                if (err) {
                    log.error('Get group members failed: ', err);
                    throw {httpStatus: 500, message: 'Get group members failed.'};
                    return;
                }
                if (result.length == 0) {
                    log.warn('No members in group ', message.group);
                    log.warn('No members in group ', message.group,
                        message.groupType === GROUP_TYPE.AdminTeam ? " of admin team." : "of discussion group.");
                    return;
                }
                // 逐个推送通知
                for (var nIndex = 0; nIndex < result.length; nIndex++) {
                    var member = result[nIndex];
                    if (member.member_code === message.from) continue;
                    if (member.user_id === message.from) continue;
                    user.getUserStatus(member.member_code, function (err, result) {
                    user.getUserStatus(member.user_id, function (err, result) {
                        if (err) {
                            console.error('Get group member status failed: ', err);
                            return;
@ -378,13 +370,15 @@ router.post(APIv1.Chats.GM, function (req, res) {
                        }
                        var pushable = result.length > 0 && result[0].is_online === 1;
                        var notifyMessage = JSON.stringify({type: 'group_msg', groupId: message.group});
                        var notifyMessage = JSON.stringify({type: 'group_msg', gid: message.group});
                        // 发送并保存通知到数据库中
                        if (pushable) {
                            if (data.platform === PLATFORMS.iOS) {
                                getui.pushAPN(member.member_code,
                                    data.token,
                            var userStatus = result[0];
                            if (userStatus.platform === PLATFORMS.iOS) {
                                getui.pushAPN(member.user_id,
                                    userStatus.token,
                                    message.contentType,
                                    title,
                                    content,
@ -393,7 +387,7 @@ router.post(APIv1.Chats.GM, function (req, res) {
                                        err != null ? console.error(err) : console.log(result);
                                        // 这段代码重复
                                        notifyMsg.saveNotifyMessage(member.member_code,
                                        notifyMsg.save(member.user_id,
                                            message.contentType,
                                            title,
                                            content,
@ -407,18 +401,18 @@ router.post(APIv1.Chats.GM, function (req, res) {
                                                }
                                            });
                                    });
                            } else if (data.platform === PLATFORMS.Android) {
                            } else if (userStatus.platform === PLATFORMS.Android) {
                                getui.pushAndroid(data.client_id,
                                    message.contentType,
                                    title,
                                    content,
                                    notifyMessage,
                                    data.status,
                                    userStatus.status,
                                    function (err, result) {
                                        err != null ? console.error(err) : console.log(result);
                                        // 这段代码重复
                                        notifyMsg.saveNotifyMessage(member.member_code,
                                        notifyMsg.save(member.user_id,
                                            message.contentType,
                                            title,
                                            content,
@ -435,7 +429,7 @@ router.post(APIv1.Chats.GM, function (req, res) {
                            }
                        } else {
                            // 这段代码重复
                            notifyMsg.saveNotifyMessage(member.member_code,
                            notifyMsg.save(member.user_id,
                                message.contentType,
                                title,
                                content,
@ -451,13 +445,11 @@ router.post(APIv1.Chats.GM, function (req, res) {
                        }
                    });
                    // 统计信息
                    // 统计'@'信息
                    var at = 0;
                    if (message.at == member.member_code) {
                        at = 1;
                    }
                    if (message.at == member.user_id) at = 1;
                    msgStats.updateGroupChatInfo(member.member_code,
                    msgStats.updateGroupChatInfo(member.user_id,
                        message.group,
                        message.from,
                        at,
@ -489,7 +481,7 @@ router.post(APIv1.Chats.GM, function (req, res) {
 * 请求URL:
 *  /pm?user_id=sand&peer_id=Rose&message_start_id=0&count=20
 */
router.get(APIv1.Chats.PM, function (req, res)  {
router.get(APIv1.Chats.PM, function (req, res) {
    var userId = req.query.user_id;
    var peerId = req.query.peer_id;
    var msgStartId = req.query.message_start_id === null ? MAX_INT : parseInt(req.query.message_start_id);
@ -499,7 +491,7 @@ router.get(APIv1.Chats.PM, function (req, res)  {
        throw {httpStatus: 400, message: "Missing field."};
    }
    privateMsg.findMessage(userId, peerId, msgStartId, count, function (err, rows) {
    privateMsg.findByGroupId(userId, peerId, msgStartId, count, function (err, rows) {
        if (err) {
            log.error("Get private message failed, ", err);
@ -537,7 +529,7 @@ router.get(APIv1.Chats.PM, function (req, res)  {
 * 请求URL:
 *  /gm?user_id=sand&group_id=discussionGroup&message_start_id=0&count=20
 */
router.get(APIv1.Chats.GM, function (req, res)  {
router.get(APIv1.Chats.GM, function (req, res) {
    var groupId = req.query.group_id;
    var userId = req.query.user_id;
    var msgStartId = req.query.message_start_id === null ? MAX_INT : parseInt(req.query.message_start_id);
@ -547,7 +539,7 @@ router.get(APIv1.Chats.GM, function (req, res)  {
        throw {httpStatus: 400, message: "Missing field."};
    }
    groupMsg.findMessage(groupId, msgStartId, count, function (err, rows) {
    groupMsg.findByGroupId(groupId, msgStartId, count, function (err, rows) {
        if (err) {
            console.log('Get group message failed: ', err);
@ -718,8 +710,8 @@ router.get(APIv1.Chats.GMStats, function (req, res) {
 *  peer_id:聊天对端id
 */
router.get(APIv1.Chats.PMStats, function (req, res) {
    var userId =  req.query.user_id;
    var peerId =  req.query.peer_id;
    var userId = req.query.user_id;
    var peerId = req.query.peer_id;
    if (userId == null || peerId == null) {
        throw {httpStatus: 406, message: "Missing fields."};
    }

+ 2 - 1
src/doctor/endpoints/users.endpoint.js

@ -60,7 +60,8 @@ router.get(APIv1.Users.Login, function (req, res) {
                    if (err) {
                        log.error('Error occurs when user login and delete token: ', err);
                        res.status(500).send({message: 'Error occurs when user login.'});
                        res.status(500).send({message: 'Error occurs when user login.'})
                        return;
                    }
                    res.status(200).end();

+ 4 - 4
src/doctor/include/commons.js

@ -30,16 +30,16 @@ var channels = {
 * 客户端平台。
 */
var platform = {
    iOS: "0",
    Android: "1"
    iOS: 0,
    Android: 1
};
/**
 * 组类型。
 */
var groupType = {
    AdminTeam: "1",
    DiscussionGroup: "2"
    AdminTeam: 1,
    DiscussionGroup: 2
};
exports.CHANNELS = channels;

+ 7 - 7
src/doctor/models/group.js

@ -7,7 +7,7 @@
"use strict";
var wlyyRepo = require("../repository/wlyy.repo");
var groupTypes = require('../include/commons').GROUP_TYPE;
var GROUP_TYPE = require('../include/commons').GROUP_TYPE;
/**
 * 判断是否为团队成员。
@ -18,15 +18,15 @@ var groupTypes = require('../include/commons').GROUP_TYPE;
 * @param handler
 */
function isGroupMember(groupId, groupType, doctorId, handler){
    if(groupType == groupTypes.AdminTeam) {
    if(groupType === GROUP_TYPE.AdminTeam) {
        wlyyRepo.execQuery({
            "sql": "SELECT doctor_code from wlyy_admin_team_member WHERE team_id=? and doctor_code=?",
            "sql": "SELECT doctor_code user_id from wlyy_admin_team_member WHERE team_id=? and doctor_code=?",
            "args": [groupId, doctorId],
            "handler": handler
        });
    }else {
        wlyyRepo.execQuery({
            "sql": "SELECT member_code from wlyy_talk_group_member WHERE group_code=? and member_code=?",
            "sql": "SELECT member_code user_id from wlyy_talk_group_member WHERE group_code=? and member_code=?",
            "args": [groupId, doctorId],
            "handler": handler
        });
@ -41,15 +41,15 @@ function isGroupMember(groupId, groupType, doctorId, handler){
 * @param handler
 */
function getMembers(groupId, groupType, handler) {
    if(groupType == groupTypes.AdminTeam) {
    if(groupType === GROUP_TYPE.AdminTeam) {
        wlyyRepo.execQuery({
            "sql": "SELECT doctor_code from wlyy_admin_team_member WHERE team_id=? AND available = 1",
            "sql": "SELECT doctor_code user_id from wlyy_admin_team_member WHERE team_id=? AND available = 1",
            "args": [groupId],
            "handler": handler
        });
    } else {
        wlyyRepo.execQuery({
            "sql": "SELECT member_code from wlyy_talk_group_member WHERE group_code=?",
            "sql": "SELECT member_code user_id from wlyy_talk_group_member WHERE group_code=?",
            "args": [groupId],
            "handler": handler
        });

+ 6 - 6
src/doctor/models/msg.group.js

@ -2,16 +2,16 @@
var imRepo = require("../repository/im.repo");
function saveMessage(from, groupId, at, contentType, content, handler) {
function save(from, groupId, at, contentType, content, handler) {
	imRepo.execQuery({
		"sql": "INSERT INTO groups (to_gid,from_uid,at_uid,type,content) VALUES (?,?,?,?,?)",
		"sql": "INSERT INTO msg_group (to_gid,from_uid,at_uid,type,content) VALUES (?,?,?,?,?)",
		"args": [groupId, from, at, contentType, content],
		"handler": handler
	});
}
function findMessage(groupId, start, count, handler) {
	var sql = "SELECT from_uid,at_uid,type,content,timestamp from groups WHERE to_gid = ? GROUP BY timestamp DESC LIMIT ";
function findByGroupId(groupId, start, count, handler) {
	var sql = "SELECT from_uid,at_uid,type,content,timestamp from msg_group WHERE to_gid = ? GROUP BY timestamp DESC LIMIT ";
	sql += start;
	sql += ",";
	sql += count;
@ -22,5 +22,5 @@ function findMessage(groupId, start, count, handler) {
	});
}
exports.saveMessage = saveMessage;
exports.findMessage = findMessage;
exports.save = save;
exports.findByGroupId = findByGroupId;

+ 2 - 2
src/doctor/models/msg.notify.js

@ -7,7 +7,7 @@
var log = require('../util/log');
var imRepo = require("../repository/im.repo");
function saveNotifyMessage(to, contentType, title, content, message, has_pushed, handler) {
function save(to, contentType, title, content, message, has_pushed, handler) {
    imRepo.execQuery({
        "sql": "INSERT INTO push_notify (to_uid,type,title,content,data,has_pushed) VALUES (?,?,?,?,?,?)",
        "args": [to, contentType, title, content, message, has_pushed],
@ -15,4 +15,4 @@ function saveNotifyMessage(to, contentType, title, content, message, has_pushed,
    });
}
exports.saveNotifyMessage = saveNotifyMessage;
exports.save = save;

+ 5 - 5
src/doctor/models/msg.private.js

@ -2,16 +2,16 @@
var imRepo = require("../repository/im.repo");
function saveMessage(to, from, type, content, handler) {
function save(to, from, type, content, handler) {
	imRepo.execQuery({
		"sql": "INSERT INTO privates (to_uid,from_uid,type,content) VALUES (?,?,?,?)",
		"sql": "INSERT INTO msg_p2p (to_uid,from_uid,type,content) VALUES (?,?,?,?)",
		"args": [to, from, type, content],
		"handler": handler
	});
}
function findMessage(to, from, start, count, handler) {
	var sql = "SELECT id, to_uid, from_uid, type, content, timestamp from privates " +
	var sql = "SELECT id, to_uid, from_uid, type, content, timestamp from msg_p2p " +
        "WHERE (to_uid=? AND from_uid=?) OR (to_uid=? AND from_uid=?) AND id < ? GROUP BY timestamp DESC LIMIT ?";
	imRepo.execQuery({
@ -21,5 +21,5 @@ function findMessage(to, from, start, count, handler) {
	});
}
exports.save = saveMessage;
exports.findMessage = findMessage;
exports.save = save;
exports.findByGroupId = findMessage;

+ 1 - 1
src/doctor/models/msg.system.js

@ -5,7 +5,7 @@ var imRepo = require("../repository/im.repo");
function save(to, contentType, title, summary, content, handler) {
    imRepo.execQuery({
        "sql": "INSERT INTO system (to_uid,type,title,content,data) VALUES (?,?,?,?,?)",
        "sql": "INSERT INTO msg_system (to_uid,type,title,content,data) VALUES (?,?,?,?,?)",
        "args": [to, contentType, title, summary, content],
        "handler": handler
    });

+ 38 - 0
src/doctor/util/objectUtil.js

@ -9,4 +9,42 @@
 */
exports.isJsonObject = function(object){
    return {}.constructor === object.constructor;
};
/**
 * 检查对象是否具有指定的属性列表。
 *
 * @param arguments
 * @returns {{pass: boolean, message: string}}
 */
exports.fieldsCheck = function(){
    var ret = {pass: false, message: ''};
    if(arguments.length <= 1){
        ret.message = 'Function arguments not enough.';
        return ret;
    }
    var obj = arguments[0];
    if(!this.isJsonObject(obj)){
        ret.message = 'Function first argument must be a dict.';
        return ret;
    }
    ret.pass = true;
    ret.message = 'Missing field(s): ';
    for(var i = 1; i < arguments.length; ++i){
        if(!obj.hasOwnProperty(arguments[i])){
            ret.pass = false;
            ret.message += arguments[i];
            if(i !== arguments.length - 1){
                ret.message += ", ";
            }
        }
    }
    if(ret.pass) ret.message = null;
    return ret;
};

+ 77 - 24
test/doctor/endpoints/chats.endpoint.Test.js

@ -6,7 +6,13 @@ var APIv1 = require('../../../src/doctor/include/endpoints').APIv1;
var should = require("should");
var restTemplate = require('supertest').agent(testConfig.host);
var userId = '48832ecc339111e6badcfa163e789456';
var userId = '0de7295862dd11e69faffa163e8aee56';            //
var targetUserId = '37959ddf86f211e6b394fa163e424525';      //
var adminTeamId = 5;                                        // 行政团队ID: 黄庄家庭医生团队
var consultGroupId = 'bcfd47c57ea74ba19fa049222c76befd';    // 讨论组ID
var at = '';
describe('Chat api', function () {
    // 发送系统消息
@ -15,62 +21,109 @@ describe('Chat api', function () {
            var path = APIv1.Chats.Base + APIv1.Chats.SM;
            restTemplate.post(path)
                .send({
                        to: "Rose",
                        title: "System Message",
                        summary: "You have new job",
                        contentType: "1",
                        content: "The patient has been followed in the scheduler, please make new follow plan as soon as possible."
                    to: userId,
                    title: "系统消息",
                    summary: "您有一条新的工作记录",
                    contentType: "1",
                    content: "患者已经签约,可以制定随访计划。"
                })
                .end(function (err, response) {
                    if(response.status !== 200){
                        console.log(response.body);
                    }
                ).end(function (err, response) {
            });
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 发送私信
    describe('when send PRIVATE message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.PM;
    describe('when send SYSTEM message that user not exist', function () {
        it('should return 404', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.SM;
            restTemplate.post(path)
                .send({
                    to: "Rose",
                    to: "Rose Unknown",
                    title: "System Message",
                    summary: "You have new job",
                    contentType: "1",
                    content: "The patient has been followed in the scheduler, please make new follow plan as soon as possible."
                })
                .end(function (err, response) {
                    response.status.should.equal(404);
                    done();
                });
        });
    });
    // 发送群消息
    describe('when send PRIVATE message with bad message format', function () {
    // 发送私信
    describe('when send PRIVATE message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.PM;
            restTemplate.post(path)
                .send({
                    from: userId,
                    at: "Rose",
                    group: "DiscussionGroupId",
                    groupType: 1,
                    to: targetUserId,
                    contentType: 1,
                    content: "The patient mess me up"
                    content: "此患者白细胞如此高,中性粒值也高,同时感染细菌与病毒吗?"
                })
                .end(function (err, response) {
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 向行政团队发送群消息
    describe('when send GROUP of admin team message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.GM;
            restTemplate.post(path)
                .send({
                    from: userId,
                    at: "",
                    group: "DiscussionGroupId",
                    at: '',
                    group: adminTeamId,
                    groupType: 1,
                    contentType: 1,
                    content: "The patient mess me up"
                }).end(function (err, response) {
            });
                    content: "请问:居民签约人数是否达标"
                })
                .end(function (err, response) {
                    if(response.status !== 200){
                        console.log(response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });
    // 向讨论组发送群消息
    describe('when send GROUP of consult team message correctly', function () {
        it('should return 200', function (done) {
            var path = APIv1.Chats.Base + APIv1.Chats.GM;
            restTemplate.post(path)
                .send({
                    from: '0de705f962dd11e69faffa163e8aee56',
                    at: '794f637bd3c64b948b112f16911a7883',
                    group: consultGroupId,
                    groupType: 2,
                    contentType: 1,
                    content: "庄医生,患者体征数据是否正常?"
                })
                .end(function (err, response) {
                    if(response.status !== 200){
                        console.log(response.body);
                    }
                    response.status.should.equal(200);
                    done();
                });
        });
    });

+ 5 - 5
test/doctor/endpoints/users.endpoint.Test.js

@ -9,7 +9,7 @@ var server = require('supertest').agent(testConfig.host);
describe('User api', function () {
    describe('when login with correct params', function () {
        it('should return 200', function (done) {
            var path = APIv1.Users.Base + APIv1.Users.Login + "?user_id=sand&token=0PFWlKmLBN9YzhCfFWVgYA&client_id=H6FYbDejks6VjMmW3uH7V6&platform=0";
            var path = APIv1.Users.Base + APIv1.Users.Login + "?user_id=0de7295862dd11e69faffa163e8aee56&token=0PFWlKmLBN9YzhCfFWVgYA&client_id=H6FYbDejks6VjMmW3uH7V6&platform=0";
            server.get(path)
                .expect(200)
@ -28,7 +28,7 @@ describe('User api', function () {
    describe('when login without client_id', function () {
        it('should return 406', function (done) {
            var path = APIv1.Users.Base + APIv1.Users.Login + "?user_id=sand&token=0PFWlKmLBN9YzhCfFWVgYA&platform=0";
            var path = APIv1.Users.Base + APIv1.Users.Login + "?user_id=0de7295862dd11e69faffa163e8aee56&token=0PFWlKmLBN9YzhCfFWVgYA&platform=0";
            server.get(path)
                .expect(406, done);
@ -37,7 +37,7 @@ describe('User api', function () {
    describe('when login without token', function () {
        it('should return 406', function (done) {
            var path = APIv1.Users.Base + APIv1.Users.Login + "?user_id=sand&token=0PFWlKmLBN9YzhCfFWVgYA&platform=0";
            var path = APIv1.Users.Base + APIv1.Users.Login + "?user_id=0de7295862dd11e69faffa163e8aee56&token=0PFWlKmLBN9YzhCfFWVgYA&platform=0";
            server.get(path)
                .expect(406, done);
@ -55,7 +55,7 @@ describe('User api', function () {
    describe('when update user status', function () {
        it('should return 200', function (done) {
            var path = APIv1.Users.Base + "/sand/status";
            var path = APIv1.Users.Base + "/0de7295862dd11e69faffa163e8aee56/status";
            server.post(path)
                .set('Content-Type', 'application/json')
@ -67,7 +67,7 @@ describe('User api', function () {
    describe('when user logout', function () {
        it('should return 200', function (done) {
            var path = APIv1.Users.Base + APIv1.Users.Logout + "?user_id=sand";
            var path = APIv1.Users.Base + APIv1.Users.Logout + "?user_id=0de7295862dd11e69faffa163e8aee56";
            server.get(path)
                .expect(200, done);

+ 36 - 4
test/doctor/util/objectUtil.Test.js

@ -4,10 +4,10 @@ var objectUtil = require('../../../src/doctor/util/objectUtil');
var assert = require('assert');
describe('Object utilities', function(){
    describe('When test isJsonObject with "Array" object', function(){
        it('should return false', function(){
            assert.strictEqual(objectUtil.isJsonObject([1, 2]), false);
describe('Object utilities', function () {
    describe('When test isJsonObject with "Array" object', function () {
        it('should return false', function () {
            assert.strictEqual(objectUtil.isJsonObject([]), false);
        })
    });
@ -16,4 +16,36 @@ describe('Object utilities', function(){
            assert.strictEqual(objectUtil.isJsonObject({age: 2}), true);
        })
    });
    describe('When test fieldsCheck with full fields', function () {
        it('should return false and missing fields.', function () {
            var testing = objectUtil.fieldsCheck({
                    from: 'Sand',
                    to: 'Rose',
                    data: 'Hello world.'
                },
                'from',
                'to',
                'data');
            assert.strictEqual(true, testing.pass);
        });
    });
    describe('When test fieldsCheck with missing fields', function () {
        it('should return false and missing fields.', function () {
            var testing = objectUtil.fieldsCheck({
                    from: 'Sand',
                    to: 'Rose',
                    content: 'Hello world.'},
                'from',
                'to',
                'timestamp',
                'expire',
                'location');
            assert.strictEqual(false, testing.pass);
            assert.strictEqual(true, testing.message.indexOf('timestamp') > -1);
            assert.strictEqual(true, testing.message.indexOf('expire') > -1);
            assert.strictEqual(true, testing.message.indexOf('location') > -1);
        });
    });
});