From 6ccef8f62b1d505d9fab068c4308173ed424e1be Mon Sep 17 00:00:00 2001 From: tunny17 Date: Tue, 10 Oct 2023 06:09:39 +0000 Subject: [PATCH] CLASSROOMIO-T-200: Exercise Template for NodeJs Merge branch 'main' into CLASSROOMIO-T-200 CLASSROOMIO-T-200: Exercise Template for NodeJs Co-authored-by: Tunji Adeyemi Merge-request: CLASSROOMIO-MR-95 Merged-by: Best Admin --- src/lib/mocks/index.ts | 7 +- src/lib/mocks/node/001_node_module.ts | 128 +++++++++++ src/lib/mocks/node/002_node_httpModule.ts | 123 ++++++++++ src/lib/mocks/node/003_node_fileSystem.ts | 124 ++++++++++ src/lib/mocks/node/004_node_urlModule.ts | 203 +++++++++++++++++ src/lib/mocks/node/005_node_npm.ts | 212 ++++++++++++++++++ src/lib/mocks/node/006_node_events.ts | 212 ++++++++++++++++++ src/lib/mocks/node/007_node_uploadFiles.ts | 212 ++++++++++++++++++ src/lib/mocks/node/008_node_email.ts | 212 ++++++++++++++++++ src/lib/mocks/node/009_node_sqlDatabase.ts | 212 ++++++++++++++++++ src/lib/mocks/node/010_node_sqlCreateTable.ts | 212 ++++++++++++++++++ src/lib/mocks/node/011_node_sqlInsertInto.ts | 212 ++++++++++++++++++ src/lib/mocks/node/012_node_sqlSelectForm.ts | 212 ++++++++++++++++++ src/lib/mocks/node/013_node_sqlWhere.ts | 212 ++++++++++++++++++ src/lib/mocks/node/014_node_sqlOrderBy.ts | 212 ++++++++++++++++++ src/lib/mocks/node/015_node_sqlDelete.ts | 199 ++++++++++++++++ src/lib/mocks/node/016_node_sqlDropTable.ts | 195 ++++++++++++++++ src/lib/mocks/node/017_node_sqlUpdate.ts | 182 +++++++++++++++ src/lib/mocks/node/018_node_sqlLimit.ts | 182 +++++++++++++++ src/lib/mocks/node/019_node_sqlJoin.ts | 202 +++++++++++++++++ .../mocks/node/020_node_mongodbDatabase.ts | 202 +++++++++++++++++ src/lib/mocks/node/index.ts | 67 ++++++ 22 files changed, 3932 insertions(+), 2 deletions(-) create mode 100644 src/lib/mocks/node/001_node_module.ts create mode 100644 src/lib/mocks/node/002_node_httpModule.ts create mode 100644 src/lib/mocks/node/003_node_fileSystem.ts create mode 100644 src/lib/mocks/node/004_node_urlModule.ts create mode 100644 src/lib/mocks/node/005_node_npm.ts create mode 100644 src/lib/mocks/node/006_node_events.ts create mode 100644 src/lib/mocks/node/007_node_uploadFiles.ts create mode 100644 src/lib/mocks/node/008_node_email.ts create mode 100644 src/lib/mocks/node/009_node_sqlDatabase.ts create mode 100644 src/lib/mocks/node/010_node_sqlCreateTable.ts create mode 100644 src/lib/mocks/node/011_node_sqlInsertInto.ts create mode 100644 src/lib/mocks/node/012_node_sqlSelectForm.ts create mode 100644 src/lib/mocks/node/013_node_sqlWhere.ts create mode 100644 src/lib/mocks/node/014_node_sqlOrderBy.ts create mode 100644 src/lib/mocks/node/015_node_sqlDelete.ts create mode 100644 src/lib/mocks/node/016_node_sqlDropTable.ts create mode 100644 src/lib/mocks/node/017_node_sqlUpdate.ts create mode 100644 src/lib/mocks/node/018_node_sqlLimit.ts create mode 100644 src/lib/mocks/node/019_node_sqlJoin.ts create mode 100644 src/lib/mocks/node/020_node_mongodbDatabase.ts create mode 100644 src/lib/mocks/node/index.ts diff --git a/src/lib/mocks/index.ts b/src/lib/mocks/index.ts index bb6d4f6f..007c8178 100644 --- a/src/lib/mocks/index.ts +++ b/src/lib/mocks/index.ts @@ -3,6 +3,7 @@ import { CSS_IDS, CSS_TEMPLATES } from './css'; import { calculateTotalPoints, shuffleOptions } from './utils'; import type { ExerciseTemplate } from '$lib/utils/types'; import { JS_IDS, JS_TEMPLATES } from './js'; +import { NODE_IDS, NODE_TEMPLATES } from './node'; import { REACT_IDS, REACT_TEMPLATES } from './react'; import { TS_IDS, TS_TEMPLATES } from './typescript'; @@ -12,7 +13,8 @@ export const TAGS = { JS: 'JS', Typescript: 'Typescript', ReactJS: 'ReactJS', - VueJS: 'VueJS' + VueJS: 'VueJS', + NodeJS: 'NodeJS' }; function generateTemplateForTag( @@ -47,5 +49,6 @@ export const TEMPLATES = { [TAGS.JS]: generateTemplateForTag(JS_IDS, JS_TEMPLATES), [TAGS.Typescript]: generateTemplateForTag(TS_IDS, TS_TEMPLATES), [TAGS.ReactJS]: generateTemplateForTag(REACT_IDS, REACT_TEMPLATES), - [TAGS.VueJS]: [] + [TAGS.VueJS]: [], + [TAGS.NodeJS]: generateTemplateForTag(NODE_IDS, NODE_TEMPLATES) }; diff --git a/src/lib/mocks/node/001_node_module.ts b/src/lib/mocks/node/001_node_module.ts new file mode 100644 index 00000000..71f9d087 --- /dev/null +++ b/src/lib/mocks/node/001_node_module.ts @@ -0,0 +1,128 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js Modules Quiz', + description: 'Test your knowledge of Node.js modules from W3Schools', + questionnaire: { + questions: [ + { + title: 'What is a Node.js module?', + name: 'q1', + points: 2, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'A JavaScript file', is_correct: true }, + { label: 'A Node.js package', is_correct: false }, + { label: 'A built-in Node.js function', is_correct: false }, + ], + }, + { + title: 'How do you include a module in Node.js?', + name: 'q2', + points: 2, + order: 2, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'require(\'module_name\')', is_correct: true }, + { label: 'import module_name from \'module\'', is_correct: false }, + { label: 'import \'module_name\'', is_correct: false }, + ], + }, + { + title: 'Which of the following is a built-in Node.js module?', + name: 'q3', + points: 2, + order: 3, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { label: 'fs', is_correct: true }, + { label: 'http', is_correct: true }, + { label: 'express', is_correct: false }, + { label: 'path', is_correct: true }, + ], + }, + { + title: 'How do you export a module in Node.js?', + name: 'q4', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'module.exports', is_correct: true }, + { label: 'export default', is_correct: false }, + { label: 'exports', is_correct: false }, + ], + }, + { + title: 'What is the purpose of the "exports" object in a Node.js module?', + name: 'q5', + points: 2, + order: 5, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which of the following is a valid way to create a readable stream in Node.js?', + name: 'q6', + points: 2, + order: 6, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'fs.createWriteStream()', is_correct: false }, + { label: 'fs.createReadStream()', is_correct: true }, + { label: 'fs.readFile()', is_correct: false }, + ], + }, + { + title: 'What is the purpose of the "events" module in Node.js?', + name: 'q7', + points: 2, + order: 7, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which method is used to handle HTTP POST requests in Node.js?', + name: 'q8', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'HTTP POST requests are handled automatically', is_correct: false }, + { label: 'http.createServer()', is_correct: false }, + { label: 'req.on("data")', is_correct: false }, + { label: 'req.on("end")', is_correct: true }, + ], + }, + { + title: 'In Node.js, what does the "path" module provide?', + name: 'q9', + points: 2, + order: 9, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { label: 'File system operations', is_correct: true }, + { label: 'URL parsing', is_correct: true }, + { label: 'Event handling', is_correct: false }, + ], + }, + { + title: 'How do you import a local module in Node.js?', + name: 'q10', + points: 2, + order: 10, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'require(\'./module_name\')', is_correct: true }, + { label: 'import module_name from \'module_name\'', is_correct: false }, + { label: 'import \'./module_name\'', is_correct: false }, + ], + }, + ], + }, +}; + +export default template; diff --git a/src/lib/mocks/node/002_node_httpModule.ts b/src/lib/mocks/node/002_node_httpModule.ts new file mode 100644 index 00000000..ad13ff96 --- /dev/null +++ b/src/lib/mocks/node/002_node_httpModule.ts @@ -0,0 +1,123 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js HTTP Quiz', + description: 'Test your knowledge of Node.js HTTP module from W3Schools', + questionnaire: { + questions: [ + { + title: 'What is the primary use of the Node.js HTTP module?', + name: 'q1', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'Handling HTTP requests and responses', is_correct: true }, + { label: 'Creating file streams', is_correct: false }, + { label: 'Database operations', is_correct: false }, + ], + }, + { + title: 'Which HTTP method is used to request data from a server?', + name: 'q2', + points: 1, + order: 2, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'POST', is_correct: false }, + { label: 'GET', is_correct: true }, + { label: 'PUT', is_correct: false }, + ], + }, + { + title: 'What does the HTTP response status code 404 indicate?', + name: 'q3', + points: 1, + order: 3, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'OK', is_correct: false }, + { label: 'Not Found', is_correct: true }, + { label: 'Server Error', is_correct: false }, + ], + }, + { + title: 'Which of the following is a valid HTTP request header?', + name: 'q4', + points: 1, + order: 4, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { label: 'Content-Type', is_correct: true }, + { label: 'Authorization', is_correct: true }, + { label: 'User-Agent', is_correct: false }, + { label: 'Cache-Control', is_correct: true }, + ], + }, + { + title: 'Explain the purpose of a query string in a URL.', + name: 'q5', + points: 2, + order: 5, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'What is the purpose of the "http" module in Node.js?', + name: 'q6', + points: 2, + order: 6, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which method in the "http" module is used to create an HTTP server?', + name: 'q7', + points: 2, + order: 7, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'http.createServer()', is_correct: true }, + { label: 'http.request()', is_correct: false }, + { label: 'http.listen()', is_correct: false }, + ], + }, + { + title: 'What is the purpose of the "request" and "response" objects in an HTTP server callback?', + name: 'q8', + points: 2, + order: 8, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which HTTP method is used to send data to the server for processing?', + name: 'q9', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'POST', is_correct: true }, + { label: 'GET', is_correct: false }, + { label: 'PUT', is_correct: false }, + ], + }, + { + title: 'What is the purpose of the "querystring" module in Node.js?', + name: 'q10', + points: 2, + order: 10, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { label: 'Parsing and formatting URL query strings', is_correct: true }, + { label: 'Handling HTTP headers', is_correct: false }, + { label: 'Creating HTML templates', is_correct: false }, + ], + }, + ], + }, +}; + +export default template; diff --git a/src/lib/mocks/node/003_node_fileSystem.ts b/src/lib/mocks/node/003_node_fileSystem.ts new file mode 100644 index 00000000..b4639c18 --- /dev/null +++ b/src/lib/mocks/node/003_node_fileSystem.ts @@ -0,0 +1,124 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js File System Quiz', + description: 'Test your knowledge of Node.js File System module from W3Schools', + questionnaire: { + questions: [ + { + title: 'What is the primary use of the Node.js File System module?', + name: 'q1', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'Handling file operations', is_correct: true }, + { label: 'Database operations', is_correct: false }, + { label: 'Network communication', is_correct: false }, + ], + }, + { + title: 'Which method is used to read the contents of a file in Node.js?', + name: 'q2', + points: 1, + order: 2, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'fs.read()', is_correct: false }, + { label: 'fs.readFile()', is_correct: true }, + { label: 'fs.write()', is_correct: false }, + ], + }, + { + title: 'What is the purpose of the "fs.promises" API in Node.js File System?', + name: 'q3', + points: 1, + order: 3, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'Handling synchronous file operations', is_correct: false }, + { label: 'Handling asynchronous file operations with promises', is_correct: true }, + { label: 'Handling network requests', is_correct: false }, + ], + }, + { + title: 'Which of the following is a valid way to create a new file using the File System module?', + name: 'q4', + points: 1, + order: 4, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { label: 'fs.createFile()', is_correct: true }, + { label: 'fs.writeFile()', is_correct: true }, + { label: 'fs.newFile()', is_correct: false }, + { label: 'fs.appendFile()', is_correct: false }, + ], + }, + { + title: 'Explain the difference between synchronous and asynchronous file operations in Node.js.', + name: 'q5', + points: 2, + order: 5, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you check if a file exists using the File System module in Node.js?', + name: 'q6', + points: 2, + order: 6, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'fs.exists()', is_correct: false }, + { label: 'fs.access()', is_correct: true }, + { label: 'fs.checkFile()', is_correct: false }, + ], + }, + { + title: 'Which method is used to delete a file in Node.js using the File System module?', + name: 'q7', + points: 2, + order: 7, + question_type: QuestionTypes[0], // RADIO + options: [ + { label: 'fs.remove()', is_correct: false }, + { label: 'fs.deleteFile()', is_correct: false }, + { label: 'fs.unlink()', is_correct: true }, + ], + }, + { + title: 'What is the purpose of the "fs.createReadStream()" method in Node.js?', + name: 'q8', + points: 2, + order: 8, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which of the following is a valid use case for the File System module in Node.js?', + name: 'q9', + points: 2, + order: 9, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { label: 'Reading and writing configuration files', is_correct: true }, + { label: 'Creating a web server', is_correct: false }, + { label: 'Sending emails', is_correct: false }, + { label: 'Database operations', is_correct: false }, + ], + }, + { + title: 'Explain the difference between "fs.readFile()" and "fs.readFileSync()" in Node.js.', + name: 'q10', + points: 2, + order: 10, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + ], + }, +}; + +export default template; diff --git a/src/lib/mocks/node/004_node_urlModule.ts b/src/lib/mocks/node/004_node_urlModule.ts new file mode 100644 index 00000000..3b271d1b --- /dev/null +++ b/src/lib/mocks/node/004_node_urlModule.ts @@ -0,0 +1,203 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js URL Handling Quiz', + description: 'Test your knowledge of Node.js URL handling.', + questionnaire: { + questions: [ + { + title: 'What is the primary purpose of the "url" module in Node.js?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To parse and manipulate URLs.', + is_correct: true, + }, + { + label: 'To make HTTP requests.', + is_correct: false, + }, + { + label: 'To create dynamic web pages.', + is_correct: false, + }, + ], + }, + { + title: 'Which method is used to parse a URL string in Node.js?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'parseURL()', + is_correct: false, + }, + { + label: 'url.parse()', + is_correct: true, + }, + { + label: 'decodeURI()', + is_correct: false, + }, + ], + }, + { + title: 'What information can you extract from a parsed URL object in Node.js?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Host and port', + is_correct: true, + }, + { + label: 'Query parameters', + is_correct: true, + }, + { + label: 'HTTP request method', + is_correct: false, + }, + ], + }, + { + title: 'Explain the difference between "pathname" and "path" in a URL object.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you create a URL object in Node.js?', + name: 'question5', + points: 1, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Using the "url.create()" method.', + is_correct: false, + }, + { + label: 'By directly instantiating the URL class.', + is_correct: false, + }, + { + label: 'Using the "url.parse()" method.', + is_correct: false, + }, + { + label: 'By importing it from the "url" module.', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "querystring" module in Node.js URL handling?', + name: 'question6', + points: 2, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To parse and manipulate query strings in URLs.', + is_correct: true, + }, + { + label: 'To create new URLs from scratch.', + is_correct: false, + }, + { + label: 'To perform HTTP requests.', + is_correct: false, + }, + ], + }, + { + title: 'How can you extract query parameters from a URL in Node.js using the "querystring" module?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Using the "parse()" method of the "querystring" module.', + is_correct: true, + }, + { + label: 'Accessing the "query" property of the URL object.', + is_correct: false, + }, + { + label: 'By splitting the URL string using a delimiter.', + is_correct: false, + }, + ], + }, + { + title: 'What does the "format()" method of the URL object in Node.js do?', + name: 'question8', + points: 2, + order: 7, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'It serializes a URL object back to a URL string.', + is_correct: true, + }, + { + label: 'It decodes a URL string.', + is_correct: false, + }, + { + label: 'It parses a query string into an object.', + is_correct: false, + }, + ], + }, + { + title: 'In Node.js, which module is commonly used for making HTTP requests?', + name: 'question9', + points: 1, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'fs', + is_correct: false, + }, + { + label: 'http', + is_correct: true, + }, + { + label: 'url', + is_correct: false, + }, + ], + }, + { + title: 'How can you include the "http" module in your Node.js application?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + + ], + }, +}; + +export default template; diff --git a/src/lib/mocks/node/005_node_npm.ts b/src/lib/mocks/node/005_node_npm.ts new file mode 100644 index 00000000..7710ee4d --- /dev/null +++ b/src/lib/mocks/node/005_node_npm.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js NPM Quiz', + description: 'Test your knowledge of Node.js and NPM (Node Package Manager).', + questionnaire: { + questions: [ + { + title: 'What is NPM?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Node Project Manager', + is_correct: false, + }, + { + label: 'Node Package Manager', + is_correct: true, + }, + { + label: 'Node Module Processor', + is_correct: false, + }, + ], + }, + { + title: 'How do you initialize a new Node.js project with NPM?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'npm create-project', + is_correct: false, + }, + { + label: 'npm init', + is_correct: true, + }, + { + label: 'npm start-project', + is_correct: false, + }, + ], + }, + { + title: 'What command is used to install a package locally using NPM?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'npm install', + is_correct: true, + }, + { + label: 'npm add', + is_correct: false, + }, + { + label: 'npm get', + is_correct: false, + }, + ], + }, + { + title: 'Explain the purpose of the "package.json" file in a Node.js project.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How do you update a global NPM package to the latest version?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'npm update -g package-name', + is_correct: true, + }, + { + label: 'npm upgrade package-name', + is_correct: false, + }, + { + label: 'npm install -g package-name', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "npm start" command?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'It starts the development server.', + is_correct: true, + }, + { + label: 'It installs all project dependencies.', + is_correct: false, + }, + { + label: 'It updates NPM to the latest version.', + is_correct: false, + }, + ], + }, + { + title: 'How do you remove a package from your Node.js project using NPM?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'npm remove package-name', + is_correct: true, + }, + { + label: 'npm uninstall package-name', + is_correct: true, + }, + { + label: 'npm delete package-name', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of "npm install --save"?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To install a package globally.', + is_correct: false, + }, + { + label: 'To install a package and add it to the dependencies in package.json.', + is_correct: true, + }, + { + label: 'To uninstall a package.', + is_correct: false, + }, + ], + }, + { + title: 'How can you view a list of globally installed NPM packages?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'npm list -g', + is_correct: true, + }, + { + label: 'npm global list', + is_correct: false, + }, + { + label: 'npm show -g', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "npm audit" command?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To perform security audits on your project dependencies.', + is_correct: true, + }, + { + label: 'To check the version of NPM installed globally.', + is_correct: false, + }, + { + label: 'To start a new NPM project.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/006_node_events.ts b/src/lib/mocks/node/006_node_events.ts new file mode 100644 index 00000000..39b11c8a --- /dev/null +++ b/src/lib/mocks/node/006_node_events.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js Events Quiz', + description: 'Test your knowledge of Node.js events and event handling.', + questionnaire: { + questions: [ + { + title: 'What are events in Node.js?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Functions that are triggered when an HTTP request is received.', + is_correct: false, + }, + { + label: 'Actions or occurrences that can be detected and responded to in Node.js.', + is_correct: true, + }, + { + label: 'External JavaScript libraries for handling animations.', + is_correct: false, + }, + ], + }, + { + title: 'How do you create a custom event emitter in Node.js?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By instantiating the "EventEmitter" class.', + is_correct: true, + }, + { + label: 'By using the "event.create()" function.', + is_correct: false, + }, + { + label: 'By defining a new function.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "on" method in the EventEmitter class?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To add a listener for a specific event.', + is_correct: true, + }, + { + label: 'To emit an event.', + is_correct: false, + }, + { + label: 'To remove a listener for an event.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the difference between "addListener" and "on" methods in the EventEmitter class.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you remove an event listener in Node.js?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Using the "removeListener" method.', + is_correct: true, + }, + { + label: 'By setting the listener to "null".', + is_correct: false, + }, + { + label: 'By calling the "off" method.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "once" method in the EventEmitter class?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To add a one-time listener for an event.', + is_correct: true, + }, + { + label: 'To emit an event multiple times.', + is_correct: false, + }, + { + label: 'To remove a listener for an event.', + is_correct: false, + }, + ], + }, + { + title: 'How do you emit an event in Node.js?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Using the "event.emit()" method.', + is_correct: true, + }, + { + label: 'By calling the event as a function.', + is_correct: false, + }, + { + label: 'Using the "event.trigger()" method.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "removeAllListeners" method?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To remove all listeners for a specific event.', + is_correct: true, + }, + { + label: 'To remove all listeners for all events.', + is_correct: true, + }, + { + label: 'To add listeners for all events.', + is_correct: false, + }, + ], + }, + { + title: 'How can you use the "EventEmitter" class to implement a custom event in your Node.js application?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By importing the "event" module.', + is_correct: false, + }, + { + label: 'By extending the "EventEmitter" class.', + is_correct: true, + }, + { + label: 'By using the "EventEmitter.create()" method.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "error" event in Node.js?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To handle errors that occur in asynchronous operations.', + is_correct: true, + }, + { + label: 'To emit errors in the application.', + is_correct: false, + }, + { + label: 'To trigger HTTP requests.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/007_node_uploadFiles.ts b/src/lib/mocks/node/007_node_uploadFiles.ts new file mode 100644 index 00000000..e47ac599 --- /dev/null +++ b/src/lib/mocks/node/007_node_uploadFiles.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js File Upload Quiz', + description: 'Test your knowledge of uploading files in Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of file uploading in Node.js applications?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To download files from the internet.', + is_correct: false, + }, + { + label: 'To allow users to upload files to the server.', + is_correct: true, + }, + { + label: 'To generate random files on the server.', + is_correct: false, + }, + ], + }, + { + title: 'Which module in Node.js is commonly used for handling file uploads?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'fs', + is_correct: false, + }, + { + label: 'http', + is_correct: false, + }, + { + label: 'express', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "multer" middleware in Express.js?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To handle file uploads in a convenient way.', + is_correct: true, + }, + { + label: 'To serve static files from a directory.', + is_correct: false, + }, + { + label: 'To create and manipulate files on the server.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the difference between synchronous and asynchronous file uploads.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you restrict the types of files that users can upload in an Express.js application?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using the "fileType" option in Multer.', + is_correct: true, + }, + { + label: 'By disabling file uploads altogether.', + is_correct: false, + }, + { + label: 'By configuring the Express.js routes.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "single" method in Multer?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To handle multiple file uploads at once.', + is_correct: false, + }, + { + label: 'To handle a single file upload.', + is_correct: true, + }, + { + label: 'To handle text input fields.', + is_correct: false, + }, + ], + }, + { + title: 'How do you access the uploaded file in your Express.js route handler?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'By using the "req.files" object provided by Multer.', + is_correct: true, + }, + { + label: 'By using the "req.body" object.', + is_correct: false, + }, + { + label: 'By sending a separate HTTP request to retrieve it.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "destination" option in Multer?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To specify the folder where uploaded files will be saved.', + is_correct: true, + }, + { + label: 'To limit the maximum file size of uploads.', + is_correct: false, + }, + { + label: 'To define custom validation rules for uploaded files.', + is_correct: false, + }, + ], + }, + { + title: 'How can you handle errors during file uploads in an Express.js route?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using try-catch blocks.', + is_correct: false, + }, + { + label: 'By passing an error-handling middleware to the route.', + is_correct: true, + }, + { + label: 'By ignoring errors and continuing the upload process.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "file.fieldname" property in the uploaded file object?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To identify the original field name of the file input.', + is_correct: true, + }, + { + label: 'To store the binary content of the uploaded file.', + is_correct: false, + }, + { + label: 'To specify the destination folder for file storage.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/008_node_email.ts b/src/lib/mocks/node/008_node_email.ts new file mode 100644 index 00000000..d162d35f --- /dev/null +++ b/src/lib/mocks/node/008_node_email.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js Email Handling Quiz', + description: 'Test your knowledge of sending emails in Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of sending emails in Node.js applications?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To print messages on the server console.', + is_correct: false, + }, + { + label: 'To send notifications and messages to users via email.', + is_correct: true, + }, + { + label: 'To create HTML documents for the web.', + is_correct: false, + }, + ], + }, + { + title: 'Which Node.js module is commonly used for sending emails?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'fs', + is_correct: false, + }, + { + label: 'http', + is_correct: false, + }, + { + label: 'nodemailer', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "nodemailer" module in Node.js?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To handle email sending and transport in Node.js.', + is_correct: true, + }, + { + label: 'To create web servers in Node.js.', + is_correct: false, + }, + { + label: 'To manage databases in Node.js applications.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the difference between SMTP and POP3 in email handling.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you configure nodemailer to send emails using a Gmail account?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By specifying the SMTP server and credentials.', + is_correct: true, + }, + { + label: 'By using the default settings without any configuration.', + is_correct: false, + }, + { + label: 'By installing additional plugins for nodemailer.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "transporter" object in nodemailer?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To receive incoming emails.', + is_correct: false, + }, + { + label: 'To configure email transport options.', + is_correct: true, + }, + { + label: 'To send HTTP requests.', + is_correct: false, + }, + ], + }, + { + title: 'How do you send an email using nodemailer in Node.js?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'By calling the "sendmail" function.', + is_correct: true, + }, + { + label: 'By using the "transporter.sendMail()" method.', + is_correct: true, + }, + { + label: 'By making a POST request to an email API.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "attachments" option when sending emails with nodemailer?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To specify the recipient of the email.', + is_correct: false, + }, + { + label: 'To include file attachments in the email.', + is_correct: true, + }, + { + label: 'To set the email subject.', + is_correct: false, + }, + ], + }, + { + title: 'How can you handle errors when sending emails with nodemailer?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using try-catch blocks.', + is_correct: false, + }, + { + label: 'By providing a callback function to the "sendMail" method.', + is_correct: true, + }, + { + label: 'By configuring nodemailer to automatically retry sending.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "from" field when sending emails with nodemailer?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To specify the recipient of the email.', + is_correct: false, + }, + { + label: 'To set the email sender\'s address.', + is_correct: true, + }, + { + label: 'To include file attachments in the email.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/009_node_sqlDatabase.ts b/src/lib/mocks/node/009_node_sqlDatabase.ts new file mode 100644 index 00000000..0ee32902 --- /dev/null +++ b/src/lib/mocks/node/009_node_sqlDatabase.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL Database Creation Quiz', + description: 'Test your knowledge of creating MySQL databases in Node.js.', + questionnaire: { + questions: [ + { + title: 'Why would you use a MySQL database in a Node.js application?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To store and manage data for the application.', + is_correct: true, + }, + { + label: 'To display images on the website.', + is_correct: false, + }, + { + label: 'To create interactive user interfaces.', + is_correct: false, + }, + ], + }, + { + title: 'Which Node.js module is commonly used to interact with MySQL databases?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'fs', + is_correct: false, + }, + { + label: 'http', + is_correct: false, + }, + { + label: 'mysql', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "mysql.createConnection" method in the mysql module?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To establish a connection to a MySQL database server.', + is_correct: true, + }, + { + label: 'To create a new database.', + is_correct: false, + }, + { + label: 'To define a route in an Express.js application.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the purpose of the "query" method in the mysql module.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you handle errors when connecting to a MySQL database in Node.js?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using try-catch blocks.', + is_correct: false, + }, + { + label: 'By providing a callback function to the connection method.', + is_correct: true, + }, + { + label: 'By ignoring errors and proceeding with the connection.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "CREATE DATABASE" SQL statement?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To insert data into a database.', + is_correct: false, + }, + { + label: 'To create a new MySQL database.', + is_correct: true, + }, + { + label: 'To update existing records in a database.', + is_correct: false, + }, + ], + }, + { + title: 'How can you execute SQL queries in Node.js using the mysql module?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'By calling the "execute" method.', + is_correct: false, + }, + { + label: 'By using the "query" method.', + is_correct: true, + }, + { + label: 'By sending HTTP requests to a database server.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "DROP DATABASE" SQL statement?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To retrieve data from a database.', + is_correct: false, + }, + { + label: 'To delete an existing MySQL database.', + is_correct: true, + }, + { + label: 'To modify the structure of a table.', + is_correct: false, + }, + ], + }, + { + title: 'How can you prevent SQL injection when executing user-provided SQL queries in Node.js?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using input validation and sanitization.', + is_correct: true, + }, + { + label: 'By disabling the execution of user-provided queries.', + is_correct: false, + }, + { + label: 'By increasing the database security settings.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "pooling" mechanism in the mysql module?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To group multiple databases together.', + is_correct: false, + }, + { + label: 'To efficiently manage and reuse database connections.', + is_correct: true, + }, + { + label: 'To create backup copies of the database.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/010_node_sqlCreateTable.ts b/src/lib/mocks/node/010_node_sqlCreateTable.ts new file mode 100644 index 00000000..a61c818d --- /dev/null +++ b/src/lib/mocks/node/010_node_sqlCreateTable.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL Table Creation Quiz', + description: 'Test your knowledge of creating MySQL tables in Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of creating tables in a MySQL database?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To store and organize data in a structured format.', + is_correct: true, + }, + { + label: 'To display images on the website.', + is_correct: false, + }, + { + label: 'To create HTML documents for the web.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL statement is used to create a new table in a MySQL database?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'INSERT TABLE', + is_correct: false, + }, + { + label: 'CREATE TABLE', + is_correct: true, + }, + { + label: 'ADD TABLE', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "AUTO_INCREMENT" attribute in a MySQL table?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To automatically insert data into the table.', + is_correct: false, + }, + { + label: 'To generate unique values for a column when inserting data.', + is_correct: true, + }, + { + label: 'To sort data in the table in ascending order.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the purpose of primary keys in MySQL tables.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'What is the purpose of the "FOREIGN KEY" constraint in MySQL tables?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To restrict access to the table.', + is_correct: false, + }, + { + label: 'To enforce referential integrity between tables.', + is_correct: true, + }, + { + label: 'To define the primary key of the table.', + is_correct: false, + }, + ], + }, + { + title: 'How do you add a new column to an existing MySQL table?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using the "ALTER TABLE" statement.', + is_correct: true, + }, + { + label: 'By creating a new table and copying the data.', + is_correct: false, + }, + { + label: 'By deleting and recreating the table.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "UNIQUE" constraint in MySQL columns?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To ensure that the column contains only unique values.', + is_correct: true, + }, + { + label: 'To set the default value for the column.', + is_correct: false, + }, + { + label: 'To specify the data type of the column.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "DROP TABLE" statement in MySQL?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To create a new table.', + is_correct: false, + }, + { + label: 'To delete an existing table and its data.', + is_correct: true, + }, + { + label: 'To modify the structure of an existing table.', + is_correct: false, + }, + ], + }, + { + title: 'How can you add a foreign key constraint to a MySQL table column?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using the "ADD FOREIGN KEY" statement.', + is_correct: false, + }, + { + label: 'By specifying the foreign key constraint when creating the table.', + is_correct: true, + }, + { + label: 'By renaming the column to match the primary key of another table.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of indexing columns in MySQL tables?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To add graphical icons to the table.', + is_correct: false, + }, + { + label: 'To improve query performance by speeding up data retrieval.', + is_correct: true, + }, + { + label: 'To create a backup of the table.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/011_node_sqlInsertInto.ts b/src/lib/mocks/node/011_node_sqlInsertInto.ts new file mode 100644 index 00000000..b5ff1f6a --- /dev/null +++ b/src/lib/mocks/node/011_node_sqlInsertInto.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL Data Insertion Quiz', + description: 'Test your knowledge of inserting data into MySQL databases in Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of inserting data into a MySQL database in a Node.js application?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To display images on the website.', + is_correct: false, + }, + { + label: 'To store and manage data in the database.', + is_correct: true, + }, + { + label: 'To create interactive user interfaces.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL statement is used to insert data into a MySQL table?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'UPDATE', + is_correct: false, + }, + { + label: 'INSERT', + is_correct: true, + }, + { + label: 'DELETE', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of prepared statements when inserting data into a MySQL database?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To improve code readability.', + is_correct: false, + }, + { + label: 'To prevent SQL injection attacks.', + is_correct: true, + }, + { + label: 'To define the table structure.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the difference between synchronous and asynchronous data insertion in Node.js.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you handle errors when inserting data into a MySQL database in Node.js?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using try-catch blocks.', + is_correct: false, + }, + { + label: 'By providing a callback function to the insertion method.', + is_correct: true, + }, + { + label: 'By ignoring errors and proceeding with the insertion.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "INSERT INTO" SQL statement?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To update existing records in a table.', + is_correct: false, + }, + { + label: 'To insert new rows of data into a table.', + is_correct: true, + }, + { + label: 'To delete data from a table.', + is_correct: false, + }, + ], + }, + { + title: 'How do you insert data into a MySQL database in Node.js using prepared statements?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'By using the "VALUES" clause in the SQL statement.', + is_correct: true, + }, + { + label: 'By directly concatenating user input into the SQL query.', + is_correct: false, + }, + { + label: 'By passing placeholders and values as an array to the prepared statement.', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "LAST_INSERT_ID()" function in MySQL?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To retrieve the ID of the last inserted row in a table.', + is_correct: true, + }, + { + label: 'To delete the last inserted row in a table.', + is_correct: false, + }, + { + label: 'To update the last inserted row in a table.', + is_correct: false, + }, + ], + }, + { + title: 'How can you insert multiple rows of data into a MySQL table in a single query?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By executing multiple "INSERT INTO" statements.', + is_correct: false, + }, + { + label: 'By using a single "INSERT INTO" statement with multiple value sets.', + is_correct: true, + }, + { + label: 'By creating multiple prepared statements.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "ON DUPLICATE KEY UPDATE" clause in an "INSERT INTO" statement?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To create a new table if the data already exists.', + is_correct: false, + }, + { + label: 'To update existing rows if there is a duplicate key.', + is_correct: true, + }, + { + label: 'To prevent inserting duplicate data into the table.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/012_node_sqlSelectForm.ts b/src/lib/mocks/node/012_node_sqlSelectForm.ts new file mode 100644 index 00000000..082f8822 --- /dev/null +++ b/src/lib/mocks/node/012_node_sqlSelectForm.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL Data Selection Quiz', + description: 'Test your knowledge of selecting data from MySQL databases in Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of selecting data from a MySQL database in a Node.js application?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To update existing records in the database.', + is_correct: false, + }, + { + label: 'To retrieve and display data from the database.', + is_correct: true, + }, + { + label: 'To create new tables in the database.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL statement is used to select data from a MySQL table?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'INSERT', + is_correct: false, + }, + { + label: 'SELECT', + is_correct: true, + }, + { + label: 'DELETE', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "WHERE" clause in a SQL SELECT statement?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To specify which columns to select from the table.', + is_correct: false, + }, + { + label: 'To filter rows based on a specified condition.', + is_correct: true, + }, + { + label: 'To order the selected rows in ascending order.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the purpose of the "LIMIT" clause in a SQL SELECT statement.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you perform a join operation between two MySQL tables in Node.js?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using the "JOIN" clause in the SQL SELECT statement.', + is_correct: true, + }, + { + label: 'By creating a new table that combines the data from both tables.', + is_correct: false, + }, + { + label: 'By using the "DELETE" statement to merge data.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "GROUP BY" clause in a SQL SELECT statement?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To select all columns in the table.', + is_correct: false, + }, + { + label: 'To group rows with the same values in specified columns.', + is_correct: true, + }, + { + label: 'To order rows in descending order.', + is_correct: false, + }, + ], + }, + { + title: 'How do you handle asynchronous data retrieval when selecting data from a MySQL database in Node.js?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'By using synchronous functions.', + is_correct: false, + }, + { + label: 'By using callbacks or promises.', + is_correct: true, + }, + { + label: 'By executing SQL statements in a loop.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "ORDER BY" clause in a SQL SELECT statement?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To filter rows based on a specified condition.', + is_correct: false, + }, + { + label: 'To order the selected rows based on one or more columns.', + is_correct: true, + }, + { + label: 'To limit the number of rows returned by the query.', + is_correct: false, + }, + ], + }, + { + title: 'How can you select distinct values from a column in a SQL SELECT statement?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using the "DISTINCT" keyword.', + is_correct: true, + }, + { + label: 'By using the "WHERE" clause.', + is_correct: false, + }, + { + label: 'By using the "LIMIT" clause.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "HAVING" clause in a SQL SELECT statement?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To specify the columns to select from the table.', + is_correct: false, + }, + { + label: 'To filter groups of rows based on a condition.', + is_correct: true, + }, + { + label: 'To order rows in ascending order.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/013_node_sqlWhere.ts b/src/lib/mocks/node/013_node_sqlWhere.ts new file mode 100644 index 00000000..c60de20c --- /dev/null +++ b/src/lib/mocks/node/013_node_sqlWhere.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL WHERE Clause Quiz', + description: 'Test your knowledge of using the "WHERE" clause in MySQL with Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of the "WHERE" clause in a SQL statement?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To order the selected rows in ascending order.', + is_correct: false, + }, + { + label: 'To filter rows based on a specified condition.', + is_correct: true, + }, + { + label: 'To group rows with the same values in specified columns.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL statement is used to filter rows in a SQL SELECT statement?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'UPDATE', + is_correct: false, + }, + { + label: 'FILTER', + is_correct: false, + }, + { + label: 'WHERE', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "AND" operator in a WHERE clause?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To combine multiple conditions, all of which must be true.', + is_correct: true, + }, + { + label: 'To exclude rows that meet any of the specified conditions.', + is_correct: false, + }, + { + label: 'To order the selected rows.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the difference between the "AND" and "OR" operators in a WHERE clause.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you filter rows based on a range of values in a WHERE clause?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'By using the "BETWEEN" operator.', + is_correct: true, + }, + { + label: 'By using the "LIKE" operator.', + is_correct: false, + }, + { + label: 'By using the "IN" operator.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "LIKE" operator in a WHERE clause?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To filter rows based on a range of values.', + is_correct: false, + }, + { + label: 'To filter rows based on a partial match of a value.', + is_correct: true, + }, + { + label: 'To filter rows based on an exact match of a value.', + is_correct: false, + }, + ], + }, + { + title: 'How can you combine multiple conditions with different logical operators in a WHERE clause?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'By using parentheses to group conditions.', + is_correct: true, + }, + { + label: 'By separating conditions with commas.', + is_correct: false, + }, + { + label: 'By using the "AND" operator only.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "NOT" operator in a WHERE clause?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To negate the meaning of a condition.', + is_correct: true, + }, + { + label: 'To filter rows that meet any of the specified conditions.', + is_correct: false, + }, + { + label: 'To order the selected rows in descending order.', + is_correct: false, + }, + ], + }, + { + title: 'How can you use the "IS NULL" condition in a WHERE clause?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To filter rows that have a non-null value.', + is_correct: false, + }, + { + label: 'To filter rows that have a null value.', + is_correct: true, + }, + { + label: 'To filter rows that have a specific value.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of using the "ORDER BY" clause in a SQL SELECT statement?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To filter rows based on a specified condition.', + is_correct: false, + }, + { + label: 'To order the selected rows based on one or more columns.', + is_correct: true, + }, + { + label: 'To limit the number of rows returned by the query.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/014_node_sqlOrderBy.ts b/src/lib/mocks/node/014_node_sqlOrderBy.ts new file mode 100644 index 00000000..a2488262 --- /dev/null +++ b/src/lib/mocks/node/014_node_sqlOrderBy.ts @@ -0,0 +1,212 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL ORDER BY Clause Quiz', + description: 'Test your knowledge of using the "ORDER BY" clause in MySQL with Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of the "ORDER BY" clause in a SQL SELECT statement?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To filter rows based on a specified condition.', + is_correct: false, + }, + { + label: 'To order the selected rows based on one or more columns.', + is_correct: true, + }, + { + label: 'To limit the number of rows returned by the query.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL keyword is used to specify the sorting order in the "ORDER BY" clause?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'ASC', + is_correct: true, + }, + { + label: 'DESC', + is_correct: true, + }, + { + label: 'ORDER', + is_correct: false, + }, + ], + }, + { + title: 'What does "ASC" stand for in the context of sorting in SQL?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Ascending Sort Condition', + is_correct: false, + }, + { + label: 'Alphabetical Sorting Condition', + is_correct: false, + }, + { + label: 'Ascending', + is_correct: true, + }, + ], + }, + { + title: 'Explain the purpose of the "DESC" keyword in an "ORDER BY" clause.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'How can you specify multiple columns for sorting in the "ORDER BY" clause?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Separate column names with commas.', + is_correct: true, + }, + { + label: 'Use the "AND" operator between column names.', + is_correct: false, + }, + { + label: 'Use the "OR" operator between column names.', + is_correct: false, + }, + ], + }, + { + title: 'What is the default sorting order when using the "ORDER BY" clause?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Ascending (ASC)', + is_correct: true, + }, + { + label: 'Descending (DESC)', + is_correct: false, + }, + { + label: 'Random order', + is_correct: false, + }, + ], + }, + { + title: 'Can you use an alias in the "ORDER BY" clause?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Yes, you can use an alias to specify sorting order.', + is_correct: false, + }, + { + label: 'No, aliases are not allowed in the "ORDER BY" clause.', + is_correct: true, + }, + { + label: 'Yes, but only for numeric columns.', + is_correct: false, + }, + ], + }, + { + title: "What happens if you don't specify a sorting order (ASC or DESC) in the 'ORDER BY' clause?", + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'The query will return an error.', + is_correct: false, + }, + { + label: 'The default sorting order (ASC) will be used.', + is_correct: true, + }, + { + label: 'The sorting order will be random.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "LIMIT" clause in a SQL SELECT statement?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To filter rows based on a specified condition.', + is_correct: false, + }, + { + label: 'To order the selected rows based on one or more columns.', + is_correct: false, + }, + { + label: 'To limit the number of rows returned by the query.', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of using the "OFFSET" clause with the "LIMIT" clause?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To specify the columns to select from the table.', + is_correct: false, + }, + { + label: 'To skip a specified number of rows before returning results.', + is_correct: true, + }, + { + label: 'To order rows in descending order.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/015_node_sqlDelete.ts b/src/lib/mocks/node/015_node_sqlDelete.ts new file mode 100644 index 00000000..44a52256 --- /dev/null +++ b/src/lib/mocks/node/015_node_sqlDelete.ts @@ -0,0 +1,199 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL DELETE Statement Quiz', + description: 'Test your knowledge of using the "DELETE" statement in MySQL with Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of the "DELETE" statement in SQL?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To update existing records in a table.', + is_correct: false, + }, + { + label: 'To insert new records into a table.', + is_correct: false, + }, + { + label: 'To remove existing records from a table.', + is_correct: true, + }, + ], + }, + { + title: 'Which SQL statement is used to delete a specific record from a table?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'DELETE ALL', + is_correct: false, + }, + { + label: 'DELETE', + is_correct: true, + }, + { + label: 'REMOVE', + is_correct: false, + }, + ], + }, + { + title: 'What happens if you execute a "DELETE" statement without a "WHERE" clause?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'All records in the table are deleted.', + is_correct: true, + }, + { + label: 'No records are deleted, and an error is thrown.', + is_correct: false, + }, + { + label: 'The first record in the table is deleted.', + is_correct: false, + }, + ], + }, + { + title: 'Explain the purpose of the "WHERE" clause in a "DELETE" statement.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Can you use the "LIMIT" clause with a "DELETE" statement in MySQL?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Yes, you can use "LIMIT" to specify the maximum number of rows to delete.', + is_correct: true, + }, + { + label: 'No, "LIMIT" is not allowed in a "DELETE" statement.', + is_correct: false, + }, + { + label: 'Yes, but only with the "ORDER BY" clause.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "ORDER BY" clause in a "DELETE" statement?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To filter rows based on a specified condition.', + is_correct: false, + }, + { + label: 'To order the rows before deleting them.', + is_correct: false, + }, + { + label: 'To specify the columns to delete.', + is_correct: false, + }, + ], + }, + { + title: 'How can you delete all records from a table using a "DELETE" statement?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Execute "DELETE FROM table_name".', + is_correct: true, + }, + { + label: 'Execute "DELETE * FROM table_name".', + is_correct: false, + }, + { + label: 'Execute "DELETE table_name".', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of using the "TRUNCATE" statement?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To delete specific records from a table.', + is_correct: false, + }, + { + label: 'To remove all records from a table quickly.', + is_correct: true, + }, + { + label: 'To update records in a table.', + is_correct: false, + }, + ], + }, + { + title: 'What is the difference between the "DELETE" and "TRUNCATE" statements?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Can you use the "JOIN" clause in a "DELETE" statement?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Yes, you can use "JOIN" to delete records from multiple tables.', + is_correct: true, + }, + { + label: 'No, "JOIN" is not allowed in a "DELETE" statement.', + is_correct: false, + }, + { + label: 'Yes, but only with the "ORDER BY" clause.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/016_node_sqlDropTable.ts b/src/lib/mocks/node/016_node_sqlDropTable.ts new file mode 100644 index 00000000..29b787fd --- /dev/null +++ b/src/lib/mocks/node/016_node_sqlDropTable.ts @@ -0,0 +1,195 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL DROP TABLE Quiz', + description: 'Test your knowledge of dropping tables in MySQL with Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of the "DROP TABLE" statement in SQL?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To create a new table in the database.', + is_correct: false, + }, + { + label: 'To delete an existing table and all its data.', + is_correct: true, + }, + { + label: 'To update records in a table.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL statement is used to delete a table in MySQL?', + name: 'question2', + points: 1, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'DELETE TABLE', + is_correct: false, + }, + { + label: 'DROP TABLE', + is_correct: true, + }, + { + label: 'REMOVE TABLE', + is_correct: false, + }, + ], + }, + { + title: 'What happens if you execute a "DROP TABLE" statement without a table name?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'All tables in the database are deleted.', + is_correct: false, + }, + { + label: 'The first table in the database is deleted.', + is_correct: false, + }, + { + label: 'An error is thrown, and no table is deleted.', + is_correct: true, + }, + ], + }, + { + title: 'Explain the purpose of the "IF EXISTS" clause in a "DROP TABLE" statement.', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Can you drop multiple tables in a single "DROP TABLE" statement?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Yes, you can specify multiple table names separated by commas.', + is_correct: true, + }, + { + label: 'No, you can only drop one table at a time.', + is_correct: false, + }, + { + label: 'Yes, but you need to use a separate "DROP TABLE" statement for each table.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "CASCADE" option in a "DROP TABLE" statement?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To drop the table and all dependent objects.', + is_correct: true, + }, + { + label: 'To drop the table without affecting dependent objects.', + is_correct: false, + }, + { + label: 'To rename the table instead of dropping it.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of using the "RESTRICT" option in a "DROP TABLE" statement?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To drop the table without affecting dependent objects.', + is_correct: true, + }, + { + label: 'To drop the table and all dependent objects.', + is_correct: false, + }, + { + label: 'To rename the table instead of dropping it.', + is_correct: false, + }, + ], + }, + { + title: 'What is the difference between "DROP TABLE" and "DELETE FROM" in SQL?', + name: 'question8', + points: 2, + order: 7, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Can you use the "IF NOT EXISTS" option with "DROP TABLE"?', + name: 'question9', + points: 1, + order: 8, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Yes, it prevents an error if the table does not exist.', + is_correct: true, + }, + { + label: 'No, "IF NOT EXISTS" is not allowed with "DROP TABLE".', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "RENAME" option in a "DROP TABLE" statement?', + name: 'question10', + points: 1, + order: 9, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To rename the table instead of dropping it.', + is_correct: true, + }, + { + label: 'To drop the table and all dependent objects.', + is_correct: false, + }, + { + label: 'To drop the table without affecting dependent objects.', + is_correct: false, + }, + ], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/017_node_sqlUpdate.ts b/src/lib/mocks/node/017_node_sqlUpdate.ts new file mode 100644 index 00000000..129d5a56 --- /dev/null +++ b/src/lib/mocks/node/017_node_sqlUpdate.ts @@ -0,0 +1,182 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL UPDATE Quiz', + description: 'Test your knowledge of updating data in MySQL with Node.js.', + questionnaire: { + questions: [ + { + title: 'What SQL statement is used to update data in a MySQL database?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'UPDATE', + is_correct: true, + }, + { + label: 'INSERT', + is_correct: false, + }, + { + label: 'SELECT', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "SET" clause in an "UPDATE" statement?', + name: 'question2', + points: 2, + order: 1, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To specify which table to update.', + is_correct: false, + }, + { + label: 'To set a new value for a column.', + is_correct: true, + }, + { + label: 'To specify the condition for updating rows.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL statement is used to update a specific row in a table?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'UPDATE', + is_correct: false, + }, + { + label: 'UPDATE ROW', + is_correct: false, + }, + { + label: 'UPDATE ... WHERE', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "WHERE" clause in an "UPDATE" statement?', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which SQL statement is used to update multiple rows in a table?', + name: 'question5', + points: 1, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'UPDATE ROW', + is_correct: false, + }, + { + label: 'UPDATE ALL', + is_correct: false, + }, + { + label: 'UPDATE ... WHERE', + is_correct: true, + }, + ], + }, + { + title: 'What is the purpose of the "LIMIT" clause in an "UPDATE" statement?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To specify the maximum number of columns to update.', + is_correct: false, + }, + { + label: 'To limit the number of rows to update.', + is_correct: true, + }, + { + label: 'To set a new value for a column.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "ORDER BY" clause in an "UPDATE" statement?', + name: 'question7', + points: 2, + order: 6, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Can you use a subquery in an "UPDATE" statement?', + name: 'question8', + points: 1, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'Yes, to update rows based on the result of a subquery.', + is_correct: true, + }, + { + label: 'No, subqueries are not allowed in "UPDATE" statements.', + is_correct: false, + }, + ], + }, + { + title: 'What happens if you omit the "WHERE" clause in an "UPDATE" statement?', + name: 'question9', + points: 1, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'All rows in the table are updated.', + is_correct: true, + }, + { + label: 'An error is thrown, and no rows are updated.', + is_correct: false, + }, + { + label: 'The first row in the table is updated.', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "RETURNING" clause in an "UPDATE" statement?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/018_node_sqlLimit.ts b/src/lib/mocks/node/018_node_sqlLimit.ts new file mode 100644 index 00000000..bab879cb --- /dev/null +++ b/src/lib/mocks/node/018_node_sqlLimit.ts @@ -0,0 +1,182 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL LIMIT Quiz', + description: 'Test your knowledge of limiting results in MySQL with Node.js.', + questionnaire: { + questions: [ + { + title: 'What SQL statement is used to limit the number of rows returned in a MySQL query?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'LIMIT', + is_correct: true, + }, + { + label: 'SELECT', + is_correct: false, + }, + { + label: 'WHERE', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "LIMIT" clause in a MySQL query?', + name: 'question2', + points: 2, + order: 1, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To specify the maximum number of columns to return.', + is_correct: false, + }, + { + label: 'To limit the number of rows returned by the query.', + is_correct: true, + }, + { + label: 'To filter the results based on a condition.', + is_correct: false, + }, + ], + }, + { + title: 'What is the default value for the "LIMIT" clause if not specified?', + name: 'question3', + points: 1, + order: 2, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: '0', + is_correct: false, + }, + { + label: '1', + is_correct: false, + }, + { + label: 'No limit (all rows)', + is_correct: true, + }, + ], + }, + { + title: 'Which SQL statement is used to skip a specific number of rows in a query result?', + name: 'question4', + points: 1, + order: 3, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'LIMIT', + is_correct: false, + }, + { + label: 'OFFSET', + is_correct: true, + }, + { + label: 'SKIP', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "OFFSET" clause in a MySQL query?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Can you use both "LIMIT" and "OFFSET" clauses in a single query?', + name: 'question6', + points: 1, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'Yes, to limit the number of rows and skip a specific number of rows.', + is_correct: true, + }, + { + label: 'No, "LIMIT" and "OFFSET" cannot be used together.', + is_correct: false, + }, + ], + }, + { + title: 'What happens if the "LIMIT" value is greater than the total number of rows in the result set?', + name: 'question7', + points: 1, + order: 6, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'An error is thrown.', + is_correct: false, + }, + { + label: 'All rows in the result set are returned.', + is_correct: true, + }, + { + label: 'No rows are returned.', + is_correct: false, + }, + ], + }, + { + title: 'Which SQL statement is used to limit the number of rows returned from the beginning of a result set?', + name: 'question8', + points: 2, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'LIMIT', + is_correct: false, + }, + { + label: 'TOP', + is_correct: true, + }, + { + label: 'OFFSET', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "FETCH FIRST" clause in a MySQL query?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'What is the purpose of the "FETCH NEXT" clause in a MySQL query?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/019_node_sqlJoin.ts b/src/lib/mocks/node/019_node_sqlJoin.ts new file mode 100644 index 00000000..cd15786c --- /dev/null +++ b/src/lib/mocks/node/019_node_sqlJoin.ts @@ -0,0 +1,202 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MySQL JOIN Quiz', + description: 'Test your knowledge of performing JOIN operations in MySQL with Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of a JOIN operation in a MySQL query?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To create a new table.', + is_correct: false, + }, + { + label: 'To combine rows from two or more tables based on a related column between them.', + is_correct: true, + }, + { + label: 'To delete data from a table.', + is_correct: false, + }, + ], + }, + { + title: 'Which JOIN type returns all rows when there is a match in either table?', + name: 'question2', + points: 2, + order: 1, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'INNER JOIN', + is_correct: false, + }, + { + label: 'LEFT JOIN (or LEFT OUTER JOIN)', + is_correct: true, + }, + { + label: 'RIGHT JOIN (or RIGHT OUTER JOIN)', + is_correct: true, + }, + { + label: 'FULL JOIN (or FULL OUTER JOIN)', + is_correct: true, + }, + ], + }, + { + title: 'Which JOIN type returns only the rows that have matching values in both tables?', + name: 'question3', + points: 2, + order: 2, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'INNER JOIN', + is_correct: true, + }, + { + label: 'LEFT JOIN (or LEFT OUTER JOIN)', + is_correct: false, + }, + { + label: 'RIGHT JOIN (or RIGHT OUTER JOIN)', + is_correct: false, + }, + { + label: 'FULL JOIN (or FULL OUTER JOIN)', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of the "ON" clause in a JOIN operation?', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which JOIN type returns all rows from both tables with NULL records where there is no match?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'INNER JOIN', + is_correct: false, + }, + { + label: 'LEFT JOIN (or LEFT OUTER JOIN)', + is_correct: false, + }, + { + label: 'RIGHT JOIN (or RIGHT OUTER JOIN)', + is_correct: false, + }, + { + label: 'FULL JOIN (or FULL OUTER JOIN)', + is_correct: true, + }, + ], + }, + { + title: 'Which SQL statement is used to perform an INNER JOIN in MySQL?', + name: 'question6', + points: 2, + order: 5, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'JOIN', + is_correct: true, + }, + { + label: 'INNER', + is_correct: false, + }, + { + label: 'ON', + is_correct: false, + }, + ], + }, + { + title: 'Which JOIN type returns all rows from the left table and the matching rows from the right table?', + name: 'question7', + points: 2, + order: 6, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'INNER JOIN', + is_correct: false, + }, + { + label: 'LEFT JOIN (or LEFT OUTER JOIN)', + is_correct: true, + }, + { + label: 'RIGHT JOIN (or RIGHT OUTER JOIN)', + is_correct: false, + }, + { + label: 'FULL JOIN (or FULL OUTER JOIN)', + is_correct: false, + }, + ], + }, + { + title: 'What is the difference between INNER JOIN and LEFT JOIN?', + name: 'question8', + points: 2, + order: 7, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which SQL statement is used to perform a LEFT JOIN in MySQL?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'JOIN', + is_correct: false, + }, + { + label: 'LEFT JOIN (or LEFT OUTER JOIN)', + is_correct: true, + }, + { + label: 'OUTER JOIN', + is_correct: false, + }, + ], + }, + { + title: 'What happens if there are duplicate column names in the tables being joined?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/020_node_mongodbDatabase.ts b/src/lib/mocks/node/020_node_mongodbDatabase.ts new file mode 100644 index 00000000..4c50e366 --- /dev/null +++ b/src/lib/mocks/node/020_node_mongodbDatabase.ts @@ -0,0 +1,202 @@ +import { QuestionTypes } from '../utils'; + +import type { ExerciseTemplate } from '$lib/utils/types'; + +const template: ExerciseTemplate = { + title: 'Node.js MongoDB Database Creation Quiz', + description: 'Test your knowledge of creating MongoDB databases with Node.js.', + questionnaire: { + questions: [ + { + title: 'What is the purpose of MongoDB in a Node.js application?', + name: 'question1', + points: 2, + order: 0, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'To create a new Node.js application.', + is_correct: false, + }, + { + label: 'To store and manage data in a NoSQL database.', + is_correct: true, + }, + { + label: 'To create a front-end interface for a website.', + is_correct: false, + }, + ], + }, + { + title: 'Which MongoDB driver is commonly used to connect to MongoDB from a Node.js application?', + name: 'question2', + points: 2, + order: 1, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'MySQL', + is_correct: false, + }, + { + label: 'SQLite', + is_correct: false, + }, + { + label: 'Mongoose', + is_correct: true, + }, + { + label: 'Express.js', + is_correct: false, + }, + ], + }, + { + title: 'What is the role of the "mongodb://localhost/mydb" connection string?', + name: 'question3', + points: 2, + order: 2, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which command is used to create a new MongoDB database?', + name: 'question4', + points: 2, + order: 3, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'CREATE DATABASE', + is_correct: false, + }, + { + label: 'USE DATABASE', + is_correct: false, + }, + { + label: 'db.createDatabase()', + is_correct: true, + }, + { + label: 'db.create()', + is_correct: false, + }, + ], + }, + { + title: 'What is a "collection" in MongoDB?', + name: 'question5', + points: 2, + order: 4, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'A group of related Node.js modules.', + is_correct: false, + }, + { + label: 'A set of documents in a MongoDB database.', + is_correct: true, + }, + { + label: 'A JavaScript function in a Node.js application.', + is_correct: false, + }, + ], + }, + { + title: 'How can you insert a document into a MongoDB collection using Node.js?', + name: 'question6', + points: 2, + order: 5, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + { + title: 'Which method is used to find documents in a MongoDB collection with specific criteria?', + name: 'question7', + points: 2, + order: 6, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'findOne()', + is_correct: false, + }, + { + label: 'find()', + is_correct: true, + }, + { + label: 'search()', + is_correct: false, + }, + { + label: 'get()', + is_correct: false, + }, + ], + }, + { + title: 'What is the purpose of an ObjectId in MongoDB?', + name: 'question8', + points: 2, + order: 7, + question_type: QuestionTypes[1], // CHECKBOX + options: [ + { + label: 'To uniquely identify a document within a collection.', + is_correct: true, + }, + { + label: 'To define the structure of a collection.', + is_correct: false, + }, + { + label: 'To store binary data.', + is_correct: false, + }, + ], + }, + { + title: 'Which method is used to update documents in a MongoDB collection?', + name: 'question9', + points: 2, + order: 8, + question_type: QuestionTypes[0], // RADIO + options: [ + { + label: 'modify()', + is_correct: false, + }, + { + label: 'updateOne()', + is_correct: true, + }, + { + label: 'change()', + is_correct: false, + }, + { + label: 'patch()', + is_correct: false, + }, + ], + }, + { + title: 'How can you delete a document from a MongoDB collection using Node.js?', + name: 'question10', + points: 2, + order: 9, + question_type: QuestionTypes[2], // TEXTAREA + options: [], + }, + ], + }, +}; + + +export default template; diff --git a/src/lib/mocks/node/index.ts b/src/lib/mocks/node/index.ts new file mode 100644 index 00000000..41183e00 --- /dev/null +++ b/src/lib/mocks/node/index.ts @@ -0,0 +1,67 @@ +import nodeModule from './001_node_module'; +import nodeHttpModule from './002_node_httpModule'; +import nodeFileSystem from './003_node_fileSystem'; +import nodeUrlModule from './004_node_urlModule'; +import nodeNpm from './005_node_npm'; +import nodeEvents from './006_node_events'; +import nodeUploadFiles from './007_node_uploadFiles'; +import nodeEmail from './008_node_email'; +import nodeSqlDatabase from './009_node_sqlDatabase'; +import nodeSqlCreateTable from './010_node_sqlCreateTable'; +import nodeSqlInertInto from './011_node_sqlInsertInto'; +import nodeSqlSelectForm from './012_node_sqlSelectForm'; +import nodeSqlWhere from './013_node_sqlWhere'; +import nodeSqlOrderBy from './014_node_sqlOrderBy'; +import nodeSqlDelete from './015_node_sqlDelete'; +import nodeSqlDropTable from './016_node_sqlDropTable'; +import nodeSqlUpdate from './017_node_sqlUpdate'; +import nodeSqlLimit from './018_node_sqlLimit'; +import nodeSqlJoin from './019_node_sqlJoin'; +import nodeMongoDBDatabase from './020_node_mongodbDatabase'; + + +export const NODE_IDS: { [key: string]: string } = { + NODE_MODULE: 'NODE_MODULE', + NODE_HTTPMODULE: 'NODE_HTTPMODULE', + NODE_FILESYSTEM: 'NODE_FILESYSTEM', + NODE_URLMODULE: 'NODE_URLMODULE', + NODE_NPM: 'NODE_NPM', + NODE_EVENTS: 'NODE_EVENTS', + NODE_UPLOADFILES: 'NODE_UPLOADFILES', + NODE_EMAIL: 'NODE_EMAIL', + NODE_SQLDATABASE: 'NODE_SQLDATABASE', + NODE_SQLCREATETABLE: 'NODE_SQLCREATETABLE', + NODE_SQLINSERTINTO: 'NODE_SQLINSERTINTO', + NODE_SQLSELECTFORM: 'NODE_SQLSELECTFORM', + NODE_SQLWHERE: 'NODE_SQLWHERE', + NODE_SQLORDERBY: 'NODE_SQLORDERBY', + NODE_SQLDELETE: 'NODE_SQLDELETE', + NODE_SQLDROPTABLE: 'NODE_SQLDROPTABLE', + NODE_SQLUPDATE: 'NODE_SQLUPDATE', + NODE_SQLLIMIT: 'NODE_SQLLIMIT', + NODE_SQLJOIN: 'NODE_SQLJOIN', + NODE_MONGODBDATABASE: 'NODE_MONGODBDATABASE', +}; + +export const NODE_TEMPLATES = { + [NODE_IDS.NODE_MODULE]: nodeModule, + [NODE_IDS.NODE_HTTPMODULE]: nodeHttpModule, + [NODE_IDS.NODE_FILESYSTEM]: nodeFileSystem, + [NODE_IDS.NODE_URLMODULE]: nodeUrlModule, + [NODE_IDS.NODE_NPM]: nodeNpm, + [NODE_IDS.NODE_EVENTS]: nodeEvents, + [NODE_IDS.NODE_UPLOADFILES]: nodeUploadFiles, + [NODE_IDS.NODE_EMAIL]: nodeEmail, + [NODE_IDS.NODE_SQLDATABASE]: nodeSqlDatabase, + [NODE_IDS.NODE_SQLCREATETABLE]: nodeSqlCreateTable, + [NODE_IDS.NODE_SQLINSERTINTO]: nodeSqlInertInto, + [NODE_IDS.NODE_SQLSELECTFORM]: nodeSqlSelectForm, + [NODE_IDS.NODE_SQLWHERE]: nodeSqlWhere, + [NODE_IDS.NODE_SQLORDERBY]: nodeSqlOrderBy, + [NODE_IDS.NODE_SQLDELETE]: nodeSqlDelete, + [NODE_IDS.NODE_SQLDROPTABLE]: nodeSqlDropTable, + [NODE_IDS.NODE_SQLUPDATE]: nodeSqlUpdate, + [NODE_IDS.NODE_SQLLIMIT]: nodeSqlLimit, + [NODE_IDS.NODE_SQLJOIN]: nodeSqlJoin, + [NODE_IDS.NODE_MONGODBDATABASE]: nodeMongoDBDatabase, +};