1/* 2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import isPromiseLike from './isPromiseLike'; 17 18function assertPromiseIsRejectedWithError(actualPromise, expectedValue) { 19 if (!isPromiseLike(actualPromise)) { 20 return Promise.reject().then(function () { 21 }, function () { 22 return {pass: false, message: 'Expected not be called on a promise.'}; 23 }); 24 } 25 return actualPromise.then( 26 function (got) { 27 return { 28 pass: false, 29 message: 'Expected a promise to be rejected but actualValue is resolve' 30 }; 31 }, 32 function (actualValue) { 33 return matchError(actualValue, expectedValue); 34 } 35 ); 36 37} 38 39function matchError(actualValue, expectedValue) { 40 if (expectedValue.length == 1 && typeof expectedValue[0] === 'function') { 41 if (expectedValue[0].name === actualValue.__proto__.name) { 42 return {pass: true, message: 'actual error type is ' + actualValue.name + '.'}; 43 } 44 return {pass: false, message: `except error type is ${expectedValue[0].name},but actual is ${actualValue.name}.`}; 45 } 46 47 if (expectedValue.length == 1 && typeof expectedValue[0] === 'string') { 48 if (expectedValue[0] === actualValue.message) { 49 return {pass: true, message: `actual error message is ${actualValue.message}.`}; 50 } 51 return {pass: false, message: `except error message ${expectedValue[0]},but actual is ${actualValue.message}.`}; 52 } 53 54 if (expectedValue.length == 1) { 55 return {pass: false, message: 'When only one parameter, it should be error type or error message.'}; 56 } 57 58 if (expectedValue.length == 2 && typeof expectedValue[0] === 'function' && expectedValue[0].name === actualValue.name) { 59 if (typeof expectedValue[1] === 'string' && actualValue.message === expectedValue[1]) { 60 return {pass: true, message: 'actual error message is ' + actualValue.message + '.'}; 61 } 62 return {pass: false, message: `except error message is ${expectedValue[1]},but actual is ${actualValue.message}.`}; 63 } 64 65 if (expectedValue.length == 2 && typeof expectedValue[0] === 'function' && expectedValue[0].name !== actualValue.name) { 66 if (typeof expectedValue[1] === 'string' && actualValue.message === expectedValue[1]) { 67 return {pass: false, message: `except error type is ${expectedValue[0].name},but actual is ${actualValue.name}.`}; 68 } 69 return {pass: false, message: 'except error type and message are incorrect.'}; 70 } 71 if (expectedValue.length > 2) { 72 return {pass: false, message: 'Up to two parameters are supported.'}; 73 } 74 return {pass: true, message: 'not equal type'}; 75} 76 77export default assertPromiseIsRejectedWithError;