Developer Guide
- Acknowledgements
- Setting up, getting started
- Design
- Implementation
- Documentation, logging, testing, configuration, dev-ops
-
Appendix: Requirements
- Product scope
- User stories
-
Use cases
- Use case: UC01 - Add an internship application
- Use case: UC02 - Edit an application
- Use case: UC03 - Filter applications
- Use case: UC04 - Find applications by company name
- Use case: UC05 - Sort applications
- Use case: UC06 - List all applications
- Use case: UC07 - Delete an application
- Use case: UC08 - Clear all applications
- Use case: UC09 - View help
- Use case: UC10 - Exit the application
- Non-Functional Requirements
- Glossary
- Appendix: Instructions for manual testing
Acknowledgements
This project is based on the AddressBook-Level3 project from SE-EDU initiative, but has evolved into BizBook, a desktop app for managing internship applications.
Setting up, getting started
Refer to the guide Setting up and getting started.
Design
.puml files used to create diagrams are in this document docs/diagrams folder. Refer to the PlantUML Tutorial at se-edu/guides to learn how to create and edit diagrams.
Architecture

The Architecture Diagram given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
Main components of the architecture
Main (consisting of classes Main and MainApp) is in charge of the app launch and shut down.
- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.
- At shut down, it shuts down the other components and invokes cleanup methods where necessary.
The bulk of the app’s work is done by the following four components:
-
UI: The UI of the App. -
Logic: The command executor. -
Model: Holds the data of the App in memory. -
Storage: Reads data from, and writes data to, the hard disk.
Commons represents a collection of classes used by multiple other components.
How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command delete 1.

Each of the four main components (also shown in the diagram above),
- defines its API in an
interfacewith the same companyName as the Component. - implements its functionality using a concrete
{Component Name}Managerclass (which follows the corresponding APIinterfacementioned in the previous point.
For example, the Logic component defines its API in the Logic.java interface and implements its functionality using the LogicManager.java class which follows the Logic interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component’s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.

The sections below give more details of each component.
UI component
The API of this component is specified in Ui.java

The UI consists of a MainWindow that is made up of parts e.g. CommandBox, ResultDisplay, ApplicationListPanel, StatusBarFooter etc. All these, including the MainWindow, inherit from the abstract UiPart class which captures the commonalities between classes that represent parts of the visible GUI.
The UI component uses the JavaFx UI framework. The layout of these UI parts are defined in matching .fxml files that are in the src/main/resources/view folder. For example, the layout of the MainWindow is specified in MainWindow.fxml
The UI component,
- executes user commands using the
Logiccomponent. - listens for changes to
Modeldata so that the UI can be updated with the modified data. - keeps a reference to the
Logiccomponent, because theUIrelies on theLogicto execute commands. - depends on some classes in the
Modelcomponent, as it displaysApplicationobjects residing in theModel.
Logic component
API : Logic.java
Here’s a (partial) class diagram of the Logic component:

The sequence diagram below illustrates the interactions within the Logic component, taking execute("delete 1") API call as an example.

DeleteCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the Logic component works:
- When
Logicis called upon to execute a command, it is passed to anAddressBookParserobject which in turn creates a parser that matches the command (e.g.,DeleteCommandParser) and uses it to parse the command. - This results in a
Commandobject (more precisely, an object of one of its subclasses e.g.,DeleteCommand) which is executed by theLogicManager. - The command can communicate with the
Modelwhen it is executed (e.g. to delete a internshipApplication).
Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and theModel) to achieve. - The result of the command execution is encapsulated as a
CommandResultobject which is returned back fromLogic.
Here are the other classes in Logic (omitted from the class diagram above) that are used for parsing a user command:

How the parsing works:
- When called upon to parse a user command, the
AddressBookParserclass creates anXYZCommandParser(XYZis a placeholder for the specific command companyName e.g.,AddCommandParser) which uses the other classes shown above to parse the user command and create aXYZCommandobject (e.g.,AddCommand) which theAddressBookParserreturns back as aCommandobject. - All
XYZCommandParserclasses (e.g.,AddCommandParser,DeleteCommandParser, …) inherit from theParserinterface so that they can be treated similarly where possible e.g, during testing.
Model component
API : Model.java

The Model component,
- stores the internship application data i.e., all
Applicationobjects (which are contained in aUniqueApplicationListobject). - stores the currently ‘selected’
Applicationobjects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiableObservableList<Application>that can be ‘observed’ e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. - stores a
UserPrefobject that represents the user’s preferences. This is exposed to the outside as aReadOnlyUserPrefobjects. - does not depend on any of the other three components (as the
Modelrepresents data entities of the domain, such as internship applications, they should make sense on their own without depending on other components)
Tag list in BizBook, which Application references. This allows BizBook to only require one Tag object per unique tag, instead of each Application needing their own Tag objects.
Storage component
API : Storage.java

The Storage component,
- can save both BizBook data (internship applications) and user preference data in JSON format, and read them back into corresponding objects.
- inherits from both
BizBookStorageandUserPrefStorage, which means it can be treated as either one (if only the functionality of only one is needed). - depends on some classes in the
Modelcomponent (because theStoragecomponent’s job is to save/retrieve objects that belong to theModel)
Common classes
Classes used by multiple components are in the seedu.description.commons package.
Implementation
This section describes some noteworthy details on how certain features are implemented.
Add Feature
The add command allows users to add a new internship application to BizBook with all required fields.
Implementation
The add mechanism is facilitated by AddCommand and AddCommandParser. The parser validates and extracts the required fields (company name, industry, job type, description, email, status, and deadline) from the user input.
The following sequence diagram shows how an add operation works:

AddCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the add command works:
- When the user executes the
addcommand (e.g.,add n/Google i/Technology t/SWE Intern d/Software engineering role e/recruit@google.com s/Applied dl/2024-12-31), theLogicManagerpasses the input toAddressBookParser. -
AddressBookParseridentifies this as anaddcommand and creates anAddCommandParserto parse the arguments. -
AddCommandParserusesArgumentTokenizerto extract all the prefixed fields (n/, i/, t/, d/, e/, s/, dl/) from the command string. -
AddCommandParservalidates each field using the respective classes (CompanyName,Industry,JobType, etc.) and creates anInternshipApplicationobject. -
AddCommandParsercreates and returns anAddCommandwith the newInternshipApplication. -
LogicManagerexecutes theAddCommand, which checks for duplicates in theModel. - If no duplicate exists (same company name AND job type), the application is added to BizBook via
Model#addApplication(). - The command returns a
CommandResultwith a success message, which is displayed to the user.
Design considerations:
Aspect: Duplicate detection:
-
Current implementation: Two applications are considered duplicates if they have the same company name AND job type.
- Pros: Allows tracking multiple positions at the same company (e.g., “Google SWE Intern” and “Google PM Intern”).
- Cons: Cannot track the same position applied in different rounds.
-
Alternative: Consider only company name for duplicates.
- Pros: Simpler logic.
- Cons: Cannot track multiple different positions at the same company.
Edit Feature
The edit command allows users to modify any field of an existing internship application.
Implementation
The edit mechanism is facilitated by EditCommand and EditCommandParser. The parser creates an EditApplicationDescriptor containing the fields to be updated.
The following sequence diagram shows how an edit operation works:

EditCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the edit command works:
- When the user executes the
editcommand (e.g.,edit 1 s/Interviewing dl/2024-11-30), theLogicManagerpasses the input toAddressBookParser. -
AddressBookParseridentifies this as aneditcommand and creates anEditCommandParserto parse the arguments. -
EditCommandParserextracts the index and creates anEditApplicationDescriptorcontaining only the fields to be updated (in this example, status and deadline). -
EditCommandParsercreates and returns anEditCommandwith the index and descriptor. -
LogicManagerexecutes theEditCommand, which retrieves the application at the specified index from the filtered list. -
EditCommandcreates a newInternshipApplicationby copying the original application and applying the changes from the descriptor. - The edited application is validated to ensure it doesn’t create a duplicate (same company name AND job type as another application).
- If valid,
Model#setApplication()replaces the old application with the edited one. - The command returns a
CommandResultwith a success message showing the updated application details.
Design considerations:
Aspect: Editing behavior:
-
Current implementation: Only specified fields are updated; unspecified fields remain unchanged.
- Pros: User-friendly - no need to re-enter all fields.
- Cons: Cannot easily “clear” optional fields.
-
Alternative: Require all fields to be specified.
- Pros: Explicit and predictable behavior.
- Cons: Tedious for users making small changes.
Find Feature
The find command allows users to search for applications by company name using partial matching.
Implementation
The find mechanism uses NameContainsKeywordsPredicate to filter applications. The predicate performs case-insensitive partial matching, so searching for “tech” will match “TechCorp”, “FinTech Solutions”, etc.
The following sequence diagram shows how a find operation works:

FindCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the find command works:
- When the user executes the
findcommand (e.g.,find Google Microsoft), theLogicManagerpasses the input toAddressBookParser. -
AddressBookParseridentifies this as afindcommand and creates aFindCommandParserto parse the arguments. -
FindCommandParsersplits the input into keywords (in this example, “Google” and “Microsoft”) and creates aNameContainsKeywordsPredicatewith these keywords. -
FindCommandParsercreates and returns aFindCommandwith the predicate. -
LogicManagerexecutes theFindCommand, which callsModel#updateFilteredApplicationList()with the predicate. - The
Modelapplies the predicate to filter the application list. The predicate checks if any keyword appears as a substring in the company name (case-insensitive). - The filtered list is updated in the UI, showing only applications whose company names contain any of the search keywords.
- The command returns a
CommandResultwith a message showing the number of applications found.
Design considerations:
Aspect: Matching strategy:
-
Current implementation: Partial substring matching (case-insensitive).
- Pros: More flexible - finds results even with incomplete company names.
- Cons: May return more results than expected.
-
Alternative: Exact word matching only.
- Pros: More precise results.
- Cons: Requires users to remember exact company names.
Filter Feature
The filter command allows users to filter applications by status, industry, or job type.
Implementation
The filter mechanism uses predicate classes (StatusPredicate, IndustryPredicate, JobTypePredicate) to filter the application list. Multiple filters can be combined.
The following sequence diagram shows how a filter operation works:

FilterCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the filter command works:
- When the user executes the
filtercommand (e.g.,filter s/Applied i/Technology), theLogicManagerpasses the input toAddressBookParser. -
AddressBookParseridentifies this as afiltercommand and creates aFilterCommandParserto parse the arguments. -
FilterCommandParserusesArgumentTokenizerto extract the filter criteria (s/ for status, i/ for industry, t/ for job type). - For each filter criterion present,
FilterCommandParsercreates the corresponding predicate (StatusPredicate,IndustryPredicate, orJobTypePredicate). - If multiple filters are specified, they are combined using
Predicate.and()to create a composite predicate that requires all conditions to match. -
FilterCommandParsercreates and returns aFilterCommandwith the combined predicate. -
LogicManagerexecutes theFilterCommand, which callsModel#updateFilteredApplicationList()with the predicate. - The
Modelapplies the predicate to filter the application list, showing only applications that match all specified criteria. - The command returns a
CommandResultwith a message showing the number of applications matching the filter.
Design considerations:
Aspect: Multiple filter behavior:
-
Current implementation: Multiple filters use AND logic (all conditions must match).
- Pros: Allows precise filtering (e.g., “Tech industry AND Saved status”).
- Cons: May return no results if filters are too restrictive.
-
Alternative: Use OR logic for multiple filters.
- Pros: More results returned.
- Cons: Less precise filtering.
Sort Feature
The sort command allows users to sort applications by company name, deadline, or status.
Implementation
The sort mechanism uses Comparator classes defined in SortComparators. For status sorting, applications are ordered by logical workflow: Saved → Applied → Interviewing → Offer → Rejected.
How the sort command works:
- When the user executes the
sortcommand (e.g.,sort deadline), theLogicManagerpasses the input toAddressBookParser. -
AddressBookParseridentifies this as asortcommand and creates aSortCommandParserto parse the arguments. -
SortCommandParservalidates the sort criterion (must be “name”, “deadline”, or “status”) and retrieves the appropriateComparatorfromSortComparators. -
SortCommandParsercreates and returns aSortCommandwith the comparator. -
LogicManagerexecutes theSortCommand, which callsModel#updateSortedApplicationList()with the comparator. - The
Modelsorts the application list using the provided comparator:- Name: Alphabetical order by company name
- Deadline: Chronological order (earliest deadline first)
- Status: Logical workflow order (Saved → Applied → Interviewing → Offer → Rejected)
- The sorted list is updated in the UI, and the command returns a
CommandResultwith a success message.
Design considerations:
Aspect: Status sort order:
-
Current implementation: Sorts by logical application workflow order.
- Pros: Intuitive ordering that matches the application process.
- Cons: Not alphabetical.
-
Alternative: Sort status alphabetically.
- Pros: Predictable alphabetical ordering.
- Cons: Less intuitive for tracking application progress.
[Proposed] Data archiving
{Explain here how the data archiving feature will be implemented}
Documentation, logging, testing, configuration, dev-ops
Appendix: Requirements
Product scope
Target user profile:
- University students actively applying for multiple internships
- Need to manage a significant number of internship applications simultaneously
- Prefer desktop apps over web-based or mobile applications
- Can type fast
- Prefer typing to mouse interactions
- Reasonably comfortable using CLI apps
- Tired of messy spreadsheets and scattered application tracking
- Want a centralized system to track application progress and deadlines
Value proposition:
BizBook helps students cut through the clutter of spreadsheets and web apps by providing a streamlined CLI-based internship tracker. Students can manage their entire application pipeline efficiently, staying organized and in control of their internship hunt, and accomplish application management tasks faster than with traditional GUI-driven tools.
User stories
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a … | I want to … | So that I can… |
|---|---|---|---|
* * * |
student | add a new internship application with company name and job title | quickly start tracking a new opportunity |
* * * |
student | list all my tracked applications in a formatted table | get a clear overview of my entire pipeline |
* * * |
student | view all details of a specific application using its ID | instantly recall information like job description link or my notes |
* * * |
student | update the status of an application | keep my tracker current with my progress |
* * * |
student | delete an application from my active list | remove roles I’m no longer pursuing |
* * * |
student | see a unique ID for each application in the list view | easily reference them in update, view and delete commands |
* * * |
new user | see usage instructions and available commands | learn how to use BizBook effectively |
* * * |
student | find applications by company name | quickly locate specific companies without scrolling through the entire list |
* * |
student | add a deadline date when creating a new application | don’t miss the submission cutoff |
* * |
student | add a URL to the original job posting | easily refer back to the full description and requirements |
* * |
student | add multi-line notes to an application | record details like interviewer names, key discussion points, or follow-up actions |
* * |
student | view all notes associated with a specific application | quickly prepare for an interview |
* * |
student | add a contact person’s name and email for an application | know who to address my follow-up emails to |
* * |
student | store the file path to the resume version I submitted | remember which resume I used for each application |
* * |
student | edit any field of an existing application | correct typos or update information like a deadline |
* * |
student | filter my application list by status | focus only on the jobs I still need to apply for |
* * |
student | filter my application list by company | see all the roles I’ve applied to at a specific organization |
* * |
student | sort my applications by deadline | prioritize my work on what’s most urgent |
* * |
student | view a statistical summary of my applications | see my progress at a glance |
* * |
student | see applications with deadlines in the next 7 days | get an immediate view of my urgent tasks |
* * |
student | search for companies using keywords in their description | discover companies that align with my interests and studies |
* * |
student | filter search results by industry category | focus my search on sectors I want to work in |
* * |
student | filter opportunities by job type | find roles that match my skills |
* * |
student | combine multiple filters | find highly specific and relevant opportunities |
* * |
student | sort search results by company name or application deadline | organize opportunities and prioritize my applications |
* * |
student | clear all active filters with a single command | easily start a new search |
* |
student | export my application data to a CSV file | create a backup or analyze it further in a spreadsheet |
* |
student | import applications from a CSV file | easily migrate my existing data from a spreadsheet into BizBook |
* |
student | archive a completed application | hide it from my active view while still keeping it for my records |
* |
student | view my archived applications | look back at my complete application history for a given season |
* |
student | search through all my notes for a specific keyword | find which interview I discussed a particular topic in |
* |
student | clear all application data after a confirmation prompt | easily start fresh for a new internship hunt season |
* |
user | receive clear confirmation messages after successfully adding or updating an application | know my command worked |
* |
user | see helpful error messages if I use a command incorrectly | learn how to use the tool properly |
* |
user | see application statuses color-coded in the list view | visually distinguish between different stages at a glance |
* |
user | set a default sort order in a configuration file | don’t have to type the sort flag every time I list my applications |
* |
user | cancel a multi-step command midway through | easily back out if I make a mistake |
* |
user | use CLI autocomplete for company names I’ve already entered | save time and avoid typos |
Use cases
(For all use cases below, the System is BizBook and the Actor is the user, unless specified otherwise)
Use case: UC01 - Add an internship application
MSS
- User requests to add a new internship application with all required fields (company name, industry, job type, description, email, status, and deadline).
- BizBook validates the input.
- BizBook adds the application to the list.
-
BizBook shows a success message with the application details.
Use case ends.
Extensions
-
1a. Required fields are missing.
-
1a1. BizBook shows an error message indicating which fields are missing.
Use case ends.
-
-
2a. Company name format is invalid.
-
2a1. BizBook shows an error message about invalid format.
Use case ends.
-
-
2b. Industry is not from the predefined list.
-
2b1. BizBook shows an error message with valid industry options.
Use case ends.
-
-
2c. Status is not from the predefined list.
-
2c1. BizBook shows an error message with valid status options.
Use case ends.
-
-
2d. Deadline format is invalid.
-
2d1. BizBook shows an error message about the required YYYY-MM-DD format.
Use case ends.
-
-
2e. An application for this company already exists.
-
2e1. BizBook shows a duplicate company error message.
Use case ends.
-
Use case: UC02 - Edit an application
MSS
- User requests to list all applications.
- BizBook shows a numbered list of applications.
- User requests to edit a specific application by index, specifying fields to update.
- BizBook validates the index and new field values.
- BizBook updates the application with the new values.
-
BizBook shows a success message with updated details.
Use case ends.
Extensions
-
2a. The list is empty.
-
2a1. BizBook shows a message indicating no applications exist.
Use case ends.
-
-
3a. No fields to edit are provided.
-
3a1. BizBook shows an error message indicating at least one field must be provided.
Use case ends.
-
-
4a. The given index is invalid.
-
4a1. BizBook shows an error message.
Use case resumes at step 3.
-
-
4b. One or more field values are invalid.
-
4b1. BizBook shows an error message with the specific validation error.
Use case resumes at step 3.
-
-
4c. The edited application would be a duplicate of an existing application.
-
4c1. BizBook shows an error message indicating the application already exists.
Use case resumes at step 3.
-
Use case: UC03 - Filter applications
MSS
- User requests to filter applications by one or more criteria (status, industry, or job type).
- BizBook validates the filter criteria.
- BizBook displays all applications matching all specified criteria.
-
BizBook shows the count of filtered applications.
Use case ends.
Extensions
-
1a. No filter criteria are provided.
-
1a1. BizBook shows an error message with the correct filter command format.
Use case ends.
-
-
2a. One or more filter criteria are invalid.
-
2a1. BizBook shows an error message with valid options for the invalid criterion.
Use case ends.
-
-
3a. No applications match the filter criteria.
-
3a1. BizBook shows an empty list with message “0 applications listed!”
Use case ends.
-
Use case: UC04 - Find applications by company name
MSS
- User requests to find applications containing specific keywords in the company name.
- BizBook searches for applications with company names containing any of the keywords (case-insensitive, partial matching).
- BizBook displays all matching applications.
-
BizBook shows the count of applications found.
Use case ends.
Extensions
-
1a. No keywords are provided.
-
1a1. BizBook shows an error message with the correct find command format.
Use case ends.
-
-
3a. No applications match the keywords.
-
3a1. BizBook shows an empty list with message “0 applications listed!”
Use case ends.
-
Use case: UC05 - Sort applications
MSS
- User requests to sort applications by a specific criterion (name, deadline, or status).
- BizBook validates the sort criterion.
- BizBook sorts the application list according to the criterion.
- BizBook displays the sorted list.
-
BizBook shows a success message.
Use case ends.
Extensions
-
1a. No sort criterion is provided.
-
1a1. BizBook shows an error message with the correct sort command format.
Use case ends.
-
-
2a. The sort criterion is invalid.
-
2a1. BizBook shows an error message indicating valid sort criteria (name, deadline, status).
Use case ends.
-
Use case: UC06 - List all applications
MSS
- User requests to list all applications.
- BizBook displays all applications in the current order, removing any active filters or search results.
-
BizBook shows the total count of applications.
Use case ends.
Extensions
-
2a. BizBook is empty.
-
2a1. BizBook shows an empty list.
Use case ends.
-
Use case: UC07 - Delete an application
MSS
- User requests to list all applications.
- BizBook shows a numbered list of applications.
- User requests to delete a specific application by index.
- BizBook validates the index.
- BizBook deletes the application.
-
BizBook shows a success message with deleted application details.
Use case ends.
Extensions
-
2a. The list is empty.
-
2a1. BizBook shows a message indicating no applications exist.
Use case ends.
-
-
4a. The given index is invalid.
-
4a1. BizBook shows an error message.
Use case resumes at step 3.
-
Use case: UC08 - Clear all applications
MSS
- User requests to clear all applications from BizBook.
- BizBook removes all applications.
-
BizBook shows a success message confirming all data has been cleared.
Use case ends.
Extensions
-
1a. BizBook is already empty.
-
1a1. BizBook still shows the success message (no harm in clearing an empty list).
Use case ends.
-
Use case: UC09 - View help
MSS
- User requests to view help information.
- BizBook displays a help window with a link to the User Guide.
-
User can copy the URL or click to open it in a browser.
Use case ends.
Extensions
-
2a. Help window is already open.
-
2a1. BizBook brings the existing help window to focus.
Use case ends.
-
Use case: UC10 - Exit the application
MSS
- User requests to exit BizBook.
- BizBook saves all current data to the storage file.
-
BizBook closes the application window.
Use case ends.
Non-Functional Requirements
-
Platform Compatibility: Should work on any mainstream OS (Windows, Linux, macOS) as long as it has Java 17 or above installed.
-
Performance: Should be able to hold up to 1000 internship applications without noticeable sluggishness in performance for typical usage.
-
Usability - Typing Efficiency: A user with above-average typing speed for regular English text should be able to accomplish most tasks faster using commands than using the mouse.
-
Usability - Learning Curve: A new user should be able to use all basic features (add, list, update, delete) after reading the User Guide for 15 minutes.
-
Usability - Error Messages: Error messages should be clear and actionable, guiding users on how to correct their input.
-
Data Persistence: Application data should be stored locally in a human-editable text file format (JSON).
-
Portability: Should work without requiring an installer, allowing students to run it from a USB drive or cloud storage folder.
-
Reliability: Should not lose data during normal operation. All data changes should be saved immediately.
-
Response Time: All commands should execute and display results within 2 seconds under normal load.
-
Display Compatibility: The GUI should be usable for standard screen resolutions of 1920x1080 and higher at 100% and 125% screen scales.
-
Display Compatibility - Minimum: The GUI should remain functional (though not optimal) for resolutions of 1280x720 and higher at 150% scale.
-
Extensibility: The command structure should be designed to easily accommodate new fields and commands in future versions.
-
Data Privacy: Application data should remain local and private to the user, with no external data transmission.
-
Command Flexibility: Commands should be case-insensitive and tolerant of minor spacing variations to improve user experience.
-
Scalability: Should handle increasing numbers of applications efficiently as students apply to more positions throughout the internship season.
Glossary
-
Mainstream OS: Windows, Linux, Unix, macOS
-
Application: A record of an internship opportunity that a student is tracking in BizBook, including company name, industry, job role, description, email, status, and deadline
-
Status: The current stage of an internship application in the pipeline (e.g., Saved, Applied, Interviewing, Offer, Rejected)
-
Index: A positive integer representing the position of an application in the displayed list, used for referencing specific applications in commands
-
Industry Category: A predefined classification of companies by their primary business sector (e.g., Tech, Finance, Consulting, Healthcare)
-
Job Type: The specific internship role title or position (e.g., “Software Engineer Intern”, “Data Analyst Intern”)
-
Pipeline: The complete collection of internship applications a student is tracking in BizBook
-
CLI: Command Line Interface - a text-based interface for interacting with the application
-
Filter: A command operation that displays only applications matching specific criteria
-
Archive: A feature to hide completed applications from the active view while preserving them for historical reference
-
Deadline: The submission cutoff date for an internship application
-
Contact Person: The recruiter or HR representative associated with a specific internship application
Appendix: Instructions for manual testing
Given below are instructions to test the app manually.
Launch and shutdown
-
Initial launch
-
Download the jar file and copy into an empty folder
-
Double-click the jar file Expected: Shows the GUI with a set of sample internship applications. The window size may not be optimum.
-
-
Saving window preferences
-
Resize the window to an optimum size. Move the window to a different location. Close the window.
-
Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
-
-
{ more test cases … }
Adding an application
-
Adding an application to BizBook
Prerequisites: There is no existing application in BizBook with the same company name AND job type combination.
-
Test case:
add n/Google i/Technology t/Software Engineer Intern d/Backend development role e/recruit@google.com s/Applied dl/2024-12-31
Expected: An application is added to BizBook with the specified details. A new card is added to the GUI displaying the application’s details including company name, industry, job type, description, email, status, and deadline. -
Test case:
add n/Microsoft(missing required fields)
Expected: No application is added. Error message shown: “Invalid command format! add: Adds an internship application to BizBook…” with the correct command format displayed. -
Other incorrect add commands to try:
-
add n/Google i/Technology(missing job type, description, email, status, deadline) -
add n/Google@ i/Technology t/SWE Intern d/Role e/recruit@google.com s/Applied dl/2024-12-31(invalid company name with@) -
add n/Google i/InvalidIndustry t/SWE Intern d/Role e/recruit@google.com s/Applied dl/2024-12-31(invalid industry) -
add n/Google i/Technology t/SWE Intern d/Role e/invalid-email s/Applied dl/2024-12-31(invalid email format) -
add n/Google i/Technology t/SWE Intern d/Role e/recruit@google.com s/InvalidStatus dl/2024-12-31(invalid status) -
add n/Google i/Technology t/SWE Intern d/Role e/recruit@google.com s/Applied dl/31-12-2024(invalid date format)
Expected: Similar to previous case. No application is added. Specific error messages are shown for each invalid field:
- Company name: “Company names should only contain alphanumeric characters, spaces, and the special characters & . , ‘ -“
- Industry: “Industry should be one of: Technology, Finance, Healthcare, Education, Retail, Consulting, Manufacturing, Government, Nonprofit, Other”
- Email: “Emails should be in the format local-part@domain and adhere to the following constraints…”
- Status: “Status should be one of: Saved, Applied, Interviewing, Offer, Rejected”
- Deadline: “Deadline should be in the format YYYY-MM-DD”
-
-
Test case: Add duplicate application
First:add n/Google i/Technology t/SWE Intern d/Role e/recruit@google.com s/Applied dl/2024-12-31
Then:add n/Google i/Technology t/SWE Intern d/Different role e/different@google.com s/Saved dl/2024-11-30
Expected: Second application is not added. Error message: “This application already exists in BizBook” (because company name AND job type match).
-
Editing an application
-
Editing an application in BizBook
Prerequisites: List all applications using the
listcommand. Multiple applications in the list.-
Test case:
edit 1 s/Interviewing dl/2024-11-30
Expected: The first application’s status is updated to “Interviewing” and deadline to “2024-11-30”. Success message shows the updated application details. -
Test case:
edit 1 n/Microsoft
Expected: The first application’s company name is updated to “Microsoft”. Success message shows the updated application details. -
Test case:
edit 0 s/Offer
Expected: No application is edited. Error message: “Invalid command format!” with the correct edit command format. -
Test case:
edit 1(no fields to edit)
Expected: No application is edited. Error message: “At least one field to edit must be provided.” -
Other incorrect edit commands to try:
-
edit(missing index) -
edit x s/Offer(where x is larger than the list size) -
edit 1 s/InvalidStatus(invalid status value) -
edit 1 e/invalid-email(invalid email format) -
edit 1 dl/31-12-2024(invalid date format)
Expected: Similar error messages as in the add command for invalid field formats.
-
-
Finding applications
-
Finding applications by company name
Prerequisites: Multiple applications in BizBook with various company names.
-
Test case:
find Google
Expected: All applications with “Google” in the company name are displayed (case-insensitive, partial matching). Status message shows the number of applications found. -
Test case:
find Google Microsoft
Expected: All applications with “Google” OR “Microsoft” in the company name are displayed. Status message shows the number of applications found. -
Test case:
find
Expected: Error message: “Invalid command format!” with the correct find command format. -
Test case:
find xyz123(no matching applications)
Expected: Empty list displayed. Status message: “0 applications listed!”
-
Filtering applications
-
Filtering applications by criteria
Prerequisites: Multiple applications in BizBook with various statuses, industries, and job types.
-
Test case:
filter s/Applied
Expected: Only applications with status “Applied” are displayed. Status message shows the number of filtered applications. -
Test case:
filter i/Technology
Expected: Only applications in the “Technology” industry are displayed. -
Test case:
filter s/Applied i/Technology
Expected: Only applications with status “Applied” AND industry “Technology” are displayed (AND logic). -
Test case:
filter t/Software Engineer Intern
Expected: Only applications with job type “Software Engineer Intern” are displayed. -
Test case:
filter(no criteria provided)
Expected: Error message: “Invalid command format!” with the correct filter command format. -
Other incorrect filter commands to try:
-
filter s/InvalidStatus(invalid status) -
filter i/InvalidIndustry(invalid industry)
Expected: Error messages indicating the valid options for status or industry.
-
-
Sorting applications
-
Sorting applications
Prerequisites: Multiple applications in BizBook.
-
Test case:
sort name
Expected: Applications are sorted alphabetically by company name. Success message: “Sorted all applications by name.” -
Test case:
sort deadline
Expected: Applications are sorted by deadline (earliest first). Success message: “Sorted all applications by deadline.” -
Test case:
sort status
Expected: Applications are sorted by status in workflow order: Saved → Applied → Interviewing → Offer → Rejected. Success message: “Sorted all applications by status.” -
Test case:
sort(missing criterion)
Expected: Error message: “Invalid command format!” with the correct sort command format. -
Test case:
sort invalid
Expected: Error message: “Invalid sort criterion. Use ‘name’, ‘deadline’, or ‘status’.”
-
Deleting an application
-
Deleting an application while all applications are being shown
Prerequisites: List all applications using the
listcommand. Multiple applications in the list.-
Test case:
delete 1
Expected: First application is deleted from the list. Details of the deleted application shown in the status message. Timestamp in the status bar is updated. -
Test case:
delete 0
Expected: No application is deleted. Error message: “Invalid command format!” with the correct delete command format. -
Other incorrect delete commands to try:
-
delete(missing index) -
delete x(where x is larger than the list size) -
delete -1(negative index) -
delete abc(non-numeric index)
Expected: Error messages indicating invalid index or format.
-
-
Listing all applications
-
Listing all applications
-
Test case:
list
Expected: All applications in BizBook are displayed, removing any active filters or search results.
-
Test case:
Clearing all applications
-
Clearing all data
Prerequisites: BizBook contains at least one application.
-
Test case:
clear
Expected: All applications are removed from BizBook. Empty list is displayed. Success message: “BizBook has been cleared!” -
Test case:
clear(when BizBook is already empty)
Expected: BizBook remains empty. Success message: “BizBook has been cleared!”
-
Saving data
-
Dealing with missing/corrupted data files
-
Test case: Delete the
data/addressbook.jsonfile, then launch BizBook
Expected: BizBook starts with sample data containing several pre-populated internship applications. -
Test case: Corrupt the
data/addressbook.jsonfile by adding invalid JSON syntax, then launch BizBook
Expected: BizBook starts with an empty application list. A new validaddressbook.jsonfile will be created when you add your first application. -
Test case: Make the
data/addressbook.jsonfile read-only, then try to add an application
Expected: Application appears to be added in the GUI, but changes are not saved. On restart, the application will not be present.
-
Exiting the application
-
Exiting BizBook
-
Test case:
exit
Expected: BizBook closes. All data is saved todata/addressbook.json. -
Test case: Click the close button (X) on the window
Expected: Same as above. BizBook closes and data is saved.
-