<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mwander5</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mwander5"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Mwander5"/>
	<updated>2026-06-26T23:41:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=165164</id>
		<title>CSC/ECE 517 Spring 2025 - E2538 Reimplementing Questionnaire Page in Expertiza</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=165164"/>
		<updated>2025-04-23T03:54:05Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* Reference Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2538 Reimplementing Questionnaire Page==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==About Expertiza==&lt;br /&gt;
Expertiza is an open-source web application currently built using [http://rubyonrails.org/ Ruby on Rails] and led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Designed for educational use, it enables instructors to manage assignments, rubrics, and participants, as well as assign grades and monitor student progress. Students can submit various types of learning objects, form teams, conduct peer evaluations, and review feedback from both peers and instructors. Originally developed at NC State, Expertiza is now used in select courses there and by faculty at other institutions, offering a flexible platform to enhance active learning and feedback in academic settings.&lt;br /&gt;
&lt;br /&gt;
The reimplementation of Expertiza aims to mimic and enhance the application’s existing functionality with clean, well-structured code, while transitioning to a front-end application written in React and Typescipt integrated with a Ruby on Rails back-end.&lt;br /&gt;
&lt;br /&gt;
==Project Overview==&lt;br /&gt;
The goal of this project is to implement the Questionnaire Management Dashboard and Create/Edit Rubric pages in Expertiza by reimplementing its frontend using React with TypeScript, while integrating it with the existing Ruby on Rails backend APIs in the reimplementation backend repo. The new implementation will improve user experience, maintainability, and scalability while preserving core functionalities.&lt;br /&gt;
&lt;br /&gt;
This project covers:&lt;br /&gt;
&lt;br /&gt;
* Developing a React-based UI for managing questionnaire rubrics.&lt;br /&gt;
&lt;br /&gt;
* Enabling navigation to a new page when clicking the &amp;quot;+&amp;quot; button to create a specific rubric for a questionnaire type.&lt;br /&gt;
&lt;br /&gt;
* Ensuring seamless API integration with the reimplementation backend repo.&lt;br /&gt;
&lt;br /&gt;
* Managing user sessions and authentication securely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While adhering to the following best practices: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Component Reusability (DRY Principle)&amp;lt;/strong&amp;gt;: Design reusable and modular components to avoid duplication and simplify maintenance, adhering to the &amp;quot;Don't Repeat Yourself&amp;quot; principle.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Separation of Concerns&amp;lt;/strong&amp;gt;: Keep the UI, state management, and business logic separated. Use container components for state and logic and presentational components for rendering.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Responsive and Accessible Design&amp;lt;/strong&amp;gt;: Ensure the UI adapts to different devices and meets accessibility standards (e.g., ARIA roles, keyboard navigation, and proper contrast).&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type Safety with TypeScript&amp;lt;/strong&amp;gt;: Use TypeScript interfaces and types to ensure data consistency, reduce runtime errors.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Single Responsibility Principle&amp;lt;/strong&amp;gt;: Each component or function should have a single, well-defined purpose to improve clarity, testability, and scalability.&lt;br /&gt;
&lt;br /&gt;
==What Needs to be Done?==&lt;br /&gt;
===Questionnaire Management Dashboard===&lt;br /&gt;
&lt;br /&gt;
Displays a list of questionnaire types (Review, Metareview, Author Feedback, etc.)&lt;br /&gt;
* Each questionnaire type has a &amp;quot;+&amp;quot; button, which, when clicked, navigates to a new page for creating a specific rubric for that questionnaire type.&lt;br /&gt;
* Data is fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx1x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===Create/Edit Rubric Page===&lt;br /&gt;
&lt;br /&gt;
This page is displayed when a user clicks the &amp;quot;+&amp;quot; button from the dashboard.&lt;br /&gt;
&lt;br /&gt;
Allows users to:&lt;br /&gt;
* Enter a name for the rubric.&lt;br /&gt;
* Define min/max item scores.&lt;br /&gt;
* Set the review visibility (private/public).&lt;br /&gt;
* Add criteria for evaluation.&lt;br /&gt;
* Submit the form to create a new rubric for the selected questionnaire type.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx2x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Backend Integration==&lt;br /&gt;
&lt;br /&gt;
The frontend interacts with several key resources exposed by the backend through a RESTful API. The structure of each model's associated database table lets us define Typescript interfaces, transform request/response payloads and promote type safety.&lt;br /&gt;
&lt;br /&gt;
===Models===&lt;br /&gt;
&lt;br /&gt;
====Questionnaire====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Questionnaire&amp;lt;/code&amp;gt; model forms the foundation of the Create/Edit form functionality, storing necessary attributes for each questionnaire. These fields are used to construct a form for editing or creating a rubric and to prepopulate the form when editing an existing rubric. &lt;br /&gt;
&lt;br /&gt;
The backend database also includes a table of &amp;lt;code&amp;gt;questionnaire_types&amp;lt;/code&amp;gt;, access to which would allow the Questionnaire Management Dashboard to dynamically render all available categories of questionnaires and enable users to initiate the creation process based on a selected type. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| name || The name/title of the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instructor_id || Foreign key referencing the instructor who created it&lt;br /&gt;
|-&lt;br /&gt;
| private || Boolean indicating if the questionnaire is private&lt;br /&gt;
|-&lt;br /&gt;
| min_question_score || Minimum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| max_question_score || Maximum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_type || The type/category of questionnaire (e.g., Survey, Teammate Review)&lt;br /&gt;
|-&lt;br /&gt;
| display_type || Field for specifying how to display the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instruction_loc || Field for custom instructions location or reference&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of questionnaire creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Item====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; model represents individual items (or questions) within a questionnaire and includes attributes that should be included when adding an item to a particular questionnaire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the item&lt;br /&gt;
|-&lt;br /&gt;
| txt || The text of the item/question&lt;br /&gt;
|-&lt;br /&gt;
| weight || The relative importance or weight of the item&lt;br /&gt;
|-&lt;br /&gt;
| seq || The sequence/order of the item in the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| question_type || Foreign key referencing the type of question&lt;br /&gt;
|-&lt;br /&gt;
| size || Size attribute for text-based answers (e.g., text area size)&lt;br /&gt;
|-&lt;br /&gt;
| alternatives || Possible answer choices (comma-separated for multiple-choice)&lt;br /&gt;
|-&lt;br /&gt;
| break_before || Boolean indicating whether to insert a page break before the item&lt;br /&gt;
|-&lt;br /&gt;
| max_label || Optional label for the maximum scale value&lt;br /&gt;
|-&lt;br /&gt;
| min_label || Optional label for the minimum scale value&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of item creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_id || Foreign key referencing the associated questionnaire&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===API Endpoints===&lt;br /&gt;
&lt;br /&gt;
To facilitate interaction with the backend, the frontend uses a pre-configured &amp;lt;code&amp;gt;axiosClient&amp;lt;/code&amp;gt;, which abstracts the base API URL and port number. This client is defined in the &amp;lt;code&amp;gt;utils/axios_client.ts&amp;lt;/code&amp;gt; file and reused throughout the project for API communication. For questionnaire management, several key API routes are accessed using this client. For example, &amp;lt;code&amp;gt;GET /questionnaires/:id&amp;lt;/code&amp;gt; fetches detailed data for editing a selected questionnaire. When creating or updating a questionnaire, the application uses &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;, respectively.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! HTTP Method !! Endpoint !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires || Fetches a list of all questionnaires&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires/:id || Fetches a specific questionnaire by ID&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questionnaires || Creates a new questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questionnaires/:id || Updates an existing questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| DELETE || /questionnaires/:id || Deletes a specific questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions || Retrieves a list of all questions (items)&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions/:id || Retrieves a specific item, along with its rendered display&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questions || Creates a new item for a questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questions/:id || Updates an existing item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
====Manage Questionnaires====&lt;br /&gt;
&lt;br /&gt;
To navigate to the Questionnaire Management Dashboard, &amp;lt;strong&amp;gt;Questionnaire&amp;lt;/strong&amp;gt; from the &amp;lt;strong&amp;gt;Manage&amp;lt;/strong&amp;gt; dropdown from any page on Expertiza.&lt;br /&gt;
&lt;br /&gt;
To be consistent with other management pages (for Users, Courses, Assignements) in the reimplementation front end, a table of questionnaires belonging to the logged-in instructor is visible on the page. From this page, you may create, edit, or delete a questionnaire. &lt;br /&gt;
&lt;br /&gt;
To create a new questionnaire, click on the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button in the top left corner of the page. &lt;br /&gt;
&lt;br /&gt;
[[File:ManagementDashboard.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Type Selection====&lt;br /&gt;
&lt;br /&gt;
When the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button is selected from the top of the Questionnaire Management Dashboard, a pop-up appears with the available questionnaire types. To create a questionnaire of a given type, select the &amp;lt;strong&amp;gt;&amp;quot;+&amp;quot;&amp;lt;/strong&amp;gt; botton in the row of the desired type. &lt;br /&gt;
&lt;br /&gt;
[[File:TypeSelection.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Form====&lt;br /&gt;
&lt;br /&gt;
Once a type has been selected, the user is directed to the appropriate form to create a questionnaire of the selected type. The user can include a variable number of items to the questionnaire at the time of creation. The required fields for an item is determined by the item type. For example, a scale type item required minimum and maximum values for its scale. &lt;br /&gt;
&lt;br /&gt;
[[File:Questionnaire Form.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once a form field has been touched, the application alerts the user of missing required fields. Failure to provide appropriate values will prevent form submission. &lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2025-04-22 at 10.12.22 AM.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Upon successful submission, the newly-created questionnaire will appear in the list of questionnaires in the Questionnaire Management Dashboard. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaireselect.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To edit a questionnaire, select the edit icon next to the questionnaire you want to edit. You will be directed to a form with the existing questionnaire and items filled in. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaire.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireUtils.ts===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireUtils.ts&amp;lt;/code&amp;gt; file serves as a utility module for handling questionnaire-related functionality in the application, including interfaces, data transformation methods, and back-end data retrieval. This file helps maintain clear separation of concerns, type safety, and adherence to design principles such as the Single Responsibility Principle (SRP).&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireForm.tsx===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt; file is a React component that provides a form interface for creating or editing questionnaires. It integrates with Formik for form state management and validation, utilizing React Bootstrap for UI elements.&lt;br /&gt;
&lt;br /&gt;
The form fields are strongly typed using Formik's &amp;lt;code&amp;gt;Field&amp;lt;/code&amp;gt; components and the &amp;lt;code&amp;gt;QuestionnaireFormValues&amp;lt;/code&amp;gt; interface, ensuring that the data entered by the user adheres to the correct structure.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Name&amp;lt;/strong&amp;gt;: A text field for entering the questionnaire name.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type&amp;lt;/strong&amp;gt;: A hidden input used to specify the type of the questionnaire selected from the Questionnaire Management Dashboard and to be passed to the back-end.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Private&amp;lt;/strong&amp;gt;: A checkbox to indicate whether the questionnaire is private.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Minimum/Maximum Question Scores&amp;lt;/strong&amp;gt;: Numeric fields for setting the minimum and maximum scores for questions.&lt;br /&gt;
&lt;br /&gt;
The form delegates the responsibility of handling questionnaire items to the &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray&amp;lt;/code&amp;gt; component, which allows users to add or remove items dynamically and keeps each component focused on a single responsibility.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireTypes.tsx===&lt;br /&gt;
This component renders a table that displays different types of questionnaires. Each row provides an action to navigate to the corresponding creation page for the selected questionnaire type. The &amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt; component from &amp;lt;code&amp;gt;components/Table/Table&amp;lt;/code&amp;gt; is used in adherence with the DRY Principle and the provided design guidelines.&lt;br /&gt;
&lt;br /&gt;
==Code Changes Summary==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Method / Function !! Before !! After / Changes Introduced !! Commit Summary&lt;br /&gt;
|-&lt;br /&gt;
| App.tsx || Routing to /questionnaire and /edit-questionnaire || Not defined or incomplete || Added `ProtectedRoute` wrappers and proper routing to `Questionnaire` and `EditQuestionnaire` || Updated App.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || render(), type grouping || Basic list display || Grouped by type, added &amp;quot;+&amp;quot; button for creating new rubrics || Update Questionnaire.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || Add rubric handler || Not implemented || Clicking &amp;quot;+&amp;quot; navigates to `edit-questionnaire` with type parameter || More UI updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Form handling &amp;amp; API integration || Static layout || Full integration with axios POST/PUT calls to backend || updated interface so it can now update backend&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Questionnaire name editing || Not available || Name can now be edited from the UI || More functionality updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Display and manage rubric items || Static list || Dynamically displays and adds rubric items || Properly displays items and properly adds items&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire.tsx || Icons and UI elements || No icons || Edit, delete, and copy icons added for each row || More UI updates, including icons&lt;br /&gt;
|-&lt;br /&gt;
| axios_client.ts || axios client usage || Not standardized || Shared axiosClient used for API calls across all pages || Integrated across changes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Files Modified==&lt;br /&gt;
The following files were created or modified to implement the questionnaire dashboard and rubric management UI in React with TypeScript:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/Questionnaire/questionnaire.tsx&amp;lt;/code&amp;gt; – Implements the Questionnaire Management Dashboard UI and groups questionnaires by type with &amp;quot;+&amp;quot; action buttons.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; – Create/Edit Rubric page that handles full form logic and submission.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/App.tsx&amp;lt;/code&amp;gt; – Updated routing to include new paths: &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/edit-questionnaire&amp;lt;/code&amp;gt;, protected via &amp;lt;code&amp;gt;ProtectedRoute&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/assets/icons/&amp;lt;/code&amp;gt; – Added new UI icons for edit, delete, and copy actions in the questionnaire list.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/utils/axios_client.ts&amp;lt;/code&amp;gt; – Preconfigured &amp;lt;code&amp;gt;axios&amp;lt;/code&amp;gt; instance used throughout the frontend for API interactions.&lt;br /&gt;
*&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;package-lock.json&amp;lt;/code&amp;gt; – Updated dependencies for React Bootstrap, Formik, and icon support.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; The previously separate files like &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray.tsx&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;QuestionnaireUtils.tsx&amp;lt;/code&amp;gt; were refactored and consolidated into &amp;lt;code&amp;gt;EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; for improved maintainability.&lt;br /&gt;
&lt;br /&gt;
==Test Plan - Manual Testing Strategy==&lt;br /&gt;
====Login Credentials====&lt;br /&gt;
To login to the application, use the following credentials:&lt;br /&gt;
* &amp;lt;strong&amp;gt;username:&amp;lt;/strong&amp;gt; instructor6  &lt;br /&gt;
* &amp;lt;strong&amp;gt;password:&amp;lt;/strong&amp;gt; password&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Dashboard Loading====&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and confirm that all types of questionnaires are displayed.&lt;br /&gt;
* &amp;quot;+&amp;quot; button next to each type should open the rubric creation form with the correct type preselected.&lt;br /&gt;
&lt;br /&gt;
====Form Functionality====&lt;br /&gt;
* Enter name, min/max scores, and toggle the private/public checkbox.&lt;br /&gt;
* Dynamically add or remove criteria.&lt;br /&gt;
* Submit the form to create a new rubric and confirm it reflects on the dashboard.&lt;br /&gt;
&lt;br /&gt;
====Edit Rubric====&lt;br /&gt;
* Click on an existing rubric's &amp;quot;Edit&amp;quot; icon to load it in the edit form.&lt;br /&gt;
* Modify any field (name, score range, criteria) and resubmit.&lt;br /&gt;
* Confirm updated rubric details persist and are displayed correctly.&lt;br /&gt;
&lt;br /&gt;
====Form Validation====&lt;br /&gt;
* Leave required fields empty and confirm that validation messages are displayed.&lt;br /&gt;
* Enter invalid values (e.g., &amp;lt;code&amp;gt;max_score &amp;amp;lt; min_score&amp;lt;/code&amp;gt;) and confirm appropriate warnings are shown.&lt;br /&gt;
&lt;br /&gt;
====API Communication====&lt;br /&gt;
* Verify that form submissions trigger &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Confirm that response handling updates the UI appropriately (e.g., rerenders list on successful save).&lt;br /&gt;
&lt;br /&gt;
====UI Testing====&lt;br /&gt;
* Confirm that the layout is responsive across desktop, tablet, and mobile devices.&lt;br /&gt;
* Ensure accessibility: keyboard navigation works, form fields are properly labeled, and ARIA roles are used where needed.&lt;br /&gt;
&lt;br /&gt;
==Team==&lt;br /&gt;
=====Mentor===== &lt;br /&gt;
*Prathyusha Kodali - pkodali&lt;br /&gt;
&lt;br /&gt;
=====Members===== &lt;br /&gt;
*Ashwin Muniswamy - akumarm&lt;br /&gt;
*Michael Anderson - mwander5&lt;br /&gt;
*Martina Viola - mmviola&lt;br /&gt;
&lt;br /&gt;
==Reference Links==&lt;br /&gt;
*[https://expertiza.ncsu.edu/tree_display/list?currCtlr=Questionnaires Questionnaire Management Dashboard]&lt;br /&gt;
*[https://expertiza.ncsu.edu/questionnaires/new?model=ReviewQuestionnaire&amp;amp;private=1 Create/Edit Rubric Page]&lt;br /&gt;
*[https://github.com/mmviola1/reimplementation-front-end-E2538 Project Repo]&lt;br /&gt;
*[http://152.7.176.255:8080 VCL Deployment]&lt;br /&gt;
*[https://github.com/expertiza/reimplementation-front-end/pull/94 Pull Request]&lt;br /&gt;
&lt;br /&gt;
=====Demo Video=====&lt;br /&gt;
*[https://youtu.be/eVViM9_Gg80, Demo Video]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=165163</id>
		<title>CSC/ECE 517 Spring 2025 - E2538 Reimplementing Questionnaire Page in Expertiza</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=165163"/>
		<updated>2025-04-23T03:53:27Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* Reference Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2538 Reimplementing Questionnaire Page==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==About Expertiza==&lt;br /&gt;
Expertiza is an open-source web application currently built using [http://rubyonrails.org/ Ruby on Rails] and led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Designed for educational use, it enables instructors to manage assignments, rubrics, and participants, as well as assign grades and monitor student progress. Students can submit various types of learning objects, form teams, conduct peer evaluations, and review feedback from both peers and instructors. Originally developed at NC State, Expertiza is now used in select courses there and by faculty at other institutions, offering a flexible platform to enhance active learning and feedback in academic settings.&lt;br /&gt;
&lt;br /&gt;
The reimplementation of Expertiza aims to mimic and enhance the application’s existing functionality with clean, well-structured code, while transitioning to a front-end application written in React and Typescipt integrated with a Ruby on Rails back-end.&lt;br /&gt;
&lt;br /&gt;
==Project Overview==&lt;br /&gt;
The goal of this project is to implement the Questionnaire Management Dashboard and Create/Edit Rubric pages in Expertiza by reimplementing its frontend using React with TypeScript, while integrating it with the existing Ruby on Rails backend APIs in the reimplementation backend repo. The new implementation will improve user experience, maintainability, and scalability while preserving core functionalities.&lt;br /&gt;
&lt;br /&gt;
This project covers:&lt;br /&gt;
&lt;br /&gt;
* Developing a React-based UI for managing questionnaire rubrics.&lt;br /&gt;
&lt;br /&gt;
* Enabling navigation to a new page when clicking the &amp;quot;+&amp;quot; button to create a specific rubric for a questionnaire type.&lt;br /&gt;
&lt;br /&gt;
* Ensuring seamless API integration with the reimplementation backend repo.&lt;br /&gt;
&lt;br /&gt;
* Managing user sessions and authentication securely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While adhering to the following best practices: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Component Reusability (DRY Principle)&amp;lt;/strong&amp;gt;: Design reusable and modular components to avoid duplication and simplify maintenance, adhering to the &amp;quot;Don't Repeat Yourself&amp;quot; principle.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Separation of Concerns&amp;lt;/strong&amp;gt;: Keep the UI, state management, and business logic separated. Use container components for state and logic and presentational components for rendering.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Responsive and Accessible Design&amp;lt;/strong&amp;gt;: Ensure the UI adapts to different devices and meets accessibility standards (e.g., ARIA roles, keyboard navigation, and proper contrast).&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type Safety with TypeScript&amp;lt;/strong&amp;gt;: Use TypeScript interfaces and types to ensure data consistency, reduce runtime errors.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Single Responsibility Principle&amp;lt;/strong&amp;gt;: Each component or function should have a single, well-defined purpose to improve clarity, testability, and scalability.&lt;br /&gt;
&lt;br /&gt;
==What Needs to be Done?==&lt;br /&gt;
===Questionnaire Management Dashboard===&lt;br /&gt;
&lt;br /&gt;
Displays a list of questionnaire types (Review, Metareview, Author Feedback, etc.)&lt;br /&gt;
* Each questionnaire type has a &amp;quot;+&amp;quot; button, which, when clicked, navigates to a new page for creating a specific rubric for that questionnaire type.&lt;br /&gt;
* Data is fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx1x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===Create/Edit Rubric Page===&lt;br /&gt;
&lt;br /&gt;
This page is displayed when a user clicks the &amp;quot;+&amp;quot; button from the dashboard.&lt;br /&gt;
&lt;br /&gt;
Allows users to:&lt;br /&gt;
* Enter a name for the rubric.&lt;br /&gt;
* Define min/max item scores.&lt;br /&gt;
* Set the review visibility (private/public).&lt;br /&gt;
* Add criteria for evaluation.&lt;br /&gt;
* Submit the form to create a new rubric for the selected questionnaire type.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx2x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Backend Integration==&lt;br /&gt;
&lt;br /&gt;
The frontend interacts with several key resources exposed by the backend through a RESTful API. The structure of each model's associated database table lets us define Typescript interfaces, transform request/response payloads and promote type safety.&lt;br /&gt;
&lt;br /&gt;
===Models===&lt;br /&gt;
&lt;br /&gt;
====Questionnaire====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Questionnaire&amp;lt;/code&amp;gt; model forms the foundation of the Create/Edit form functionality, storing necessary attributes for each questionnaire. These fields are used to construct a form for editing or creating a rubric and to prepopulate the form when editing an existing rubric. &lt;br /&gt;
&lt;br /&gt;
The backend database also includes a table of &amp;lt;code&amp;gt;questionnaire_types&amp;lt;/code&amp;gt;, access to which would allow the Questionnaire Management Dashboard to dynamically render all available categories of questionnaires and enable users to initiate the creation process based on a selected type. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| name || The name/title of the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instructor_id || Foreign key referencing the instructor who created it&lt;br /&gt;
|-&lt;br /&gt;
| private || Boolean indicating if the questionnaire is private&lt;br /&gt;
|-&lt;br /&gt;
| min_question_score || Minimum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| max_question_score || Maximum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_type || The type/category of questionnaire (e.g., Survey, Teammate Review)&lt;br /&gt;
|-&lt;br /&gt;
| display_type || Field for specifying how to display the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instruction_loc || Field for custom instructions location or reference&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of questionnaire creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Item====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; model represents individual items (or questions) within a questionnaire and includes attributes that should be included when adding an item to a particular questionnaire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the item&lt;br /&gt;
|-&lt;br /&gt;
| txt || The text of the item/question&lt;br /&gt;
|-&lt;br /&gt;
| weight || The relative importance or weight of the item&lt;br /&gt;
|-&lt;br /&gt;
| seq || The sequence/order of the item in the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| question_type || Foreign key referencing the type of question&lt;br /&gt;
|-&lt;br /&gt;
| size || Size attribute for text-based answers (e.g., text area size)&lt;br /&gt;
|-&lt;br /&gt;
| alternatives || Possible answer choices (comma-separated for multiple-choice)&lt;br /&gt;
|-&lt;br /&gt;
| break_before || Boolean indicating whether to insert a page break before the item&lt;br /&gt;
|-&lt;br /&gt;
| max_label || Optional label for the maximum scale value&lt;br /&gt;
|-&lt;br /&gt;
| min_label || Optional label for the minimum scale value&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of item creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_id || Foreign key referencing the associated questionnaire&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===API Endpoints===&lt;br /&gt;
&lt;br /&gt;
To facilitate interaction with the backend, the frontend uses a pre-configured &amp;lt;code&amp;gt;axiosClient&amp;lt;/code&amp;gt;, which abstracts the base API URL and port number. This client is defined in the &amp;lt;code&amp;gt;utils/axios_client.ts&amp;lt;/code&amp;gt; file and reused throughout the project for API communication. For questionnaire management, several key API routes are accessed using this client. For example, &amp;lt;code&amp;gt;GET /questionnaires/:id&amp;lt;/code&amp;gt; fetches detailed data for editing a selected questionnaire. When creating or updating a questionnaire, the application uses &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;, respectively.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! HTTP Method !! Endpoint !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires || Fetches a list of all questionnaires&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires/:id || Fetches a specific questionnaire by ID&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questionnaires || Creates a new questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questionnaires/:id || Updates an existing questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| DELETE || /questionnaires/:id || Deletes a specific questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions || Retrieves a list of all questions (items)&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions/:id || Retrieves a specific item, along with its rendered display&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questions || Creates a new item for a questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questions/:id || Updates an existing item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
====Manage Questionnaires====&lt;br /&gt;
&lt;br /&gt;
To navigate to the Questionnaire Management Dashboard, &amp;lt;strong&amp;gt;Questionnaire&amp;lt;/strong&amp;gt; from the &amp;lt;strong&amp;gt;Manage&amp;lt;/strong&amp;gt; dropdown from any page on Expertiza.&lt;br /&gt;
&lt;br /&gt;
To be consistent with other management pages (for Users, Courses, Assignements) in the reimplementation front end, a table of questionnaires belonging to the logged-in instructor is visible on the page. From this page, you may create, edit, or delete a questionnaire. &lt;br /&gt;
&lt;br /&gt;
To create a new questionnaire, click on the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button in the top left corner of the page. &lt;br /&gt;
&lt;br /&gt;
[[File:ManagementDashboard.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Type Selection====&lt;br /&gt;
&lt;br /&gt;
When the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button is selected from the top of the Questionnaire Management Dashboard, a pop-up appears with the available questionnaire types. To create a questionnaire of a given type, select the &amp;lt;strong&amp;gt;&amp;quot;+&amp;quot;&amp;lt;/strong&amp;gt; botton in the row of the desired type. &lt;br /&gt;
&lt;br /&gt;
[[File:TypeSelection.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Form====&lt;br /&gt;
&lt;br /&gt;
Once a type has been selected, the user is directed to the appropriate form to create a questionnaire of the selected type. The user can include a variable number of items to the questionnaire at the time of creation. The required fields for an item is determined by the item type. For example, a scale type item required minimum and maximum values for its scale. &lt;br /&gt;
&lt;br /&gt;
[[File:Questionnaire Form.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once a form field has been touched, the application alerts the user of missing required fields. Failure to provide appropriate values will prevent form submission. &lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2025-04-22 at 10.12.22 AM.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Upon successful submission, the newly-created questionnaire will appear in the list of questionnaires in the Questionnaire Management Dashboard. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaireselect.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To edit a questionnaire, select the edit icon next to the questionnaire you want to edit. You will be directed to a form with the existing questionnaire and items filled in. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaire.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireUtils.ts===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireUtils.ts&amp;lt;/code&amp;gt; file serves as a utility module for handling questionnaire-related functionality in the application, including interfaces, data transformation methods, and back-end data retrieval. This file helps maintain clear separation of concerns, type safety, and adherence to design principles such as the Single Responsibility Principle (SRP).&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireForm.tsx===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt; file is a React component that provides a form interface for creating or editing questionnaires. It integrates with Formik for form state management and validation, utilizing React Bootstrap for UI elements.&lt;br /&gt;
&lt;br /&gt;
The form fields are strongly typed using Formik's &amp;lt;code&amp;gt;Field&amp;lt;/code&amp;gt; components and the &amp;lt;code&amp;gt;QuestionnaireFormValues&amp;lt;/code&amp;gt; interface, ensuring that the data entered by the user adheres to the correct structure.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Name&amp;lt;/strong&amp;gt;: A text field for entering the questionnaire name.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type&amp;lt;/strong&amp;gt;: A hidden input used to specify the type of the questionnaire selected from the Questionnaire Management Dashboard and to be passed to the back-end.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Private&amp;lt;/strong&amp;gt;: A checkbox to indicate whether the questionnaire is private.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Minimum/Maximum Question Scores&amp;lt;/strong&amp;gt;: Numeric fields for setting the minimum and maximum scores for questions.&lt;br /&gt;
&lt;br /&gt;
The form delegates the responsibility of handling questionnaire items to the &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray&amp;lt;/code&amp;gt; component, which allows users to add or remove items dynamically and keeps each component focused on a single responsibility.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireTypes.tsx===&lt;br /&gt;
This component renders a table that displays different types of questionnaires. Each row provides an action to navigate to the corresponding creation page for the selected questionnaire type. The &amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt; component from &amp;lt;code&amp;gt;components/Table/Table&amp;lt;/code&amp;gt; is used in adherence with the DRY Principle and the provided design guidelines.&lt;br /&gt;
&lt;br /&gt;
==Code Changes Summary==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Method / Function !! Before !! After / Changes Introduced !! Commit Summary&lt;br /&gt;
|-&lt;br /&gt;
| App.tsx || Routing to /questionnaire and /edit-questionnaire || Not defined or incomplete || Added `ProtectedRoute` wrappers and proper routing to `Questionnaire` and `EditQuestionnaire` || Updated App.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || render(), type grouping || Basic list display || Grouped by type, added &amp;quot;+&amp;quot; button for creating new rubrics || Update Questionnaire.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || Add rubric handler || Not implemented || Clicking &amp;quot;+&amp;quot; navigates to `edit-questionnaire` with type parameter || More UI updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Form handling &amp;amp; API integration || Static layout || Full integration with axios POST/PUT calls to backend || updated interface so it can now update backend&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Questionnaire name editing || Not available || Name can now be edited from the UI || More functionality updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Display and manage rubric items || Static list || Dynamically displays and adds rubric items || Properly displays items and properly adds items&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire.tsx || Icons and UI elements || No icons || Edit, delete, and copy icons added for each row || More UI updates, including icons&lt;br /&gt;
|-&lt;br /&gt;
| axios_client.ts || axios client usage || Not standardized || Shared axiosClient used for API calls across all pages || Integrated across changes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Files Modified==&lt;br /&gt;
The following files were created or modified to implement the questionnaire dashboard and rubric management UI in React with TypeScript:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/Questionnaire/questionnaire.tsx&amp;lt;/code&amp;gt; – Implements the Questionnaire Management Dashboard UI and groups questionnaires by type with &amp;quot;+&amp;quot; action buttons.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; – Create/Edit Rubric page that handles full form logic and submission.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/App.tsx&amp;lt;/code&amp;gt; – Updated routing to include new paths: &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/edit-questionnaire&amp;lt;/code&amp;gt;, protected via &amp;lt;code&amp;gt;ProtectedRoute&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/assets/icons/&amp;lt;/code&amp;gt; – Added new UI icons for edit, delete, and copy actions in the questionnaire list.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/utils/axios_client.ts&amp;lt;/code&amp;gt; – Preconfigured &amp;lt;code&amp;gt;axios&amp;lt;/code&amp;gt; instance used throughout the frontend for API interactions.&lt;br /&gt;
*&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;package-lock.json&amp;lt;/code&amp;gt; – Updated dependencies for React Bootstrap, Formik, and icon support.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; The previously separate files like &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray.tsx&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;QuestionnaireUtils.tsx&amp;lt;/code&amp;gt; were refactored and consolidated into &amp;lt;code&amp;gt;EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; for improved maintainability.&lt;br /&gt;
&lt;br /&gt;
==Test Plan - Manual Testing Strategy==&lt;br /&gt;
====Login Credentials====&lt;br /&gt;
To login to the application, use the following credentials:&lt;br /&gt;
* &amp;lt;strong&amp;gt;username:&amp;lt;/strong&amp;gt; instructor6  &lt;br /&gt;
* &amp;lt;strong&amp;gt;password:&amp;lt;/strong&amp;gt; password&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Dashboard Loading====&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and confirm that all types of questionnaires are displayed.&lt;br /&gt;
* &amp;quot;+&amp;quot; button next to each type should open the rubric creation form with the correct type preselected.&lt;br /&gt;
&lt;br /&gt;
====Form Functionality====&lt;br /&gt;
* Enter name, min/max scores, and toggle the private/public checkbox.&lt;br /&gt;
* Dynamically add or remove criteria.&lt;br /&gt;
* Submit the form to create a new rubric and confirm it reflects on the dashboard.&lt;br /&gt;
&lt;br /&gt;
====Edit Rubric====&lt;br /&gt;
* Click on an existing rubric's &amp;quot;Edit&amp;quot; icon to load it in the edit form.&lt;br /&gt;
* Modify any field (name, score range, criteria) and resubmit.&lt;br /&gt;
* Confirm updated rubric details persist and are displayed correctly.&lt;br /&gt;
&lt;br /&gt;
====Form Validation====&lt;br /&gt;
* Leave required fields empty and confirm that validation messages are displayed.&lt;br /&gt;
* Enter invalid values (e.g., &amp;lt;code&amp;gt;max_score &amp;amp;lt; min_score&amp;lt;/code&amp;gt;) and confirm appropriate warnings are shown.&lt;br /&gt;
&lt;br /&gt;
====API Communication====&lt;br /&gt;
* Verify that form submissions trigger &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Confirm that response handling updates the UI appropriately (e.g., rerenders list on successful save).&lt;br /&gt;
&lt;br /&gt;
====UI Testing====&lt;br /&gt;
* Confirm that the layout is responsive across desktop, tablet, and mobile devices.&lt;br /&gt;
* Ensure accessibility: keyboard navigation works, form fields are properly labeled, and ARIA roles are used where needed.&lt;br /&gt;
&lt;br /&gt;
==Team==&lt;br /&gt;
=====Mentor===== &lt;br /&gt;
*Prathyusha Kodali - pkodali&lt;br /&gt;
&lt;br /&gt;
=====Members===== &lt;br /&gt;
*Ashwin Muniswamy - akumarm&lt;br /&gt;
*Michael Anderson - mwander5&lt;br /&gt;
*Martina Viola - mmviola&lt;br /&gt;
&lt;br /&gt;
==Reference Links==&lt;br /&gt;
*[https://expertiza.ncsu.edu/tree_display/list?currCtlr=Questionnaires Questionnaire Management Dashboard]&lt;br /&gt;
*[https://expertiza.ncsu.edu/questionnaires/new?model=ReviewQuestionnaire&amp;amp;private=1 Create/Edit Rubric Page]&lt;br /&gt;
*[https://github.com/Michael-Anderson-NCSU/reimplementation-front-end Project Repo]&lt;br /&gt;
*[http://152.7.176.255:8080 VCL Deployment]&lt;br /&gt;
*[https://github.com/expertiza/reimplementation-front-end/pull/94 Pull Request]&lt;br /&gt;
&lt;br /&gt;
=====Demo Video=====&lt;br /&gt;
*[https://youtu.be/eVViM9_Gg80, Demo Video]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=164761</id>
		<title>CSC/ECE 517 Spring 2025 - E2538 Reimplementing Questionnaire Page in Expertiza</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=164761"/>
		<updated>2025-04-22T22:10:47Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* Reference Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2538 Reimplementing Questionnaire Page==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==About Expertiza==&lt;br /&gt;
Expertiza is an open-source web application currently built using [http://rubyonrails.org/ Ruby on Rails] and led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Designed for educational use, it enables instructors to manage assignments, rubrics, and participants, as well as assign grades and monitor student progress. Students can submit various types of learning objects, form teams, conduct peer evaluations, and review feedback from both peers and instructors. Originally developed at NC State, Expertiza is now used in select courses there and by faculty at other institutions, offering a flexible platform to enhance active learning and feedback in academic settings.&lt;br /&gt;
&lt;br /&gt;
The reimplementation of Expertiza aims to mimic and enhance the application’s existing functionality with clean, well-structured code, while transitioning to a front-end application written in React and Typescipt integrated with a Ruby on Rails back-end.&lt;br /&gt;
&lt;br /&gt;
==Project Overview==&lt;br /&gt;
The goal of this project is to implement the Questionnaire Management Dashboard and Create/Edit Rubric pages in Expertiza by reimplementing its frontend using React with TypeScript, while integrating it with the existing Ruby on Rails backend APIs in the reimplementation backend repo. The new implementation will improve user experience, maintainability, and scalability while preserving core functionalities.&lt;br /&gt;
&lt;br /&gt;
This project covers:&lt;br /&gt;
&lt;br /&gt;
* Developing a React-based UI for managing questionnaire rubrics.&lt;br /&gt;
&lt;br /&gt;
* Enabling navigation to a new page when clicking the &amp;quot;+&amp;quot; button to create a specific rubric for a questionnaire type.&lt;br /&gt;
&lt;br /&gt;
* Ensuring seamless API integration with the reimplementation backend repo.&lt;br /&gt;
&lt;br /&gt;
* Managing user sessions and authentication securely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While adhering to the following best practices: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Component Reusability (DRY Principle)&amp;lt;/strong&amp;gt;: Design reusable and modular components to avoid duplication and simplify maintenance, adhering to the &amp;quot;Don't Repeat Yourself&amp;quot; principle.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Separation of Concerns&amp;lt;/strong&amp;gt;: Keep the UI, state management, and business logic separated. Use container components for state and logic and presentational components for rendering.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Responsive and Accessible Design&amp;lt;/strong&amp;gt;: Ensure the UI adapts to different devices and meets accessibility standards (e.g., ARIA roles, keyboard navigation, and proper contrast).&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type Safety with TypeScript&amp;lt;/strong&amp;gt;: Use TypeScript interfaces and types to ensure data consistency, reduce runtime errors.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Single Responsibility Principle&amp;lt;/strong&amp;gt;: Each component or function should have a single, well-defined purpose to improve clarity, testability, and scalability.&lt;br /&gt;
&lt;br /&gt;
==What Needs to be Done?==&lt;br /&gt;
===Questionnaire Management Dashboard===&lt;br /&gt;
&lt;br /&gt;
Displays a list of questionnaire types (Review, Metareview, Author Feedback, etc.)&lt;br /&gt;
* Each questionnaire type has a &amp;quot;+&amp;quot; button, which, when clicked, navigates to a new page for creating a specific rubric for that questionnaire type.&lt;br /&gt;
* Data is fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx1x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===Create/Edit Rubric Page===&lt;br /&gt;
&lt;br /&gt;
This page is displayed when a user clicks the &amp;quot;+&amp;quot; button from the dashboard.&lt;br /&gt;
&lt;br /&gt;
Allows users to:&lt;br /&gt;
* Enter a name for the rubric.&lt;br /&gt;
* Define min/max item scores.&lt;br /&gt;
* Set the review visibility (private/public).&lt;br /&gt;
* Add criteria for evaluation.&lt;br /&gt;
* Submit the form to create a new rubric for the selected questionnaire type.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx2x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Backend Integration==&lt;br /&gt;
&lt;br /&gt;
The frontend interacts with several key resources exposed by the backend through a RESTful API. The structure of each model's associated database table lets us define Typescript interfaces, transform request/response payloads and promote type safety.&lt;br /&gt;
&lt;br /&gt;
===Models===&lt;br /&gt;
&lt;br /&gt;
====Questionnaire====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Questionnaire&amp;lt;/code&amp;gt; model forms the foundation of the Create/Edit form functionality, storing necessary attributes for each questionnaire. These fields are used to construct a form for editing or creating a rubric and to prepopulate the form when editing an existing rubric. &lt;br /&gt;
&lt;br /&gt;
The backend database also includes a table of &amp;lt;code&amp;gt;questionnaire_types&amp;lt;/code&amp;gt;, access to which would allow the Questionnaire Management Dashboard to dynamically render all available categories of questionnaires and enable users to initiate the creation process based on a selected type. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| name || The name/title of the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instructor_id || Foreign key referencing the instructor who created it&lt;br /&gt;
|-&lt;br /&gt;
| private || Boolean indicating if the questionnaire is private&lt;br /&gt;
|-&lt;br /&gt;
| min_question_score || Minimum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| max_question_score || Maximum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_type || The type/category of questionnaire (e.g., Survey, Teammate Review)&lt;br /&gt;
|-&lt;br /&gt;
| display_type || Field for specifying how to display the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instruction_loc || Field for custom instructions location or reference&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of questionnaire creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Item====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; model represents individual items (or questions) within a questionnaire and includes attributes that should be included when adding an item to a particular questionnaire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the item&lt;br /&gt;
|-&lt;br /&gt;
| txt || The text of the item/question&lt;br /&gt;
|-&lt;br /&gt;
| weight || The relative importance or weight of the item&lt;br /&gt;
|-&lt;br /&gt;
| seq || The sequence/order of the item in the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| question_type || Foreign key referencing the type of question&lt;br /&gt;
|-&lt;br /&gt;
| size || Size attribute for text-based answers (e.g., text area size)&lt;br /&gt;
|-&lt;br /&gt;
| alternatives || Possible answer choices (comma-separated for multiple-choice)&lt;br /&gt;
|-&lt;br /&gt;
| break_before || Boolean indicating whether to insert a page break before the item&lt;br /&gt;
|-&lt;br /&gt;
| max_label || Optional label for the maximum scale value&lt;br /&gt;
|-&lt;br /&gt;
| min_label || Optional label for the minimum scale value&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of item creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_id || Foreign key referencing the associated questionnaire&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===API Endpoints===&lt;br /&gt;
&lt;br /&gt;
To facilitate interaction with the backend, the frontend uses a pre-configured &amp;lt;code&amp;gt;axiosClient&amp;lt;/code&amp;gt;, which abstracts the base API URL and port number. This client is defined in the &amp;lt;code&amp;gt;utils/axios_client.ts&amp;lt;/code&amp;gt; file and reused throughout the project for API communication. For questionnaire management, several key API routes are accessed using this client. For example, &amp;lt;code&amp;gt;GET /questionnaires/:id&amp;lt;/code&amp;gt; fetches detailed data for editing a selected questionnaire. When creating or updating a questionnaire, the application uses &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;, respectively.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! HTTP Method !! Endpoint !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires || Fetches a list of all questionnaires&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires/:id || Fetches a specific questionnaire by ID&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questionnaires || Creates a new questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questionnaires/:id || Updates an existing questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| DELETE || /questionnaires/:id || Deletes a specific questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions || Retrieves a list of all questions (items)&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions/:id || Retrieves a specific item, along with its rendered display&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questions || Creates a new item for a questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questions/:id || Updates an existing item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
====Manage Questionnaires====&lt;br /&gt;
&lt;br /&gt;
To navigate to the Questionnaire Management Dashboard, &amp;lt;strong&amp;gt;Questionnaire&amp;lt;/strong&amp;gt; from the &amp;lt;strong&amp;gt;Manage&amp;lt;/strong&amp;gt; dropdown from any page on Expertiza.&lt;br /&gt;
&lt;br /&gt;
To be consistent with other management pages (for Users, Courses, Assignements) in the reimplementation front end, a table of questionnaires belonging to the logged-in instructor is visible on the page. From this page, you may create, edit, or delete a questionnaire. &lt;br /&gt;
&lt;br /&gt;
To create a new questionnaire, click on the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button in the top left corner of the page. &lt;br /&gt;
&lt;br /&gt;
[[File:ManagementDashboard.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Type Selection====&lt;br /&gt;
&lt;br /&gt;
When the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button is selected from the top of the Questionnaire Management Dashboard, a pop-up appears with the available questionnaire types. To create a questionnaire of a given type, select the &amp;lt;strong&amp;gt;&amp;quot;+&amp;quot;&amp;lt;/strong&amp;gt; botton in the row of the desired type. &lt;br /&gt;
&lt;br /&gt;
[[File:TypeSelection.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Form====&lt;br /&gt;
&lt;br /&gt;
Once a type has been selected, the user is directed to the appropriate form to create a questionnaire of the selected type. The user can include a variable number of items to the questionnaire at the time of creation. The required fields for an item is determined by the item type. For example, a scale type item required minimum and maximum values for its scale. &lt;br /&gt;
&lt;br /&gt;
[[File:Questionnaire Form.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once a form field has been touched, the application alerts the user of missing required fields. Failure to provide appropriate values will prevent form submission. &lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2025-04-22 at 10.12.22 AM.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Upon successful submission, the newly-created questionnaire will appear in the list of questionnaires in the Questionnaire Management Dashboard. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaireselect.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To edit a questionnaire, select the edit icon next to the questionnaire you want to edit. You will be directed to a form with the existing questionnaire and items filled in. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaire.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireUtils.ts===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireUtils.ts&amp;lt;/code&amp;gt; file serves as a utility module for handling questionnaire-related functionality in the application, including interfaces, data transformation methods, and back-end data retrieval. This file helps maintain clear separation of concerns, type safety, and adherence to design principles such as the Single Responsibility Principle (SRP).&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireForm.tsx===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt; file is a React component that provides a form interface for creating or editing questionnaires. It integrates with Formik for form state management and validation, utilizing React Bootstrap for UI elements.&lt;br /&gt;
&lt;br /&gt;
The form fields are strongly typed using Formik's &amp;lt;code&amp;gt;Field&amp;lt;/code&amp;gt; components and the &amp;lt;code&amp;gt;QuestionnaireFormValues&amp;lt;/code&amp;gt; interface, ensuring that the data entered by the user adheres to the correct structure.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Name&amp;lt;/strong&amp;gt;: A text field for entering the questionnaire name.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type&amp;lt;/strong&amp;gt;: A hidden input used to specify the type of the questionnaire selected from the Questionnaire Management Dashboard and to be passed to the back-end.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Private&amp;lt;/strong&amp;gt;: A checkbox to indicate whether the questionnaire is private.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Minimum/Maximum Question Scores&amp;lt;/strong&amp;gt;: Numeric fields for setting the minimum and maximum scores for questions.&lt;br /&gt;
&lt;br /&gt;
The form delegates the responsibility of handling questionnaire items to the &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray&amp;lt;/code&amp;gt; component, which allows users to add or remove items dynamically and keeps each component focused on a single responsibility.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireTypes.tsx===&lt;br /&gt;
This component renders a table that displays different types of questionnaires. Each row provides an action to navigate to the corresponding creation page for the selected questionnaire type. The &amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt; component from &amp;lt;code&amp;gt;components/Table/Table&amp;lt;/code&amp;gt; is used in adherence with the DRY Principle and the provided design guidelines.&lt;br /&gt;
&lt;br /&gt;
==Code Changes Summary==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Method / Function !! Before !! After / Changes Introduced !! Commit Summary&lt;br /&gt;
|-&lt;br /&gt;
| App.tsx || Routing to /questionnaire and /edit-questionnaire || Not defined or incomplete || Added `ProtectedRoute` wrappers and proper routing to `Questionnaire` and `EditQuestionnaire` || Updated App.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || render(), type grouping || Basic list display || Grouped by type, added &amp;quot;+&amp;quot; button for creating new rubrics || Update Questionnaire.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || Add rubric handler || Not implemented || Clicking &amp;quot;+&amp;quot; navigates to `edit-questionnaire` with type parameter || More UI updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Form handling &amp;amp; API integration || Static layout || Full integration with axios POST/PUT calls to backend || updated interface so it can now update backend&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Questionnaire name editing || Not available || Name can now be edited from the UI || More functionality updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Display and manage rubric items || Static list || Dynamically displays and adds rubric items || Properly displays items and properly adds items&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire.tsx || Icons and UI elements || No icons || Edit, delete, and copy icons added for each row || More UI updates, including icons&lt;br /&gt;
|-&lt;br /&gt;
| axios_client.ts || axios client usage || Not standardized || Shared axiosClient used for API calls across all pages || Integrated across changes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Files Modified==&lt;br /&gt;
The following files were created or modified to implement the questionnaire dashboard and rubric management UI in React with TypeScript:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/Questionnaire/questionnaire.tsx&amp;lt;/code&amp;gt; – Implements the Questionnaire Management Dashboard UI and groups questionnaires by type with &amp;quot;+&amp;quot; action buttons.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; – Create/Edit Rubric page that handles full form logic and submission.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/App.tsx&amp;lt;/code&amp;gt; – Updated routing to include new paths: &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/edit-questionnaire&amp;lt;/code&amp;gt;, protected via &amp;lt;code&amp;gt;ProtectedRoute&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/assets/icons/&amp;lt;/code&amp;gt; – Added new UI icons for edit, delete, and copy actions in the questionnaire list.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/utils/axios_client.ts&amp;lt;/code&amp;gt; – Preconfigured &amp;lt;code&amp;gt;axios&amp;lt;/code&amp;gt; instance used throughout the frontend for API interactions.&lt;br /&gt;
*&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;package-lock.json&amp;lt;/code&amp;gt; – Updated dependencies for React Bootstrap, Formik, and icon support.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; The previously separate files like &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray.tsx&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;QuestionnaireUtils.tsx&amp;lt;/code&amp;gt; were refactored and consolidated into &amp;lt;code&amp;gt;EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; for improved maintainability.&lt;br /&gt;
&lt;br /&gt;
==Test Plan - Manual Testing Strategy==&lt;br /&gt;
====Login Credentials====&lt;br /&gt;
To login to the application, use the following credentials:&lt;br /&gt;
* &amp;lt;strong&amp;gt;username:&amp;lt;/strong&amp;gt; instructor6  &lt;br /&gt;
* &amp;lt;strong&amp;gt;password:&amp;lt;/strong&amp;gt; password&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Dashboard Loading====&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and confirm that all types of questionnaires are displayed.&lt;br /&gt;
* &amp;quot;+&amp;quot; button next to each type should open the rubric creation form with the correct type preselected.&lt;br /&gt;
&lt;br /&gt;
====Form Functionality====&lt;br /&gt;
* Enter name, min/max scores, and toggle the private/public checkbox.&lt;br /&gt;
* Dynamically add or remove criteria.&lt;br /&gt;
* Submit the form to create a new rubric and confirm it reflects on the dashboard.&lt;br /&gt;
&lt;br /&gt;
====Edit Rubric====&lt;br /&gt;
* Click on an existing rubric's &amp;quot;Edit&amp;quot; icon to load it in the edit form.&lt;br /&gt;
* Modify any field (name, score range, criteria) and resubmit.&lt;br /&gt;
* Confirm updated rubric details persist and are displayed correctly.&lt;br /&gt;
&lt;br /&gt;
====Form Validation====&lt;br /&gt;
* Leave required fields empty and confirm that validation messages are displayed.&lt;br /&gt;
* Enter invalid values (e.g., &amp;lt;code&amp;gt;max_score &amp;amp;lt; min_score&amp;lt;/code&amp;gt;) and confirm appropriate warnings are shown.&lt;br /&gt;
&lt;br /&gt;
====API Communication====&lt;br /&gt;
* Verify that form submissions trigger &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Confirm that response handling updates the UI appropriately (e.g., rerenders list on successful save).&lt;br /&gt;
&lt;br /&gt;
====UI Testing====&lt;br /&gt;
* Confirm that the layout is responsive across desktop, tablet, and mobile devices.&lt;br /&gt;
* Ensure accessibility: keyboard navigation works, form fields are properly labeled, and ARIA roles are used where needed.&lt;br /&gt;
&lt;br /&gt;
==Team==&lt;br /&gt;
=====Mentor===== &lt;br /&gt;
*Prathyusha Kodali - pkodali&lt;br /&gt;
&lt;br /&gt;
=====Members===== &lt;br /&gt;
*Ashwin Muniswamy - akumarm&lt;br /&gt;
*Michael Anderson - mwander5&lt;br /&gt;
*Martina Viola - mmviola&lt;br /&gt;
&lt;br /&gt;
==Reference Links==&lt;br /&gt;
*[https://expertiza.ncsu.edu/tree_display/list?currCtlr=Questionnaires Questionnaire Management Dashboard]&lt;br /&gt;
*[https://expertiza.ncsu.edu/questionnaires/new?model=ReviewQuestionnaire&amp;amp;private=1 Create/Edit Rubric Page]&lt;br /&gt;
*[https://github.com/Michael-Anderson-NCSU/reimplementation-front-end Project Repo]&lt;br /&gt;
*[http://152.7.176.255:8080 VCL Deployment]&lt;br /&gt;
*[https://github.com/expertiza/reimplementation-front-end/pull/98 Pull Request]&lt;br /&gt;
&lt;br /&gt;
=====Demo Video=====&lt;br /&gt;
*[https://youtu.be/eVViM9_Gg80, Demo Video]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=164759</id>
		<title>CSC/ECE 517 Spring 2025 - E2538 Reimplementing Questionnaire Page in Expertiza</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=164759"/>
		<updated>2025-04-22T22:08:42Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* Reference Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2538 Reimplementing Questionnaire Page==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==About Expertiza==&lt;br /&gt;
Expertiza is an open-source web application currently built using [http://rubyonrails.org/ Ruby on Rails] and led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Designed for educational use, it enables instructors to manage assignments, rubrics, and participants, as well as assign grades and monitor student progress. Students can submit various types of learning objects, form teams, conduct peer evaluations, and review feedback from both peers and instructors. Originally developed at NC State, Expertiza is now used in select courses there and by faculty at other institutions, offering a flexible platform to enhance active learning and feedback in academic settings.&lt;br /&gt;
&lt;br /&gt;
The reimplementation of Expertiza aims to mimic and enhance the application’s existing functionality with clean, well-structured code, while transitioning to a front-end application written in React and Typescipt integrated with a Ruby on Rails back-end.&lt;br /&gt;
&lt;br /&gt;
==Project Overview==&lt;br /&gt;
The goal of this project is to implement the Questionnaire Management Dashboard and Create/Edit Rubric pages in Expertiza by reimplementing its frontend using React with TypeScript, while integrating it with the existing Ruby on Rails backend APIs in the reimplementation backend repo. The new implementation will improve user experience, maintainability, and scalability while preserving core functionalities.&lt;br /&gt;
&lt;br /&gt;
This project covers:&lt;br /&gt;
&lt;br /&gt;
* Developing a React-based UI for managing questionnaire rubrics.&lt;br /&gt;
&lt;br /&gt;
* Enabling navigation to a new page when clicking the &amp;quot;+&amp;quot; button to create a specific rubric for a questionnaire type.&lt;br /&gt;
&lt;br /&gt;
* Ensuring seamless API integration with the reimplementation backend repo.&lt;br /&gt;
&lt;br /&gt;
* Managing user sessions and authentication securely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While adhering to the following best practices: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Component Reusability (DRY Principle)&amp;lt;/strong&amp;gt;: Design reusable and modular components to avoid duplication and simplify maintenance, adhering to the &amp;quot;Don't Repeat Yourself&amp;quot; principle.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Separation of Concerns&amp;lt;/strong&amp;gt;: Keep the UI, state management, and business logic separated. Use container components for state and logic and presentational components for rendering.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Responsive and Accessible Design&amp;lt;/strong&amp;gt;: Ensure the UI adapts to different devices and meets accessibility standards (e.g., ARIA roles, keyboard navigation, and proper contrast).&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type Safety with TypeScript&amp;lt;/strong&amp;gt;: Use TypeScript interfaces and types to ensure data consistency, reduce runtime errors.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strong&amp;gt;Single Responsibility Principle&amp;lt;/strong&amp;gt;: Each component or function should have a single, well-defined purpose to improve clarity, testability, and scalability.&lt;br /&gt;
&lt;br /&gt;
==What Needs to be Done?==&lt;br /&gt;
===Questionnaire Management Dashboard===&lt;br /&gt;
&lt;br /&gt;
Displays a list of questionnaire types (Review, Metareview, Author Feedback, etc.)&lt;br /&gt;
* Each questionnaire type has a &amp;quot;+&amp;quot; button, which, when clicked, navigates to a new page for creating a specific rubric for that questionnaire type.&lt;br /&gt;
* Data is fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx1x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===Create/Edit Rubric Page===&lt;br /&gt;
&lt;br /&gt;
This page is displayed when a user clicks the &amp;quot;+&amp;quot; button from the dashboard.&lt;br /&gt;
&lt;br /&gt;
Allows users to:&lt;br /&gt;
* Enter a name for the rubric.&lt;br /&gt;
* Define min/max item scores.&lt;br /&gt;
* Set the review visibility (private/public).&lt;br /&gt;
* Add criteria for evaluation.&lt;br /&gt;
* Submit the form to create a new rubric for the selected questionnaire type.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx2x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Backend Integration==&lt;br /&gt;
&lt;br /&gt;
The frontend interacts with several key resources exposed by the backend through a RESTful API. The structure of each model's associated database table lets us define Typescript interfaces, transform request/response payloads and promote type safety.&lt;br /&gt;
&lt;br /&gt;
===Models===&lt;br /&gt;
&lt;br /&gt;
====Questionnaire====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Questionnaire&amp;lt;/code&amp;gt; model forms the foundation of the Create/Edit form functionality, storing necessary attributes for each questionnaire. These fields are used to construct a form for editing or creating a rubric and to prepopulate the form when editing an existing rubric. &lt;br /&gt;
&lt;br /&gt;
The backend database also includes a table of &amp;lt;code&amp;gt;questionnaire_types&amp;lt;/code&amp;gt;, access to which would allow the Questionnaire Management Dashboard to dynamically render all available categories of questionnaires and enable users to initiate the creation process based on a selected type. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| name || The name/title of the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instructor_id || Foreign key referencing the instructor who created it&lt;br /&gt;
|-&lt;br /&gt;
| private || Boolean indicating if the questionnaire is private&lt;br /&gt;
|-&lt;br /&gt;
| min_question_score || Minimum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| max_question_score || Maximum score that can be given to any question&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_type || The type/category of questionnaire (e.g., Survey, Teammate Review)&lt;br /&gt;
|-&lt;br /&gt;
| display_type || Field for specifying how to display the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| instruction_loc || Field for custom instructions location or reference&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of questionnaire creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Item====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt; model represents individual items (or questions) within a questionnaire and includes attributes that should be included when adding an item to a particular questionnaire.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Description&lt;br /&gt;
|-&lt;br /&gt;
| id || Unique identifier for the item&lt;br /&gt;
|-&lt;br /&gt;
| txt || The text of the item/question&lt;br /&gt;
|-&lt;br /&gt;
| weight || The relative importance or weight of the item&lt;br /&gt;
|-&lt;br /&gt;
| seq || The sequence/order of the item in the questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| question_type || Foreign key referencing the type of question&lt;br /&gt;
|-&lt;br /&gt;
| size || Size attribute for text-based answers (e.g., text area size)&lt;br /&gt;
|-&lt;br /&gt;
| alternatives || Possible answer choices (comma-separated for multiple-choice)&lt;br /&gt;
|-&lt;br /&gt;
| break_before || Boolean indicating whether to insert a page break before the item&lt;br /&gt;
|-&lt;br /&gt;
| max_label || Optional label for the maximum scale value&lt;br /&gt;
|-&lt;br /&gt;
| min_label || Optional label for the minimum scale value&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp of item creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp of last update&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire_id || Foreign key referencing the associated questionnaire&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===API Endpoints===&lt;br /&gt;
&lt;br /&gt;
To facilitate interaction with the backend, the frontend uses a pre-configured &amp;lt;code&amp;gt;axiosClient&amp;lt;/code&amp;gt;, which abstracts the base API URL and port number. This client is defined in the &amp;lt;code&amp;gt;utils/axios_client.ts&amp;lt;/code&amp;gt; file and reused throughout the project for API communication. For questionnaire management, several key API routes are accessed using this client. For example, &amp;lt;code&amp;gt;GET /questionnaires/:id&amp;lt;/code&amp;gt; fetches detailed data for editing a selected questionnaire. When creating or updating a questionnaire, the application uses &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;, respectively.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! HTTP Method !! Endpoint !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires || Fetches a list of all questionnaires&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questionnaires/:id || Fetches a specific questionnaire by ID&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questionnaires || Creates a new questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questionnaires/:id || Updates an existing questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| DELETE || /questionnaires/:id || Deletes a specific questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions || Retrieves a list of all questions (items)&lt;br /&gt;
|-&lt;br /&gt;
| GET || /questions/:id || Retrieves a specific item, along with its rendered display&lt;br /&gt;
|-&lt;br /&gt;
| POST || /questions || Creates a new item for a questionnaire&lt;br /&gt;
|-&lt;br /&gt;
| PUT || /questions/:id || Updates an existing item&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
====Manage Questionnaires====&lt;br /&gt;
&lt;br /&gt;
To navigate to the Questionnaire Management Dashboard, &amp;lt;strong&amp;gt;Questionnaire&amp;lt;/strong&amp;gt; from the &amp;lt;strong&amp;gt;Manage&amp;lt;/strong&amp;gt; dropdown from any page on Expertiza.&lt;br /&gt;
&lt;br /&gt;
To be consistent with other management pages (for Users, Courses, Assignements) in the reimplementation front end, a table of questionnaires belonging to the logged-in instructor is visible on the page. From this page, you may create, edit, or delete a questionnaire. &lt;br /&gt;
&lt;br /&gt;
To create a new questionnaire, click on the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button in the top left corner of the page. &lt;br /&gt;
&lt;br /&gt;
[[File:ManagementDashboard.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Type Selection====&lt;br /&gt;
&lt;br /&gt;
When the &amp;lt;strong&amp;gt;Create&amp;lt;/strong&amp;gt; button is selected from the top of the Questionnaire Management Dashboard, a pop-up appears with the available questionnaire types. To create a questionnaire of a given type, select the &amp;lt;strong&amp;gt;&amp;quot;+&amp;quot;&amp;lt;/strong&amp;gt; botton in the row of the desired type. &lt;br /&gt;
&lt;br /&gt;
[[File:TypeSelection.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Form====&lt;br /&gt;
&lt;br /&gt;
Once a type has been selected, the user is directed to the appropriate form to create a questionnaire of the selected type. The user can include a variable number of items to the questionnaire at the time of creation. The required fields for an item is determined by the item type. For example, a scale type item required minimum and maximum values for its scale. &lt;br /&gt;
&lt;br /&gt;
[[File:Questionnaire Form.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once a form field has been touched, the application alerts the user of missing required fields. Failure to provide appropriate values will prevent form submission. &lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2025-04-22 at 10.12.22 AM.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Upon successful submission, the newly-created questionnaire will appear in the list of questionnaires in the Questionnaire Management Dashboard. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaireselect.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To edit a questionnaire, select the edit icon next to the questionnaire you want to edit. You will be directed to a form with the existing questionnaire and items filled in. &lt;br /&gt;
&lt;br /&gt;
[[File:Editquestionnaire.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireUtils.ts===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireUtils.ts&amp;lt;/code&amp;gt; file serves as a utility module for handling questionnaire-related functionality in the application, including interfaces, data transformation methods, and back-end data retrieval. This file helps maintain clear separation of concerns, type safety, and adherence to design principles such as the Single Responsibility Principle (SRP).&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireForm.tsx===&lt;br /&gt;
The &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt; file is a React component that provides a form interface for creating or editing questionnaires. It integrates with Formik for form state management and validation, utilizing React Bootstrap for UI elements.&lt;br /&gt;
&lt;br /&gt;
The form fields are strongly typed using Formik's &amp;lt;code&amp;gt;Field&amp;lt;/code&amp;gt; components and the &amp;lt;code&amp;gt;QuestionnaireFormValues&amp;lt;/code&amp;gt; interface, ensuring that the data entered by the user adheres to the correct structure.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Name&amp;lt;/strong&amp;gt;: A text field for entering the questionnaire name.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Type&amp;lt;/strong&amp;gt;: A hidden input used to specify the type of the questionnaire selected from the Questionnaire Management Dashboard and to be passed to the back-end.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Private&amp;lt;/strong&amp;gt;: A checkbox to indicate whether the questionnaire is private.&lt;br /&gt;
*&amp;lt;strong&amp;gt;Minimum/Maximum Question Scores&amp;lt;/strong&amp;gt;: Numeric fields for setting the minimum and maximum scores for questions.&lt;br /&gt;
&lt;br /&gt;
The form delegates the responsibility of handling questionnaire items to the &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray&amp;lt;/code&amp;gt; component, which allows users to add or remove items dynamically and keeps each component focused on a single responsibility.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===QuestionnaireTypes.tsx===&lt;br /&gt;
This component renders a table that displays different types of questionnaires. Each row provides an action to navigate to the corresponding creation page for the selected questionnaire type. The &amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt; component from &amp;lt;code&amp;gt;components/Table/Table&amp;lt;/code&amp;gt; is used in adherence with the DRY Principle and the provided design guidelines.&lt;br /&gt;
&lt;br /&gt;
==Code Changes Summary==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Method / Function !! Before !! After / Changes Introduced !! Commit Summary&lt;br /&gt;
|-&lt;br /&gt;
| App.tsx || Routing to /questionnaire and /edit-questionnaire || Not defined or incomplete || Added `ProtectedRoute` wrappers and proper routing to `Questionnaire` and `EditQuestionnaire` || Updated App.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || render(), type grouping || Basic list display || Grouped by type, added &amp;quot;+&amp;quot; button for creating new rubrics || Update Questionnaire.tsx&lt;br /&gt;
|-&lt;br /&gt;
| Questionnaire.tsx || Add rubric handler || Not implemented || Clicking &amp;quot;+&amp;quot; navigates to `edit-questionnaire` with type parameter || More UI updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Form handling &amp;amp; API integration || Static layout || Full integration with axios POST/PUT calls to backend || updated interface so it can now update backend&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Questionnaire name editing || Not available || Name can now be edited from the UI || More functionality updates&lt;br /&gt;
|-&lt;br /&gt;
| EditQuestionnaire.tsx || Display and manage rubric items || Static list || Dynamically displays and adds rubric items || Properly displays items and properly adds items&lt;br /&gt;
|-&lt;br /&gt;
| questionnaire.tsx || Icons and UI elements || No icons || Edit, delete, and copy icons added for each row || More UI updates, including icons&lt;br /&gt;
|-&lt;br /&gt;
| axios_client.ts || axios client usage || Not standardized || Shared axiosClient used for API calls across all pages || Integrated across changes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Files Modified==&lt;br /&gt;
The following files were created or modified to implement the questionnaire dashboard and rubric management UI in React with TypeScript:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/Questionnaire/questionnaire.tsx&amp;lt;/code&amp;gt; – Implements the Questionnaire Management Dashboard UI and groups questionnaires by type with &amp;quot;+&amp;quot; action buttons.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/pages/EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; – Create/Edit Rubric page that handles full form logic and submission.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/App.tsx&amp;lt;/code&amp;gt; – Updated routing to include new paths: &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/edit-questionnaire&amp;lt;/code&amp;gt;, protected via &amp;lt;code&amp;gt;ProtectedRoute&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/assets/icons/&amp;lt;/code&amp;gt; – Added new UI icons for edit, delete, and copy actions in the questionnaire list.&lt;br /&gt;
*&amp;lt;code&amp;gt;src/utils/axios_client.ts&amp;lt;/code&amp;gt; – Preconfigured &amp;lt;code&amp;gt;axios&amp;lt;/code&amp;gt; instance used throughout the frontend for API interactions.&lt;br /&gt;
*&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;package-lock.json&amp;lt;/code&amp;gt; – Updated dependencies for React Bootstrap, Formik, and icon support.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; The previously separate files like &amp;lt;code&amp;gt;QuestionnaireForm.tsx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;QuestionnaireItemsFieldArray.tsx&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;QuestionnaireUtils.tsx&amp;lt;/code&amp;gt; were refactored and consolidated into &amp;lt;code&amp;gt;EditQuestionnaire/Questionnaire.tsx&amp;lt;/code&amp;gt; for improved maintainability.&lt;br /&gt;
&lt;br /&gt;
==Test Plan - Manual Testing Strategy==&lt;br /&gt;
====Login Credentials====&lt;br /&gt;
To login to the application, use the following credentials:&lt;br /&gt;
* &amp;lt;strong&amp;gt;username:&amp;lt;/strong&amp;gt; instructor6  &lt;br /&gt;
* &amp;lt;strong&amp;gt;password:&amp;lt;/strong&amp;gt; password&lt;br /&gt;
&lt;br /&gt;
====Questionnaire Dashboard Loading====&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;/questionnaire&amp;lt;/code&amp;gt; and confirm that all types of questionnaires are displayed.&lt;br /&gt;
* &amp;quot;+&amp;quot; button next to each type should open the rubric creation form with the correct type preselected.&lt;br /&gt;
&lt;br /&gt;
====Form Functionality====&lt;br /&gt;
* Enter name, min/max scores, and toggle the private/public checkbox.&lt;br /&gt;
* Dynamically add or remove criteria.&lt;br /&gt;
* Submit the form to create a new rubric and confirm it reflects on the dashboard.&lt;br /&gt;
&lt;br /&gt;
====Edit Rubric====&lt;br /&gt;
* Click on an existing rubric's &amp;quot;Edit&amp;quot; icon to load it in the edit form.&lt;br /&gt;
* Modify any field (name, score range, criteria) and resubmit.&lt;br /&gt;
* Confirm updated rubric details persist and are displayed correctly.&lt;br /&gt;
&lt;br /&gt;
====Form Validation====&lt;br /&gt;
* Leave required fields empty and confirm that validation messages are displayed.&lt;br /&gt;
* Enter invalid values (e.g., &amp;lt;code&amp;gt;max_score &amp;amp;lt; min_score&amp;lt;/code&amp;gt;) and confirm appropriate warnings are shown.&lt;br /&gt;
&lt;br /&gt;
====API Communication====&lt;br /&gt;
* Verify that form submissions trigger &amp;lt;code&amp;gt;POST /questionnaires&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;PUT /questionnaires/:id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Confirm that response handling updates the UI appropriately (e.g., rerenders list on successful save).&lt;br /&gt;
&lt;br /&gt;
====UI Testing====&lt;br /&gt;
* Confirm that the layout is responsive across desktop, tablet, and mobile devices.&lt;br /&gt;
* Ensure accessibility: keyboard navigation works, form fields are properly labeled, and ARIA roles are used where needed.&lt;br /&gt;
&lt;br /&gt;
==Team==&lt;br /&gt;
=====Mentor===== &lt;br /&gt;
*Prathyusha Kodali - pkodali&lt;br /&gt;
&lt;br /&gt;
=====Members===== &lt;br /&gt;
*Ashwin Muniswamy - akumarm&lt;br /&gt;
*Michael Anderson - mwander5&lt;br /&gt;
*Martina Viola - mmviola&lt;br /&gt;
&lt;br /&gt;
==Reference Links==&lt;br /&gt;
*[https://expertiza.ncsu.edu/tree_display/list?currCtlr=Questionnaires Questionnaire Management Dashboard]&lt;br /&gt;
*[https://expertiza.ncsu.edu/questionnaires/new?model=ReviewQuestionnaire&amp;amp;private=1 Create/Edit Rubric Page]&lt;br /&gt;
*[https://github.com/Michael-Anderson-NCSU/reimplementation-front-end Project Repo]&lt;br /&gt;
*[http://152.7.176.255:8080 VCL Deployment]&lt;br /&gt;
*[https://github.com/expertiza/reimplementation-front-end/pull/98, Pull Request]&lt;br /&gt;
&lt;br /&gt;
=====Demo Video=====&lt;br /&gt;
*[https://youtu.be/eVViM9_Gg80, Demo Video]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=162985</id>
		<title>CSC/ECE 517 Spring 2025 - E2538 Reimplementing Questionnaire Page in Expertiza</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=162985"/>
		<updated>2025-04-02T21:41:49Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2538 Reimplementing Questionnaire Page==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Project Requirement==&lt;br /&gt;
The goal of this project is to implement the Questionnaire Page in Expertiza by reimplementing its frontend using React with TypeScript, while integrating it with the existing Ruby on Rails backend APIs in the reimplementation backend repo. The new implementation will improve user experience, maintainability, and scalability while preserving core functionalities.&lt;br /&gt;
&lt;br /&gt;
This project covers:&lt;br /&gt;
&lt;br /&gt;
* Developing a React-based UI for managing questionnaire rubrics.&lt;br /&gt;
&lt;br /&gt;
* Enabling navigation to a new page when clicking the &amp;quot;+&amp;quot; button to create a specific rubric for a questionnaire type.&lt;br /&gt;
&lt;br /&gt;
* Ensuring seamless API integration with the reimplementation backend repo.&lt;br /&gt;
&lt;br /&gt;
* Managing user sessions and authentication securely.&lt;br /&gt;
&lt;br /&gt;
==Best Practices==&lt;br /&gt;
*Component Reusability (DRY Principle): Design reusable and modular components to avoid duplication and simplify maintenance, adhering to the &amp;quot;Don't Repeat Yourself&amp;quot; principle.&lt;br /&gt;
&lt;br /&gt;
*Separation of Concerns: Keep the UI, state management, and business logic separated. Use container components for state and logic and presentational components for rendering.&lt;br /&gt;
&lt;br /&gt;
*Responsive and Accessible Design: Ensure the UI adapts to different devices and meets accessibility standards (e.g., ARIA roles, keyboard navigation, and proper contrast).&lt;br /&gt;
&lt;br /&gt;
*Type Safety with TypeScript: Use TypeScript interfaces and types to ensure data consistency, reduce runtime errors.&lt;br /&gt;
&lt;br /&gt;
*Single Responsibility Principle: Each component or function should have a single, well-defined purpose to improve clarity, testability, and scalability.&lt;br /&gt;
&lt;br /&gt;
==What Needs to be Done?==&lt;br /&gt;
===Questionnaire Management Dashboard===&lt;br /&gt;
&lt;br /&gt;
Displays a list of questionnaire types (Review, Metareview, Author Feedback, etc.)&lt;br /&gt;
* Each questionnaire type has a &amp;quot;+&amp;quot; button, which, when clicked, navigates to a new page for creating a specific rubric for that questionnaire type.&lt;br /&gt;
* Data is fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx1x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===Create/Edit Rubric Page===&lt;br /&gt;
&lt;br /&gt;
This page is displayed when a user clicks the &amp;quot;+&amp;quot; button from the dashboard.&lt;br /&gt;
&lt;br /&gt;
Allows users to:&lt;br /&gt;
* Enter a name for the rubric.&lt;br /&gt;
* Define min/max item scores.&lt;br /&gt;
* Set the review visibility (private/public).&lt;br /&gt;
* Add criteria for evaluation.&lt;br /&gt;
* Submit the form to create a new rubric for the selected questionnaire type.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx2x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Class UML Diagram==&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
===Views===&lt;br /&gt;
===Model===&lt;br /&gt;
===Controller===&lt;br /&gt;
&lt;br /&gt;
==Files Modified==&lt;br /&gt;
&lt;br /&gt;
==Test Plan==&lt;br /&gt;
===Testing Views===&lt;br /&gt;
===Testing Model===&lt;br /&gt;
===Testing Controller===&lt;br /&gt;
&lt;br /&gt;
==Test Coverage==&lt;br /&gt;
&lt;br /&gt;
==Team==&lt;br /&gt;
=====Mentor===== &lt;br /&gt;
*Prathyusha Kodali - pkodali&lt;br /&gt;
&lt;br /&gt;
=====Members===== &lt;br /&gt;
*Ashwin Muniswamy - akumarm&lt;br /&gt;
*Michael Anderson - mwander5&lt;br /&gt;
*Martina Viola - mmviola&lt;br /&gt;
&lt;br /&gt;
==Reference Links==&lt;br /&gt;
*[https://expertiza.ncsu.edu/tree_display/list?currCtlr=Questionnaires, Questionnaire Management Dashboard]&lt;br /&gt;
*[https://expertiza.ncsu.edu/questionnaires/new?model=ReviewQuestionnaire&amp;amp;private=1, Create/Edit Rubric Page]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=162984</id>
		<title>CSC/ECE 517 Spring 2025 - E2538 Reimplementing Questionnaire Page in Expertiza</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2538_Reimplementing_Questionnaire_Page_in_Expertiza&amp;diff=162984"/>
		<updated>2025-04-02T21:39:27Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* Reference Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Project Requirement==&lt;br /&gt;
The goal of this project is to implement the Questionnaire Page in Expertiza by reimplementing its frontend using React with TypeScript, while integrating it with the existing Ruby on Rails backend APIs in the reimplementation backend repo. The new implementation will improve user experience, maintainability, and scalability while preserving core functionalities.&lt;br /&gt;
&lt;br /&gt;
This project covers:&lt;br /&gt;
&lt;br /&gt;
* Developing a React-based UI for managing questionnaire rubrics.&lt;br /&gt;
&lt;br /&gt;
* Enabling navigation to a new page when clicking the &amp;quot;+&amp;quot; button to create a specific rubric for a questionnaire type.&lt;br /&gt;
&lt;br /&gt;
* Ensuring seamless API integration with the reimplementation backend repo.&lt;br /&gt;
&lt;br /&gt;
* Managing user sessions and authentication securely.&lt;br /&gt;
&lt;br /&gt;
==Best Practices==&lt;br /&gt;
*Component Reusability (DRY Principle): Design reusable and modular components to avoid duplication and simplify maintenance, adhering to the &amp;quot;Don't Repeat Yourself&amp;quot; principle.&lt;br /&gt;
&lt;br /&gt;
*Separation of Concerns: Keep the UI, state management, and business logic separated. Use container components for state and logic and presentational components for rendering.&lt;br /&gt;
&lt;br /&gt;
*Responsive and Accessible Design: Ensure the UI adapts to different devices and meets accessibility standards (e.g., ARIA roles, keyboard navigation, and proper contrast).&lt;br /&gt;
&lt;br /&gt;
*Type Safety with TypeScript: Use TypeScript interfaces and types to ensure data consistency, reduce runtime errors.&lt;br /&gt;
&lt;br /&gt;
*Single Responsibility Principle: Each component or function should have a single, well-defined purpose to improve clarity, testability, and scalability.&lt;br /&gt;
&lt;br /&gt;
==What Needs to be Done?==&lt;br /&gt;
===Questionnaire Management Dashboard===&lt;br /&gt;
&lt;br /&gt;
Displays a list of questionnaire types (Review, Metareview, Author Feedback, etc.)&lt;br /&gt;
* Each questionnaire type has a &amp;quot;+&amp;quot; button, which, when clicked, navigates to a new page for creating a specific rubric for that questionnaire type.&lt;br /&gt;
* Data is fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx1x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
===Create/Edit Rubric Page===&lt;br /&gt;
&lt;br /&gt;
This page is displayed when a user clicks the &amp;quot;+&amp;quot; button from the dashboard.&lt;br /&gt;
&lt;br /&gt;
Allows users to:&lt;br /&gt;
* Enter a name for the rubric.&lt;br /&gt;
* Define min/max item scores.&lt;br /&gt;
* Set the review visibility (private/public).&lt;br /&gt;
* Add criteria for evaluation.&lt;br /&gt;
* Submit the form to create a new rubric for the selected questionnaire type.&lt;br /&gt;
&lt;br /&gt;
[[File:Picx2x.png | 700px]]&lt;br /&gt;
&lt;br /&gt;
==Class UML Diagram==&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
===Views===&lt;br /&gt;
===Model===&lt;br /&gt;
===Controller===&lt;br /&gt;
&lt;br /&gt;
==Files Modified==&lt;br /&gt;
&lt;br /&gt;
==Test Plan==&lt;br /&gt;
===Testing Views===&lt;br /&gt;
===Testing Model===&lt;br /&gt;
===Testing Controller===&lt;br /&gt;
&lt;br /&gt;
==Test Coverage==&lt;br /&gt;
&lt;br /&gt;
==Team==&lt;br /&gt;
=====Mentor===== &lt;br /&gt;
*Prathyusha Kodali - pkodali&lt;br /&gt;
&lt;br /&gt;
=====Members===== &lt;br /&gt;
*Ashwin Muniswamy - akumarm&lt;br /&gt;
*Michael Anderson - mwander5&lt;br /&gt;
*Martina Viola - mmviola&lt;br /&gt;
&lt;br /&gt;
==Reference Links==&lt;br /&gt;
*[https://expertiza.ncsu.edu/tree_display/list?currCtlr=Questionnaires, Questionnaire Management Dashboard]&lt;br /&gt;
*[https://expertiza.ncsu.edu/questionnaires/new?model=ReviewQuestionnaire&amp;amp;private=1, Create/Edit Rubric Page]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025&amp;diff=162922</id>
		<title>CSC/ECE 517 Spring 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025&amp;diff=162922"/>
		<updated>2025-04-01T19:23:39Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[CSC/ECE 517 Spring 2025 - E2503. Refactor the Team hierarchy]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2504. Mentor-meeting management]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2508. Reimplement bidding-algorithm web service]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2509. Reimplement feedback_response_map.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2519. Implement view for results of bidding]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2522. Enhancing UI Consistency in Expertiza 1]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2517. Reimplement internationalization (frontend + backend)]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2523: Enhancing UI Consistency in Expertiza 2]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2515:  Reimplement student_teams_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2501:  Refactor review_mapping_helper.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2502:  Refactor review_mapping_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2512. Reimplement responses controller]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2510. Reimplement grades_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2507. Reimplement back end for submission records]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2514. Reimplement student_quizzes_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2518. Reimplement password resets (frontend + backend)]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2516. Reimplement teams_users_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2511. Reimplement participants_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2521. UI for View submissions/assign grades (except heatgrid)]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2513. Reimplement sign_up_topic.rb as project_topic.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2506. Implement testing for new Bookmarks Controller]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2527. Mentor-meeting management: assignments with topics]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2532. Reimplement Missing ResponseMap Subclasses]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2025 - E2538 Reimplementing Questionnaire Page in Expertiza]]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162288</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162288"/>
		<updated>2025-03-24T17:04:49Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* tag_prompt_deployment_spec.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2505. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/controllers/answer_tags_controller.rb] creates/edits answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controller filters based on assignment_id, questionnaire_id and user_id to present appropriate records. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines whether the current user is permitted to access the given action (index or create_edit) based on their role.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When it is a student session, access to index should be allowed.&lt;br /&gt;
:: - When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
:: - When the session user is a student, access to unsupported actions like destroy or show should be denied.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When the session is not defined, access to any action (e.g., index, create_edit) should be denied.&lt;br /&gt;
:: - When a user with no role assigned tries to access index or create_edit, access should be denied.&lt;br /&gt;
:: - When an Instructor tries to access an unsupported action (e.g., destroy), access should be denied.&lt;br /&gt;
:: - When the action parameter is missing or unrecognized, access should be denied regardless of user role.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * For any authenticated user above student access:&lt;br /&gt;
:: - When anyone above student privilege is authorized&lt;br /&gt;
:: - When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
:: - When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
:: - When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
:: - When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
:: - When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
:: - When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
:: - When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
:: - When provided with both assignment_id and questionnaire_id, it should provide the correct filtered response.&lt;br /&gt;
:: - When provided with one incorrect and one correct param, then no records should be returned.&lt;br /&gt;
: * When there are multiple tags are present for an assignment, all related tags should be returned.&lt;br /&gt;
: * When a user request is made, it should return records related to current user only.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When an unauthorized user tries to access the #index, the user should be returned to root_page.&lt;br /&gt;
: * When an invalid parameter is passed, the system should not break and should return valid results.&lt;br /&gt;
: * When there are large number of answer tags, the tags are handled properly.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allows the creation or updating of an answer tag for the current student.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
:: - When a valid combination of answer_id, tag_prompt_deployment_id, and value is provided by a student and no existing tag exists, a new AnswerTag is created.&lt;br /&gt;
:: - When a student accesses an existing tag, the tag is updated with the new provided value.&lt;br /&gt;
:: - When a student provides a user_id in the parameters, the controller still uses the current_user to ensure tags are associated only with the logged-in student.&lt;br /&gt;
:: - When create_edit is called multiple times with the same parameters, it does not create duplicate AnswerTag records — the existing one is updated.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
:: - When no answer_id is provided, the system raises an error and does not create or update the tag.&lt;br /&gt;
:: - When no tag_prompt_deployment_id is provided, the system raises an error.&lt;br /&gt;
:: - When no value is provided, the tag creation/update is rejected with an error.&lt;br /&gt;
:: - When incorrect or unexpected user_id is passed, it is ignored, and the tag is created for the current_user.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/models/tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
# [https://drive.google.com/file/d/1UTeJC7oc8pbWZeOuCZt3JcdfW5uDv3Fu/view?usp=drive_link Demo Video for Tag Prompt Deployment Controller]&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb] and [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
Both files are 100% covered and additional testing was added to ensure a solid groundwork.&lt;br /&gt;
&lt;br /&gt;
====answer_tags_controller_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 63.1&lt;br /&gt;
&lt;br /&gt;
[[File:Answer_tags_controller_coverage_2505.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
====tag_prompt_deployment_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 5.2&lt;br /&gt;
&lt;br /&gt;
[[File:Tag_prompt_deployment_coverage_2025.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. Modify base files&lt;br /&gt;
   a. correct several method names (ex: not named after a verb (assignment_tagging_progress))&lt;br /&gt;
   b. make tag_prompt_deployment.rb more readable and better commented&lt;br /&gt;
   c. Break some methods down into smaller ones for better functionality (assignment_tagging_progress)&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/Michael-Anderson-NCSU/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2936 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162287</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162287"/>
		<updated>2025-03-24T17:04:44Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* answer_tags_controller_spec.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2505. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/controllers/answer_tags_controller.rb] creates/edits answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controller filters based on assignment_id, questionnaire_id and user_id to present appropriate records. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines whether the current user is permitted to access the given action (index or create_edit) based on their role.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When it is a student session, access to index should be allowed.&lt;br /&gt;
:: - When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
:: - When the session user is a student, access to unsupported actions like destroy or show should be denied.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When the session is not defined, access to any action (e.g., index, create_edit) should be denied.&lt;br /&gt;
:: - When a user with no role assigned tries to access index or create_edit, access should be denied.&lt;br /&gt;
:: - When an Instructor tries to access an unsupported action (e.g., destroy), access should be denied.&lt;br /&gt;
:: - When the action parameter is missing or unrecognized, access should be denied regardless of user role.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * For any authenticated user above student access:&lt;br /&gt;
:: - When anyone above student privilege is authorized&lt;br /&gt;
:: - When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
:: - When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
:: - When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
:: - When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
:: - When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
:: - When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
:: - When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
:: - When provided with both assignment_id and questionnaire_id, it should provide the correct filtered response.&lt;br /&gt;
:: - When provided with one incorrect and one correct param, then no records should be returned.&lt;br /&gt;
: * When there are multiple tags are present for an assignment, all related tags should be returned.&lt;br /&gt;
: * When a user request is made, it should return records related to current user only.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When an unauthorized user tries to access the #index, the user should be returned to root_page.&lt;br /&gt;
: * When an invalid parameter is passed, the system should not break and should return valid results.&lt;br /&gt;
: * When there are large number of answer tags, the tags are handled properly.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allows the creation or updating of an answer tag for the current student.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
:: - When a valid combination of answer_id, tag_prompt_deployment_id, and value is provided by a student and no existing tag exists, a new AnswerTag is created.&lt;br /&gt;
:: - When a student accesses an existing tag, the tag is updated with the new provided value.&lt;br /&gt;
:: - When a student provides a user_id in the parameters, the controller still uses the current_user to ensure tags are associated only with the logged-in student.&lt;br /&gt;
:: - When create_edit is called multiple times with the same parameters, it does not create duplicate AnswerTag records — the existing one is updated.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
:: - When no answer_id is provided, the system raises an error and does not create or update the tag.&lt;br /&gt;
:: - When no tag_prompt_deployment_id is provided, the system raises an error.&lt;br /&gt;
:: - When no value is provided, the tag creation/update is rejected with an error.&lt;br /&gt;
:: - When incorrect or unexpected user_id is passed, it is ignored, and the tag is created for the current_user.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/models/tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
# [https://drive.google.com/file/d/1UTeJC7oc8pbWZeOuCZt3JcdfW5uDv3Fu/view?usp=drive_link Demo Video for Tag Prompt Deployment Controller]&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb] and [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
Both files are 100% covered and additional testing was added to ensure a solid groundwork.&lt;br /&gt;
&lt;br /&gt;
====answer_tags_controller_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 63.1&lt;br /&gt;
&lt;br /&gt;
[[File:Answer_tags_controller_coverage_2505.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
====tag_prompt_deployment_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 5.2&lt;br /&gt;
&lt;br /&gt;
[[File:Tag_prompt_deployment_coverage_2025.png]]&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. Modify base files&lt;br /&gt;
   a. correct several method names (ex: not named after a verb (assignment_tagging_progress))&lt;br /&gt;
   b. make tag_prompt_deployment.rb more readable and better commented&lt;br /&gt;
   c. Break some methods down into smaller ones for better functionality (assignment_tagging_progress)&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/Michael-Anderson-NCSU/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2936 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162286</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162286"/>
		<updated>2025-03-24T17:02:53Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* Using RSpec */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2505. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/controllers/answer_tags_controller.rb] creates/edits answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controller filters based on assignment_id, questionnaire_id and user_id to present appropriate records. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines whether the current user is permitted to access the given action (index or create_edit) based on their role.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When it is a student session, access to index should be allowed.&lt;br /&gt;
:: - When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
:: - When the session user is a student, access to unsupported actions like destroy or show should be denied.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When the session is not defined, access to any action (e.g., index, create_edit) should be denied.&lt;br /&gt;
:: - When a user with no role assigned tries to access index or create_edit, access should be denied.&lt;br /&gt;
:: - When an Instructor tries to access an unsupported action (e.g., destroy), access should be denied.&lt;br /&gt;
:: - When the action parameter is missing or unrecognized, access should be denied regardless of user role.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * For any authenticated user above student access:&lt;br /&gt;
:: - When anyone above student privilege is authorized&lt;br /&gt;
:: - When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
:: - When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
:: - When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
:: - When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
:: - When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
:: - When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
:: - When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
:: - When provided with both assignment_id and questionnaire_id, it should provide the correct filtered response.&lt;br /&gt;
:: - When provided with one incorrect and one correct param, then no records should be returned.&lt;br /&gt;
: * When there are multiple tags are present for an assignment, all related tags should be returned.&lt;br /&gt;
: * When a user request is made, it should return records related to current user only.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When an unauthorized user tries to access the #index, the user should be returned to root_page.&lt;br /&gt;
: * When an invalid parameter is passed, the system should not break and should return valid results.&lt;br /&gt;
: * When there are large number of answer tags, the tags are handled properly.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allows the creation or updating of an answer tag for the current student.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
:: - When a valid combination of answer_id, tag_prompt_deployment_id, and value is provided by a student and no existing tag exists, a new AnswerTag is created.&lt;br /&gt;
:: - When a student accesses an existing tag, the tag is updated with the new provided value.&lt;br /&gt;
:: - When a student provides a user_id in the parameters, the controller still uses the current_user to ensure tags are associated only with the logged-in student.&lt;br /&gt;
:: - When create_edit is called multiple times with the same parameters, it does not create duplicate AnswerTag records — the existing one is updated.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
:: - When no answer_id is provided, the system raises an error and does not create or update the tag.&lt;br /&gt;
:: - When no tag_prompt_deployment_id is provided, the system raises an error.&lt;br /&gt;
:: - When no value is provided, the tag creation/update is rejected with an error.&lt;br /&gt;
:: - When incorrect or unexpected user_id is passed, it is ignored, and the tag is created for the current_user.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/models/tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
# [https://drive.google.com/file/d/1UTeJC7oc8pbWZeOuCZt3JcdfW5uDv3Fu/view?usp=drive_link Demo Video for Tag Prompt Deployment Controller]&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb] and [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
Both files are 100% covered and additional testing was added to ensure a solid groundwork.&lt;br /&gt;
&lt;br /&gt;
====answer_tags_controller_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 63.1&lt;br /&gt;
&lt;br /&gt;
[[File:Answer_tags_controller_coverage_2505.png]]&lt;br /&gt;
&lt;br /&gt;
====tag_prompt_deployment_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 5.2&lt;br /&gt;
&lt;br /&gt;
[[File:Tag_prompt_deployment_coverage_2025.png]]&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. Modify base files&lt;br /&gt;
   a. correct several method names (ex: not named after a verb (assignment_tagging_progress))&lt;br /&gt;
   b. make tag_prompt_deployment.rb more readable and better commented&lt;br /&gt;
   c. Break some methods down into smaller ones for better functionality (assignment_tagging_progress)&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/Michael-Anderson-NCSU/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2936 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162143</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162143"/>
		<updated>2025-03-24T01:17:41Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* Testing Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2413. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/controllers/answer_tags_controller.rb] creates/edits answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controller filters based on assignment_id, questionnaire_id and user_id to present appropriate records. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines whether the current user is permitted to access the given action (index or create_edit) based on their role.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When it is a student session, access to index should be allowed.&lt;br /&gt;
:: - When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
:: - When the session user is a student, access to unsupported actions like destroy or show should be denied.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When the session is not defined, access to any action (e.g., index, create_edit) should be denied.&lt;br /&gt;
:: - When a user with no role assigned tries to access index or create_edit, access should be denied.&lt;br /&gt;
:: - When an Instructor tries to access an unsupported action (e.g., destroy), access should be denied.&lt;br /&gt;
:: - When the action parameter is missing or unrecognized, access should be denied regardless of user role.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * For any authenticated user above student access:&lt;br /&gt;
:: - When anyone above student privilege is authorized&lt;br /&gt;
:: - When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
:: - When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
:: - When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
:: - When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
:: - When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
:: - When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
:: - When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
:: - When provided with both assignment_id and questionnaire_id, it should provide the correct filtered response.&lt;br /&gt;
:: - When provided with one incorrect and one correct param, then no records should be returned.&lt;br /&gt;
: * When there are multiple tags are present for an assignment, all related tags should be returned.&lt;br /&gt;
: * When a user request is made, it should return records related to current user only.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When an unauthorized user tries to access the #index, the user should be returned to root_page.&lt;br /&gt;
: * When an invalid parameter is passed, the system should not break and should return valid results.&lt;br /&gt;
: * When there are large number of answer tags, the tags are handled properly.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allows the creation or updating of an answer tag for the current student.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
:: - When a valid combination of answer_id, tag_prompt_deployment_id, and value is provided by a student and no existing tag exists, a new AnswerTag is created.&lt;br /&gt;
:: - When a student accesses an existing tag, the tag is updated with the new provided value.&lt;br /&gt;
:: - When a student provides a user_id in the parameters, the controller still uses the current_user to ensure tags are associated only with the logged-in student.&lt;br /&gt;
:: - When create_edit is called multiple times with the same parameters, it does not create duplicate AnswerTag records — the existing one is updated.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
:: - When no answer_id is provided, the system raises an error and does not create or update the tag.&lt;br /&gt;
:: - When no tag_prompt_deployment_id is provided, the system raises an error.&lt;br /&gt;
:: - When no value is provided, the tag creation/update is rejected with an error.&lt;br /&gt;
:: - When incorrect or unexpected user_id is passed, it is ignored, and the tag is created for the current_user.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/models/tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
# [https://drive.google.com/file/d/1UTeJC7oc8pbWZeOuCZt3JcdfW5uDv3Fu/view?usp=drive_link Demo Video for Tag Prompt Deployment Controller]&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb] and [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
Both files are 100% covered and additional testing was added to ensure a solid groundwork.&lt;br /&gt;
&lt;br /&gt;
====answer_tags_controller_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 63.1&lt;br /&gt;
&lt;br /&gt;
[[File:Answer_tags_controller_coverage_2505.png]]&lt;br /&gt;
&lt;br /&gt;
====tag_prompt_deployment_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 5.2&lt;br /&gt;
&lt;br /&gt;
[[File:Tag_prompt_deployment_coverage_2025.png]]&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. Modify base files&lt;br /&gt;
   a. correct several method names (ex: not named after a verb (assignment_tagging_progress))&lt;br /&gt;
   b. make tag_prompt_deployment.rb more readable and better commented&lt;br /&gt;
   c. Break some methods down into smaller ones for better functionality (assignment_tagging_progress)&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/Michael-Anderson-NCSU/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2936 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162142</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=162142"/>
		<updated>2025-03-24T01:06:06Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2413. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/controllers/answer_tags_controller.rb] creates/edits answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controller filters based on assignment_id, questionnaire_id and user_id to present appropriate records. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines whether the current user is permitted to access the given action (index or create_edit) based on their role.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When it is a student session, access to index should be allowed.&lt;br /&gt;
:: - When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
:: - When the session user is a student, access to unsupported actions like destroy or show should be denied.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
:: - When the session is not defined, access to any action (e.g., index, create_edit) should be denied.&lt;br /&gt;
:: - When a user with no role assigned tries to access index or create_edit, access should be denied.&lt;br /&gt;
:: - When an Instructor tries to access an unsupported action (e.g., destroy), access should be denied.&lt;br /&gt;
:: - When the action parameter is missing or unrecognized, access should be denied regardless of user role.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * For any authenticated user above student access:&lt;br /&gt;
:: - When anyone above student privilege is authorized&lt;br /&gt;
:: - When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
:: - When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
:: - When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
:: - When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
:: - When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
:: - When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
:: - When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
:: - When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
:: - When provided with both assignment_id and questionnaire_id, it should provide the correct filtered response.&lt;br /&gt;
:: - When provided with one incorrect and one correct param, then no records should be returned.&lt;br /&gt;
: * When there are multiple tags are present for an assignment, all related tags should be returned.&lt;br /&gt;
: * When a user request is made, it should return records related to current user only.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When an unauthorized user tries to access the #index, the user should be returned to root_page.&lt;br /&gt;
: * When an invalid parameter is passed, the system should not break and should return valid results.&lt;br /&gt;
: * When there are large number of answer tags, the tags are handled properly.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allows the creation or updating of an answer tag for the current student.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
:: - When a valid combination of answer_id, tag_prompt_deployment_id, and value is provided by a student and no existing tag exists, a new AnswerTag is created.&lt;br /&gt;
:: - When a student accesses an existing tag, the tag is updated with the new provided value.&lt;br /&gt;
:: - When a student provides a user_id in the parameters, the controller still uses the current_user to ensure tags are associated only with the logged-in student.&lt;br /&gt;
:: - When create_edit is called multiple times with the same parameters, it does not create duplicate AnswerTag records — the existing one is updated.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
:: - When no answer_id is provided, the system raises an error and does not create or update the tag.&lt;br /&gt;
:: - When no tag_prompt_deployment_id is provided, the system raises an error.&lt;br /&gt;
:: - When no value is provided, the tag creation/update is rejected with an error.&lt;br /&gt;
:: - When incorrect or unexpected user_id is passed, it is ignored, and the tag is created for the current_user.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/models/tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
put demo video here&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb] and [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
Both files are 100% covered and additional testing was added to ensure a solid groundwork.&lt;br /&gt;
&lt;br /&gt;
====answer_tags_controller_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 63.1&lt;br /&gt;
&lt;br /&gt;
[[File:Answer_tags_controller_coverage_2505.png]]&lt;br /&gt;
&lt;br /&gt;
====tag_prompt_deployment_spec.rb====&lt;br /&gt;
&lt;br /&gt;
: Coverage: 100%&lt;br /&gt;
: Hits/line: 5.2&lt;br /&gt;
&lt;br /&gt;
[[File:Tag_prompt_deployment_coverage_2025.png]]&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. Modify base files&lt;br /&gt;
   a. correct several method names (ex: not named after a verb (assignment_tagging_progress))&lt;br /&gt;
   b. make tag_prompt_deployment.rb more readable and better commented&lt;br /&gt;
   c. Break some methods down into smaller ones for better functionality (assignment_tagging_progress)&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/Michael-Anderson-NCSU/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2936 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161525</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161525"/>
		<updated>2025-03-22T18:51:55Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2413. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/controllers/answer_tags_controller.rb] creates answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines if the user has the permission to see all the tags or create_edit a tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
: * When it is a student session, access to index should be allowed.&lt;br /&gt;
: * When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
: * When it is a student session, access to destroy should not be allowed.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
: * When the session is undefined, access to index should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to create_edit should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to destroy should be inaccessible.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
: * When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
: * When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
: * When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
: * When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
: * When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
: * When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allow the creation or updating of an answer tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When a current tag is accessed, the current tag should be updated with new provided values.&lt;br /&gt;
: * When a current tag is accessed by a student, the current tag should not be updated with new values.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no mapping is found related to any tag_prompt_deployment for that tag (foreign key constraint), an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/models/tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
put demo video here&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb] and [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
Both files are 100% covered and additional testing was added to ensure a solid groundwork.&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. Modify base files&lt;br /&gt;
   a. correct several method names (ex: not named after a verb (assignment_tagging_progress))&lt;br /&gt;
   b. make tag_prompt_deployment.rb more readable and better commented&lt;br /&gt;
   c. Break some methods down into smaller ones for better functionality (assignment_tagging_progress)&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/CSC517-Project3/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/orgs/CSC517-Project3/projects/1/views/1 Github Project Board]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2775 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161524</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161524"/>
		<updated>2025-03-22T18:47:47Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2413. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/controllers/answer_tags_controller.rb] creates answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines if the user has the permission to see all the tags or create_edit a tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
: * When it is a student session, access to index should be allowed.&lt;br /&gt;
: * When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
: * When it is a student session, access to destroy should not be allowed.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
: * When the session is undefined, access to index should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to create_edit should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to destroy should be inaccessible.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
: * When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
: * When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
: * When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
: * When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
: * When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
: * When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allow the creation or updating of an answer tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When a current tag is accessed, the current tag should be updated with new provided values.&lt;br /&gt;
: * When a current tag is accessed by a student, the current tag should not be updated with new values.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no mapping is found related to any tag_prompt_deployment for that tag (foreign key constraint), an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/app/models/tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
put demo video here&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb] and [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/models/tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/Michael-Anderson-NCSU/expertiza/blob/main/spec/controllers/answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
results section&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. future work description&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/CSC517-Project3/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/orgs/CSC517-Project3/projects/1/views/1 Github Project Board]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2775 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161523</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161523"/>
		<updated>2025-03-22T18:43:15Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2413. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
In accordance with the [http://rubyonrails.org/ Ruby on Rails] framework, [http://expertiza.ncsu.edu/ Expertiza] is an open source software project (OSS) led by [https://www.csc.ncsu.edu/people/efg Dr. Edward Gehringer]. Through this platform, the instructor can add and edit assignments that students are able to view and contribute to. There are various filtering methods that streamline this process. There is also the ability for students to peer review other students to give contributing feedback.&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Our objective is to test two files which are part of this process. We are testing a controller for answer tags DESCRIBE ANSWER TAGS HERE EDIT ME. As well as a model for tag prompt deployment which interfaces with this answer tags controller which has methods that return various information about a students progress in tagging answers.&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] creates answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines if the user has the permission to see all the tags or create_edit a tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
: * When it is a student session, access to index should be allowed.&lt;br /&gt;
: * When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
: * When it is a student session, access to destroy should not be allowed.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
: * When the session is undefined, access to index should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to create_edit should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to destroy should be inaccessible.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
: * When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
: * When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
: * When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
: * When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
: * When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
: * When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allow the creation or updating of an answer tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When a current tag is accessed, the current tag should be updated with new provided values.&lt;br /&gt;
: * When a current tag is accessed by a student, the current tag should not be updated with new values.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no mapping is found related to any tag_prompt_deployment for that tag (foreign key constraint), an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
put demo video here&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb] and [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
results section&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. future work description&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/CSC517-Project3/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/orgs/CSC517-Project3/projects/1/views/1 Github Project Board]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2775 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161453</id>
		<title>CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2505._Testing_Answer_Tagging&amp;diff=161453"/>
		<updated>2025-03-17T23:27:24Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: Created page with &amp;quot;==E2413. Testing - Answer Tagging==  This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.   __TOC__   ==Expertiza== Describe expertiza  ==Objective== Describe our objective  ==Controller and Spec Files== Answer Tags * [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0% * [https://github.com/CSC517...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2413. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
Describe expertiza&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Describe our objective&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] creates answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines if the user has the permission to see all the tags or create_edit a tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
: * When it is a student session, access to index should be allowed.&lt;br /&gt;
: * When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
: * When it is a student session, access to destroy should not be allowed.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
: * When the session is undefined, access to index should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to create_edit should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to destroy should be inaccessible.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
: * When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
: * When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
: * When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
: * When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
: * When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
: * When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allow the creation or updating of an answer tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When a current tag is accessed, the current tag should be updated with new provided values.&lt;br /&gt;
: * When a current tag is accessed by a student, the current tag should not be updated with new values.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no mapping is found related to any tag_prompt_deployment for that tag (foreign key constraint), an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
put demo video here&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb] and [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
results section&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. future work description&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/CSC517-Project3/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/orgs/CSC517-Project3/projects/1/views/1 Github Project Board]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2775 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025&amp;diff=161452</id>
		<title>CSC/ECE 517 Spring 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025&amp;diff=161452"/>
		<updated>2025-03-17T23:26:22Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[CSC/ECE 517 Spring 2025 - E2505. Testing Answer Tagging]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2024 - E2508. Reimplement bidding-algorithm web service]]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2024_-_E2505._Testing_Answer_Tagging&amp;diff=161451</id>
		<title>CSC/ECE 517 Fall 2024 - E2505. Testing Answer Tagging</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2024_-_E2505._Testing_Answer_Tagging&amp;diff=161451"/>
		<updated>2025-03-17T23:24:38Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: Created page with &amp;quot;==E2413. Testing - Answer Tagging==  This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.   __TOC__   ==Expertiza== Describe expertiza  ==Objective== Describe our objective  ==Controller and Spec Files== Answer Tags * [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0% * [https://github.com/CSC517...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2413. Testing - Answer Tagging==&lt;br /&gt;
&lt;br /&gt;
This wiki page is for the description of changes made in Spring 2025, CSC/ECE 517 for the E2505 Testing - Testing Answer Tagging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Expertiza==&lt;br /&gt;
Describe expertiza&lt;br /&gt;
&lt;br /&gt;
==Objective==&lt;br /&gt;
Describe our objective&lt;br /&gt;
&lt;br /&gt;
==Controller and Spec Files==&lt;br /&gt;
Answer Tags&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] with initial coverage of 0%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb]&lt;br /&gt;
&lt;br /&gt;
Tag Prompt Deployment&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] with initial coverage of 17.65%&lt;br /&gt;
* [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing Implementation==&lt;br /&gt;
===Answer Tags Controller===&lt;br /&gt;
This controller [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/answer_tags_controller.rb answer_tags_controller.rb] creates answer tags and tracks the number of tags a student has completed overall per assignment or questionnaire. The controllers' output is a JSON-formatted collection of response tags. &lt;br /&gt;
&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''action_allowed?'' : Determines if the user has the permission to see all the tags or create_edit a tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases: &lt;br /&gt;
&lt;br /&gt;
: * When it is a student session, access to index should be allowed.&lt;br /&gt;
: * When it is a student session, access to create_edit should be allowed.&lt;br /&gt;
: * When it is a student session, access to destroy should not be allowed.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
&lt;br /&gt;
: * When the session is undefined, access to index should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to create_edit should be inaccessible.&lt;br /&gt;
: * When the session is undefined, access to destroy should be inaccessible.&lt;br /&gt;
&lt;br /&gt;
''index'' : Returns all the tag prompt deployments in JSON format&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When there are no tag prompts deployed, a empty list should be displayed.&lt;br /&gt;
: * When there is 1 tag prompt deployed, 1 should be displayed.&lt;br /&gt;
: * When there are tag prompts deployed with no associated assignment answer tag, tag prompts should not be displayed.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, it should be filtered by an user_id.&lt;br /&gt;
: * When there is an answer tag associated with an assignment_id, it should be filtered by an assignment_id.&lt;br /&gt;
: * When there is an answer tag associated with a questionnaire_id, it should be filtered by a questionnaire_id.&lt;br /&gt;
: * When there is an answer tag associated with an user_id, assignment_id, and questionnaire_id, it should be filtered by a user_id, assignment_id, questionnaire_id.&lt;br /&gt;
: * When there is no answer tag associated with a assignment_id, no tag prompts are returned for a assignment_id with no associated answer tags.&lt;br /&gt;
: * When there is no answer tag associated with a questionnaire_id, no tag prompts are returned for a questionnaire_id with no associated answer tags.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
&lt;br /&gt;
: * When user_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When assignment_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
: * When questionnaire_id is undefined, an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
''create_edit'' : Allow the creation or updating of an answer tag.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
&lt;br /&gt;
: * When a current tag is accessed, the current tag should be updated with new provided values.&lt;br /&gt;
: * When a current tag is accessed by a student, the current tag should not be updated with new values.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no mapping is found related to any tag_prompt_deployment for that tag (foreign key constraint), an empty list of tags prompts should be returned.&lt;br /&gt;
&lt;br /&gt;
===Tag Prompt Deployment Controller===&lt;br /&gt;
The controller [https://github.com/CSC517-Project3/expertiza/blob/dev/app/controllers/tag_prompts_controller.rb tag_prompt_deployment.rb] is used by an instructor to view the tagging summary of the users that completed the answer tagging. It also indicates that comments are to be tagged for the characteristic specified by the tag prompt.&lt;br /&gt;
=====Methods=====&lt;br /&gt;
''tag_prompt'' : Tests that the tag prompt associated with the provided tag_prompt_id is correctly returned by the tag_dep.tag_prompt method.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When given a valid tag_prompt_id, it should return the associated tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases: &lt;br /&gt;
: * When given an invalid tag_prompt_id, it should not return a tag prompt with the deployment.&lt;br /&gt;
&lt;br /&gt;
''get_number_of_taggable_answers'' : Calculates total taggable answers assigned for a user who participated in ``tag review assignment.''&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When user_id is nil, it should return an error message.&lt;br /&gt;
: * When answer_length_threshold is null, it should return a count of tangible answers.&lt;br /&gt;
: * When answer_length_threshold is not null, it should return a count of taggable answers less than answers_one.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When there are no responses, it should return zero as the count of taggable answers.&lt;br /&gt;
: * When questions are empty, it should return count of taggable answers as zero.&lt;br /&gt;
&lt;br /&gt;
''assignment_tagging_progress'' : Accesses the percentage progress of answer tagging.&lt;br /&gt;
&lt;br /&gt;
: Use Cases:&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do not vary by round, it should calculate the tagging progress for each user.&lt;br /&gt;
: * When there is a team, a question, and the assignment's rubrics do vary by round, it should calculate the tagging progress for each user considering all tagged items.&lt;br /&gt;
&lt;br /&gt;
: Edge Cases:&lt;br /&gt;
: * When no questions are found, it should return an empty list.&lt;br /&gt;
: * When there are no teams or questions, it should return an empty list.&lt;br /&gt;
&lt;br /&gt;
==Testing Details==&lt;br /&gt;
====Demo Videos====&lt;br /&gt;
put demo video here&lt;br /&gt;
&lt;br /&gt;
====Using RSpec====&lt;br /&gt;
&lt;br /&gt;
We implemented tests in [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb] and [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb].&lt;br /&gt;
&lt;br /&gt;
=====How to See Test Coverage=====&lt;br /&gt;
# Run RSpec for [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/controllers/answer_tags_controller_spec.rb answer_tags_controller_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
# Run RSpec for [https://github.com/CSC517-Project3/expertiza/blob/dev/spec/models/tag_prompt_deployment_spec.rb tag_prompt_deployment_spec.rb], &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yum install lynx&amp;lt;/code&amp;gt;,  then &amp;lt;code&amp;gt;lynx ./coverage/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Results==&lt;br /&gt;
results section&lt;br /&gt;
&lt;br /&gt;
==Future Work==&lt;br /&gt;
1. future work description&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
# [https://github.com/expertiza/expertiza Expertiza GitHub]&lt;br /&gt;
# [https://github.com/CSC517-Project3/expertiza Project Repository]&lt;br /&gt;
# [https://github.com/orgs/CSC517-Project3/projects/1/views/1 Github Project Board]&lt;br /&gt;
# [https://github.com/expertiza/expertiza/pull/2775 Pull Request]&lt;br /&gt;
# [https://www.theodinproject.com/lessons/ruby-introduction-to-rspec RSpec]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025&amp;diff=161450</id>
		<title>CSC/ECE 517 Spring 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025&amp;diff=161450"/>
		<updated>2025-03-17T18:39:04Z</updated>

		<summary type="html">&lt;p&gt;Mwander5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[CSC/ECE 517 Fall 2024 - E2505. Testing Answer Tagging]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2024 - E2508. Reimplement bidding-algorithm web service]]&lt;/div&gt;</summary>
		<author><name>Mwander5</name></author>
	</entry>
</feed>