-
Notifications
You must be signed in to change notification settings - Fork 0
Test Case
The purpose of this wiki is to clarify the policy of test in order to make a test case.
We make the test case by following the steps below.
- Equivalence partitioning
- Boundary value analysis
- All-pairs testing (Pairwise testing)* * If the module to be tested has too many input combination.
This chapter lists the test case for each module(class and method).
| Class | Method | Test Case | Valid or Invalid | Implementation |
|---|---|---|---|---|
| GCS | constructor | Assumed valid parameter, Check instance variables | Valid | ✅ |
| GCS | getAccessToken | location has hash and access_token | Valid | ✅ |
| GCS | getAccessToken | location has hash but it does not have access_token | Valid | ✅ |
| GCS | getAccessToken | location does not have hash | Valid | ✅ |
| GCS | getAccessToken | location is an empty Object | Valid | ✅ |
| GCS | getAccessToken | Invalid argument is number | Invalid | ✅ |
| GCS | getAccessToken | Invalid argument is Boolean | Invalid | ✅ |
| GCS | getAccessToken | Invalid argument is null | Invalid | ✅ |
| GCS | getAccessToken | Invalid argument is undefined | Invalid | ✅ |
| GCS | getAccessToken | Invalid argument is BigInt | Invalid | ✅ |
| GCS | getAccessToken | Invalid argument is Symbol | Invalid | ✅ |
| GCS | getAccessToken | Invalid argument is String | Invalid | ✅ |
| GCS | setCred | Assumed valid parameter | Valid | ✅ |
| GCS | setCred | Invalid input parameter, params.clientId is number | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.clientId is Boolean | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.clientId is null | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.clientId is undefined | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.clientId is BigInt | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.clientId is Symbol | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.clientId is Object | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is number | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is Boolean | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is null | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is undefined | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is BigInt | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is Symbol | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is String(not URL) | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.redirectUrl is Object | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is number | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is Boolean | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is null | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is undefined | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is BigInt | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is Symbol | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is String(not scope URL) | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is String(not URL) | Invalid | ✅ |
| GCS | setCred | Invalid input parameter, params.scope is Object | Invalid | ✅ |
| GCS | uploadFile | All parameters are fine | Valid | ✅ |
| GCS | uploadFile | fetch is failed | Valid | ✅ |
| GCS | uploadFile | fetch result does not include mediaLink | Valid | ✅ |
| GCS | uploadFile | event.target.result is not set | Invalid | ✅ |
| GCS | uploadFile | event.target is not set | Invalid | ✅ |
| GCS | uploadFile | event is not set | Invalid | ✅ |
| GCS | uploadFile | this.bucketName is not set | Invalid | ✅ |
| GCS | uploadFile | this.file is not set | Invalid | ✅ |
| GCS | uploadFile | this.token is not set | Invalid | ✅ |
| GCS | uploadFile | fileName includes "&" | Invalid | ✅ |
| GCS | uploadFile | fileName includes "=" | Invalid | ✅ |
| GCS | uploadFile | fileName includes "?" | Invalid | ✅ |
| GCS | uploadFile | fileName includes "/" | Invalid | ✅ |
| GCS | uploadFiles | fileList(more than 2 files), bucketName are valid without accessToken | Valid | ✅ |
| GCS | uploadFiles | fileList(more than 2 files), bucketName and accessToken are valid | Valid | ✅ |
| GCS | uploadFiles | fileList(only one file), bucketName are valid without accessToken | Valid | ✅ |
| GCS | uploadFiles | fileList(only one file), bucketName and accessToken are valid | Valid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (number) | Invalid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (Boolean) | Invalid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (undefined) | Invalid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (String) | Invalid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (BigInt) | Invalid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (Symbol) | Invalid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (Object) | Invalid | ✅ |
| GCS | uploadFiles | The first argument is not FileList (File) | Invalid | ✅ |
| ToolKit | detectURL | http://localhost | Valid | ✅ |
| ToolKit | detectURL | http://localhost:3000 | Valid | ✅ |
| ToolKit | detectURL | http://localhost/hogehoge | Valid | ✅ |
| ToolKit | detectURL | http://localhost:3000/hogehoge | Valid | ✅ |
| ToolKit | detectURL | http://localhost/hogehoge/hoge | Valid | ✅ |
| ToolKit | detectURL | http://localhost:3000/hogehoge/hoge | Valid | ✅ |
| ToolKit | detectURL | https://hacknock.com | Valid | ✅ |
| ToolKit | detectURL | https://test.hacknock.com | Valid | ✅ |
| ToolKit | detectURL | https://leadyou.test.hacknock.com | Valid | ✅ |
| ToolKit | detectURL | https://hacknock.com/hoge/hogehoge | Valid | ✅ |
| ToolKit | detectURL | https://test.hacknock.com/hoge/hogehoge | Valid | ✅ |
| ToolKit | detectURL | https://leadyou.test.hacknock.com/hoge/hogehoge | Valid | ✅ |
| ToolKit | detectURL | http://localhos | Invalid | ✅ |
| ToolKit | detectURL | http://locahost:3000 | Invalid | ✅ |
| ToolKit | detectURL | http://lcalhost/hogehoge | Invalid | ✅ |
| ToolKit | detectURL | http://ocalhost:3000/hogehoge | Invalid | ✅ |
| ToolKit | detectURL | http://localhost3000 | Invalid | ✅ |
| ToolKit | detectURL | http://hacknock.com | Invalid | ✅ |
| ToolKit | detectURL | https://hacknock | Invalid | ✅ |
| ToolKit | detectURL | http://leadyou.test.hacknock.com | Invalid | ✅ |
| ToolKit | detectURL | http://hacknock.com/hoge | Invalid | ✅ |
| ToolKit | detectURL | http://test.hacknock.com/hoge | Invalid | ✅ |
| ToolKit | detectURL | http://leadyou.test.hacknock.com/hoge | Invalid | ✅ |
| ToolKit | detectURL | http://hacknock.com/hoge/hogehoge | Invalid | ✅ |
| ToolKit | detectURL | http://test.hacknock.com/hoge/hogehoge | Invalid | ✅ |
| ToolKit | detectURL | http://leadyou.test.hacknock.com/hoge/hogehoge | Invalid | ✅ |
Clam(params, name = "GCS");
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: string(URL)],
}
name = "GCS"
OUTPUT
return Object
ASSERTION
OUTPUT.name === "GCS"
typeof OUTPUT.getAuth === "function"
typeof OUTPUT.getAuthInfo === "function"
typeof OUTPUT.uploadFiles === "function"
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: string(URL)],
}
OUTPUT
return Object
ASSERTION
OUTPUT.name === "GCS"
typeof OUTPUT.getAuth === "function"
typeof OUTPUT.getAuthInfo === "function"
typeof OUTPUT.uploadFiles === "function"
No assumed 'name' value: number, Boolean, null, undefined, BigInt, String(not "GCS"), Symbol, Object
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: string(URL)],
}
name = [name: number, Boolean, null, undefined, BigInt, String(not "GCS"), Symbol, Object]
OUTPUT
throw Error("'name' value is invalid. You must input 'GCS'")
ASSERTION
toThrowError("'name' value is invalid. You must input 'GCS'")
INPUT
params = {
clientId: [client ID: number, Boolean, null, undefined, BigInt, Symbol, Object],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: string(URL)],
}
name = [name: string]
OUTPUT
throw Error("params.clientId is invalid. You must input string value.")
ASSERTION
toThrowError("params.clientId is invalid. You must input string value.")
No assumed params.redirectUrl value: number, Boolean, null, undefined, BigInt, String(not URL), Symbol, Object
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: number, Boolean, null, undefined, BigInt, String(not URL), Symbol, Object],
scope: [scope: string(URL)],
}
name = [name: string]
OUTPUT
throw Error("params.redirectUrl is invalid. You must input string value which is URL.")
ASSERTION
toThrowError("params.redirectUrl is invalid. You must input string value which is URL.")
No assumed params.scope value: number, Boolean, null, undefined, BigInt, String(not URL), Symbol, Object
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: number, Boolean, null, undefined, BigInt, String(not URL), Symbol, Object],
}
name = [name: string]
OUTPUT
throw Error("params.scope is invalid. You must input string value which is URL.")
ASSERTION
toThrowError("params.scope is invalid. You must input string value which is URL.")
setCred(params)
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: string(scope URL)*],
}
OUTPUT
return Object
ASSERTION
expect(OUTPUT.info).toBe(params);
expect(OUTPUT.accessToken).toBeNull();
Invalid input parameter, params.clientId is : number, Boolean, null, undefined, BigInt, Symbol, Object
INPUT
params = {
clientId: [client ID: number, Boolean, null, undefined, BigInt, Symbol, Object],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: string(scope URL)*],
}
OUTPUT
throw Error("params.clientId is invalid value. You must set String value.");
ASSERTION
.toThrow("params.clientId is invalid value. You must set String value.");
Invalid input parameter, params.redirect is : number, Boolean, null, undefined, BigInt, Symbol, String(not URL), Object
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: number, Boolean, null, undefined, BigInt, Symbol, String(not URL), Object],
scope: [scope: string(scope URL)*],
}
OUTPUT
throw Error("params.redirectUrl is invalid value. You must set string value which is an URL.");
ASSERTION
.rejects.toThrow("params.redirectUrl is invalid value. You must set string value which is an URL.");
Invalid input parameter, params.scope is : number, Boolean, null, undefined, BigInt, Symbol, String(not scope URL*, not URL), Object
INPUT
params = {
clientId: [client ID: string],
redirectUrl: [redirect URL: string(URL)],
scope: [scope: number, Boolean, null, undefined, BigInt, Symbol, String(not scope URL, not URL), Object],
}
OUTPUT
throw Error("params.scope is invalid value. You must set string value which is a URL in scopes. A list of scopes is in https://cloud.google.com/storage/docs/authentication .");
ASSERTION
.rejects.toThrow("params.scope is invalid value. You must set string value which is a URL in scopes. A list of scopes is in https://cloud.google.com/storage/docs/authentication .");
INPUT
const url = "http://localhost";
const dummyToken = crypto
.randomBytes(160)
.toString("hex")
.substring(0, 160);
const dummyJoint = crypto.randomBytes(4).toString("hex").substring(0, 4);
Object.defineProperty(window, "location", {
value: {
href: `${url}/#state=pass-through%20value&access_token=${dummyJoint}.${dummyToken}&token_type=Bearer&expires_in=1000&scope=https://www.googleapis.com/auth/devstorage.read_only`,
hash: `#state=pass-through%20value&access_token=${dummyJoint}.${dummyToken}&token_type=Bearer&expires_in=1000&scope=https://www.googleapis.com/auth/devstorage.read_only`,
configurable: true,
},
});
OUTPUT
return { token: `${dummyJoint}.${dummyToken}` }
ASSERTION
.toStrictEqual({ token: `${dummyJoint}.${dummyToken}` })
INPUT
const url = "http://localhost";
Object.defineProperty(window, "location", {
value: {
href: `${url}/#state=pass-through%20value`,
hash: "#state=pass-through%20value",
configurable: true,
},
});
OUTPUT
return {
token: null,
message: "This location has no access token info.",
}
ASSERTION
.toStrictEqual({
token: null,
message: "This location has no access token info.",
});
INPUT
const url = "http://localhost";
Object.defineProperty(window, "location", {
value: {
href: url,
configurable: true,
},
});
OUTPUT
return {
token: null,
message: "This location has no access token info.",
}
ASSERTION
.toStrictEqual({
token: null,
message: "This location has no access token info.",
});
INPUT
delete window.location.href;
delete window.location.hash;
delete window.location.token;
delete window.location.configurable;
OUTPUT
return {
token: null,
message: "This location has no access token info.",
}
ASSERTION
.toStrictEqual({
token: null,
message: "This location has no access token info.",
});
INPUT
const argument = [number, Boolean, null, undefined, String, BigInt, Symbol]
OUTPUT
throw Error("You must input location which is Object.");
ASSERTION
.toThrow(/^You must input location which is Object.$/);
INPUT
const argument = null
OUTPUT
throw Error(
"The argument is null.You must input location which is Object, not null."
);
ASSERTION
.toThrow(
/^The argument is null.You must input location which is Object, not null.$/
);
INPUT
- Argument
- event
- event.target.result = "hogehoge"
- event
- Bind
- bucketName: bucketName = "hogehoge"
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function without error.
ASSERTION
callback: (err, fileName) => {
expect(err).toBeNull();
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Argument
- event
- event.target.result = "hogehoge"
- event
- Bind
- bucketName: bucketName = "hogehoge"
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function with error. Error message is "404 Error occurred by fetch."
ASSERTION
callback: (err, fileName) => {
expect(err).toBe("404 Error occurred by fetch.");
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Argument
- event
- event.target.result = "hogehoge"
- event
- Bind
- bucketName: bucketName = "hogehoge"
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function with error. Error message is "No mediaLink"
ASSERTION
callback: (err, fileName) => {
expect(err).toBe("No mediaLink");
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Argument
- event.target = "hogehoge"
- Bind
- bucketName: bucketName = "hogehoge"
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function with error. Error message is "The argument is empty or the event does not include 'event.target.result.'"
ASSERTION
callback: (err, fileName) => {
expect(err).toBe(
"The argument is empty or the event does not include 'event.target.result.'"
);
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Argument
- event = "hogehoge"
- Bind
- bucketName: bucketName = "hogehoge"
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function with error. Error message is "The argument is empty or the event does not include 'event.target.result.'"
ASSERTION
callback: (err, fileName) => {
expect(err).toBe(
"The argument is empty or the event does not include 'event.target.result.'"
);
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Bind
- bucketName: bucketName = "hogehoge"
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function with error. Error message is "The argument is empty or the event does not include 'event.target.result.'"
ASSERTION
callback: (err, fileName) => {
expect(err).toBe(
"The argument is empty or the event does not include 'event.target.result.'"
);
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Argument
- event
- event.target.result = "hogehoge"
- event
- Bind
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
- file: file =
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function output an error which is "bucketName is not binded. Please set bucketName.".
ASSERTION
callback: (err, fileName) => {
expect(err).toBe("bucketName is not binded. Please set bucketName.");
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Argument
- event
- event.target.result = "hogehoge"
- event
- Bind
- bucketName: bucketName = "hogehoge"
- token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function output error. "file is not set. Please bind file."
ASSERTION
callback: (err, fileName) => {
expect(err).toBe("file is not set. Please bind file.");
expect(fileName).toBeNull();
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
- Argument
- event
- event.target.result = "hogehoge"
- event
- Bind
- bucketName: bucketName = "hogehoge"
- file: file =
new File(["foo"], "foo.txt", {type: "text/plain"}); - token: "j30f23jf023f"
- callback:
(err, fileName) => {
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
}
OUTPUT
callback function throws error. "token is not set. Please bind token"
ASSERTION
callback: (err, fileName) => {
expect(err).toBe("token is not set. Please bind token");
expect(fileName).toBe("foo.txt");
if (err) {
console.error("failure: " + fileName);
console.error(err);
} else {
console.log("success: " + fileName);
}
},
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION
INPUT
OUTPUT
ASSERTION