Index by title

Essential Smoke Tests


Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.  
**Full test suite:** See Comprehensive list

---

1. Installation & Update

#

Use Case

Steps

Expected Result

Result

1.1

Fresh install

Uninstall the app, install the new build, launch it

App opens without errors; onboarding or login screen is shown

Android ✅

iOS

✅ 

1.2

Update over existing install

Install the previous release, log in, then install the new build on top
(this operation can be non-trivial for Android, so for a quick smoke test on Android we can rely on previous experience and omit this step)

App launches; user is still logged in, no crash

Android ✅

iOS

✅ 

---

2. Login & Authentication

#

Use Case

Steps

Expected Result

Result

2.1

Sign in with valid credentials

Enter a valid instance URL, email, and password; tap Sign In

User reaches the Home dashboard

Android ✅

iOS ✅ 

2.2

Sign in with wrong credentials

Enter a valid URL with a wrong password; tap Sign In

Error message is shown; user stays on Sign In page

Android ✅

iOS ✅ 

2.3

Session persists after restart

Log in, close the app fully, reopen it

User lands on Home dashboard without re-login

Android ✅

iOS ✅ 

2.4

Sign out

Navigate to Account, tap Log Out

User is returned to the Sign In screen

Android ✅

iOS ✅ 

---

3. Home Dashboard

#

Use Case

Steps

Expected Result

Result

3.1

Dashboard loads

Log in and open the Home tab

Widgets load without errors or blank screens

Android ✅

iOS ✅ 

3.2

Navigate from widget

Tap a work package in any Home widget

Work Package Details screen opens

Android ✅

iOS ✅ 

---

4. Projects / Workspaces

#

Use Case

Steps

Expected Result

Result

4.1

Projects list loads

Open the Workspaces tab

List of projects is displayed

Android ✅

iOS ✅ 

4.2

Open a project

Tap any project in the list

Project overview opens with at least one tab loading correctly

Android ✅

iOS ✅ 

---

5. Work Packages

#

Use Case

Steps

Expected Result

Result

5.1

Work package list loads

Open the Work Packages tab

List of work packages is displayed

Android ✅

iOS ✅ 

5.2

Open work package details

Tap any work package

Details screen shows title, status, and description

Android ✅

iOS ✅ 

5.3

Create a work package

Tap "+", fill in title, type, and project; save

Work package is created and visible in the list

Android ✅

iOS ✅ 

5.4

Edit a field

Open a work package, change the status, save

Updated status is shown in the details view

Android ✅

iOS ✅ 

5.5

Add a comment

Open a work package, go to Activity tab, post a comment

Comment appears in the activity timeline

Android ✅

iOS ✅ 

---

6. Time Tracking

#

Use Case

Steps

Expected Result

Result

6.1

Time tracking page loads

Open the Time Tracking tab

Calendar and time entries load

iOS ✅ 
Android ✅

6.2

Start and stop timer

Open the Timer tab, tap Start, wait a few seconds, tap Stop

Log Time form opens pre-filled with elapsed time

iOS ✅ Android ✅

6.3

Save a time entry

Fill in the Log Time form and confirm

Entry is saved and appears in the calendar view

iOS ✅ Android ✅

---

#

Use Case

Steps

Expected Result

Result

7.1

Search returns results

Open Search, type a known work package title

Matching results appear in the list

iOS ✅ Android ✅

7.2

Navigate to result

Tap a result

Correct work package detail screen opens

iOS ✅ Android ✅

---

8. Notifications

#

Use Case

Steps

Expected Result

Result

8.1

Notifications list loads

Open the Notifications tab

Notification list is displayed (or empty state shown)

iOS ✅ Android ✅

8.2

Tap a notification

Tap any notification

Associated work package detail opens

iOS ✅ Android ✅

---

9. User Profile & Settings

#

Use Case

Steps

Expected Result

Result

9.1

Profile loads

Open the Account tab

User name, email, and avatar are displayed

iOS ✅ Android ✅

9.2

Settings are accessible

Open Account → Work Package Settings

Settings page opens without error

iOS ✅ Android ✅

---

10. Navigation & Stability

#

Use Case

Steps

Expected Result

Result

10.1

Bottom nav tabs all work

Tap each icon in the bottom navigation bar

Each tab opens its correct screen

iOS ✅Android ✅ 

10.2

Back navigation

Go several screens deep, press back

App navigates back correctly without crash

iOS ✅ Android ✅

10.3

Offline error handling

Disable network, try to load any screen

Error or offline message shown; app does not crash

iOS ✅ Android ✅

10.4

No crash during basic usage

Use the app across all main sections for ~10 minutes

No crashes or unresponsive states occur

iOS ✅ Android ✅


Essential Smoke Tests


Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.  
**Full test suite:** See Comprehensive list

---

1. Installation & Update

#

Use Case

Steps

Expected Result

Result

1.1

Fresh install

Uninstall the app, install the new build, launch it

App opens without errors; onboarding or login screen is shown

Android ✅

iOS

✅ 

1.2

Update over existing install

Install the previous release, log in, then install the new build on top
(this operation can be non-trivial for Android, so for a quick smoke test on Android we can rely on previous experience and omit this step)

App launches; user is still logged in, no crash

Android ✅

iOS

✅ 

---

2. Login & Authentication

#

Use Case

Steps

Expected Result

Result

2.1

Sign in with valid credentials

Enter a valid instance URL, email, and password; tap Sign In

User reaches the Home dashboard

Android ✅


2.2

Sign in with wrong credentials

Enter a valid URL with a wrong password; tap Sign In

Error message is shown; user stays on Sign In page

Android ✅

2.3

Session persists after restart

Log in, close the app fully, reopen it

User lands on Home dashboard without re-login

Android ✅

2.4

Sign out

Navigate to Account, tap Log Out

User is returned to the Sign In screen

Android ✅

---

3. Home Dashboard

#

Use Case

Steps

Expected Result

Result

3.1

Dashboard loads

Log in and open the Home tab

Widgets load without errors or blank screens

Android ✅

3.2

Navigate from widget

Tap a work package in any Home widget

Work Package Details screen opens

Android ✅

---

4. Projects / Workspaces

#

Use Case

Steps

Expected Result

Result

4.1

Projects list loads

Open the Workspaces tab

List of projects is displayed

Android ✅

4.2

Open a project

Tap any project in the list

Project overview opens with at least one tab loading correctly

Android ✅

---

5. Work Packages

#

Use Case

Steps

Expected Result

Result

5.1

Work package list loads

Open the Work Packages tab

List of work packages is displayed

Android ✅

5.2

Open work package details

Tap any work package

Details screen shows title, status, and description

Android ✅

5.3

Create a work package

Tap "+", fill in title, type, and project; save

Work package is created and visible in the list

Android ✅

5.4

Edit a field

Open a work package, change the status, save

Updated status is shown in the details view

Android ✅

5.5

Add a comment

Open a work package, go to Activity tab, post a comment

Comment appears in the activity timeline

Android ✅

---

6. Time Tracking

#

Use Case

Steps

Expected Result

Result

6.1

Time tracking page loads

Open the Time Tracking tab

Calendar and time entries load

Android ✅

6.2

Start and stop timer

Open the Timer tab, tap Start, wait a few seconds, tap Stop

Log Time form opens pre-filled with elapsed time

Android ✅

6.3

Save a time entry

Fill in the Log Time form and confirm

Entry is saved and appears in the calendar view

Android ✅

---

#

Use Case

Steps

Expected Result

Result

7.1

Search returns results

Open Search, type a known work package title

Matching results appear in the list

 Android ✅

7.2

Navigate to result

Tap a result

Correct work package detail screen opens

 Android ✅

---

8. Notifications

#

Use Case

Steps

Expected Result

Result

8.1

Notifications list loads

Open the Notifications tab

Notification list is displayed (or empty state shown)

 Android ✅

8.2

Tap a notification

Tap any notification

Associated work package detail opens

 Android ✅

---

9. User Profile & Settings

#

Use Case

Steps

Expected Result

Result

9.1

Profile loads

Open the Account tab

User name, email, and avatar are displayed

 Android ✅

9.2

Settings are accessible

Open Account → Work Package Settings

Settings page opens without error

 Android ✅

---

10. Navigation & Stability

#

Use Case

Steps

Expected Result

Result

10.1

Bottom nav tabs all work

Tap each icon in the bottom navigation bar

Each tab opens its correct screen

 Android ✅

10.2

Back navigation

Go several screens deep, press back

App navigates back correctly without crash

 Android ✅

10.3

Offline error handling

Disable network, try to load any screen

Error or offline message shown; app does not crash

 Android ✅

10.4

No crash during basic usage

Use the app across all main sections for ~10 minutes

No crashes or unresponsive states occur

 Android ✅


Follow these steps to install and start using the OpenProject Mobile App (Beta):

1. Check the Requirements

Before downloading the app, please ensure your environment meets the following prerequisites:

2. Download the App

The OpenProject Mobile App is available for both major platforms:

Search for “OpenProject” in your app store, or use the direct links above to download the app.

3. Open the App

After installation, open the app on your device.
You’ll be greeted with a short onboarding on the app features and then prompted to log in to your OpenProject instance.

4. Choose Your Instance

Enter the complete base URL of your instance (for example, https://yourcompany.openproject.com).

5. Log In with Your Credentials

7. Start Exploring

You’re all set!

Once logged in, you can:


Home Dashboard

The Home Dashboard is your go-to screen for staying informed, focused, and efficient on mobile — providing an at-a-glance view of everything that matters across your projects. It allows creating a personalized overview of your projects, work packages, and activities, helping you stay informed and productive on the go.

The dashboard is designed to give you quick access to the information you care about most, without needing to navigate deep into individual projects or work packages.

Purpose

The Home Dashboard is your central hub for project management on mobile. Its main purposes include:

Available Widgets

The Home Dashboard consists of modular widgets that provide snapshots of your most relevant data. Depending on your role and project access, some widgets may vary.

Notifications

Favorite Projects

Time Tracker

Week Time Tracking

Portfolios

Assigned to Me

Recently Edited

Customizing the Dashboard

While the mobile dashboard is designed for simplicity, the order and visibility of widgets can be customized by using the edit widgets button on the top navigation bar, you are allowed to:

Note: If you don't have the right permissions or have disabled a feature, the related widgets will be deactivated in the home dashboard tab.


The OpenProject Mobile App is designed to keep you connected to your projects wherever you are. While it doesn’t replace the full desktop experience, it provides access to the essential tools you need to stay productive on the go.

This section introduces the core features of the app and links to detailed guides for each functionality.

Overview

With the mobile app, you can:

Each feature is designed to complement the OpenProject web and desktop experience, giving you the flexibility to react, update, and communicate on the go.

Core Features

The following core features are available in the mobile app:

Feature

Description

Home Dashboard

Your personal overview of tasks, notifications, and project updates — giving you a quick snapshot of what matters most.

Projects

Browse your projects, access project-specific details, and stay on top of deadlines and activities.

Time Tracking

Track time spent on work packages, run timers in focus mode, and keep your reporting accurate and up to date.

Work Packages

Create, view, and edit work packages directly from the app. Work packages are organized for quick access and easy collaboration.

Notification Centre

Receive updates about comments, mentions, and work package changes — ensuring you never miss important activity.

User Settings

Configure your account, manage app preferences, and tailor notifications to suit your workflow.

💡 Note: For a seamless experience, use the mobile app alongside the web or desktop version of OpenProject. The app is designed as a companion, so you can stay informed, respond quickly, and keep your projects moving — even when you’re away from your desk.


The Projects module in the OpenProject Mobile App gives you an organized view of all portfolios, programs, and projects you have access to. It allows you to check status, attributes, and progress, explore hierarchy, and navigate seamlessly between different levels of work.

Purpose

The Projects module is designed to help you:

This module is particularly useful for team members, project managers, and portfolio managers who need a clear overview of ongoing work and its organization.

Project Index

The main screen of the Projects module acts as an index page, allowing you to:

Portfolio, Program, and Project Details

When you enter a portfolio, program, or project, the mobile app provides three key tabs for detailed insights:

  1. Overview Tab

  2. Work Packages Tab

  3. In this Portfolio / Program / Project


1. Why is the OpenProject Mobile App being released in a Beta state?

The app is released in Beta to provide early access to users while the core functionality is still under development. This allows the OpenProject team to gather feedback from real users, identify issues, and make improvements before the full public release. The Beta release ensures that users can start using the app for essential tasks while the remaining advanced features and refinements are being implemented.

2. What is the OpenProject Mobile App?

The OpenProject Mobile App is a companion to the OpenProject desktop and web applications. It allows users to stay informed, manage work packages, track time, and collaborate while on the go. The app is currently in Beta, meaning core features are available, but some advanced functionalities are still under development.

3. What platforms are supported?

The app requires an active internet connection to sync data with your OpenProject instance.

4. What do I need to log in to the app?

You can log in using your OpenProject Cloud account or an On-Premises instance, username and password. Please ensure:

5. What can I do in the Home Dashboard?

The Home Dashboard provides a personalized overview of your work and includes the following widgets:

6. How does the Projects module work?

The Projects module provides an index of all portfolios, programs, and projects. Users can:

7. What can I do in Work Packages?

The Work Packages module supports:

8. How does Time Tracking work?

The Time Tracking module allows you to monitor and log your work efficiently:

9. How do notifications work?

The Notification Centre collects updates from your projects. Users can:

10. What settings can I configure in the app?

Through the User Settings module, users can:

11. Are all OpenProject features available on mobile?

No. The mobile app is a companion app and is currently in Beta. Some advanced features from the web or desktop version are not yet available, including:

These features are planned for future releases.

12. What should I do if I experience login issues?

Check the following:

If none of the above solves the problem, check the [Login Troubleshooting Guide](link).

13. How can I provide feedback on the Beta app?

Feedback can be submitted directly through the User Settings → Feedback section. Submitted feedback is sent to the OpenProject Mobile App team, allowing us to review and incorporate user suggestions.

14. Can I use the app offline?

The app requires an active internet connection to sync data with your OpenProject instance. Some previously loaded data may be viewable offline, but creating work packages, logging time, or updating tasks requires connectivity.


The Time Tracking module in the OpenProject Mobile App enables you to easily record, review, and manage the time you spend on your work. Whether you prefer logging time manually or using a real-time focus timer, the module offers a clear and efficient mobile workflow.

Purpose

The Time Tracking feature helps you:

Time Entries Index

The Time Entries Index provides a clear, chronological view of all your logged time. What you can do:

This view is ideal for maintaining accurate records and verifying past entries.

Timer Focus Mode

The Timer Focus Mode allows you to track time as it happens, helping you stay focused and avoid manual entry errors. What you can do:

Log Time

The Log Time feature allows you to manually enter time spent on work packages. What you can do:


The Work Packages module is one of the central components of the OpenProject Mobile App. It allows you to browse, search, create, update, and collaborate on work packages directly from your mobile device. The module includes full support for commenting, file attachments, relations, watchers, time logging, timers, and reminders.

Purpose

The Work Packages module enables you to:

Work Packages Index

When accessing the Work Packages module, you are presented with a list of open work packages from all projects. This serves as the starting point for navigation and work package management, making it easy to view ongoing work at a glance. The module also offers flexible filtering tools that allow users to refine the list by selecting a specific project, applying a saved query, and adjusting sorting and grouping options. As filters are modified, the list dynamically adapts to show the corresponding work packages.

In addition to filtering, you can quickly locate specific work packages through the search functionality. Tapping the search icon opens a search bar where users can type keywords and instantly view matching results.

Create Work Packages

Creating new work packages is also fully supported. You can tap the "+" button to begin the creation process. After selecting the work package type and project, you can fill in the required fields to quickly create a new entry. For more detailed entries, you may choose to open the full attribute list and complete optional fields before saving, resulting in a comprehensive work package with all available metadata.

Overview and Edit

You can open any work package to view its details and make updates. Editing is initiated through the pencil icon, giving access to fields such as the title, description, status, and any available custom fields. All updates are applied directly in the work package, so users can easily refine information as work progresses.

Collaboration and Communication

The module supports collaboration through the Activity tab, where you can participate in discussions. Comments can be added or replied to, mentions can be used to involve other users, and images may be included directly in the comment body. This makes it easier to share updates, coordinate with your team, or provide visual information on the go.

Attachments are handled through the Files tab. You can upload files, photos, or videos from their device, or take a new picture using the camera and attach it immediately. This allows work packages to hold all relevant documentation in one place.

Relations between work packages can be managed in the Relations tab, where you can connect tasks to one another by adding new relations when needed. Similarly, watchers can be added from the Watchers tab to keep stakeholders informed about progress or changes.

Time Tracking and Reminders

Time can be logged directly from a work package by opening the More menu and selecting the logging option. You can enter duration, date, activity, and any other necessary details to record their work accurately.

For continuous time tracking, the app also supports starting a live timer from the same More menu. This opens the timer in focus mode, allowing you to track their work in real time while minimizing distractions.

Additionally, you can set reminders from within the More menu. By configuring a reminder for a specific date and time, the app will notify you when it’s time to return to that work package or take action on it.

Sharing Work Packages

Work packages can be easily shared using the device’s native sharing features. From within a work package, you can access the system share from the More menu to send a direct link to the item through messaging apps, email, collaboration tools, or any other app supported by their operating system. This simplifies cross-platform communication and makes it effortless to bring others into the loop.


The Notification Centre provides a centralized view of all updates, mentions, and activities that require the user’s attention. It ensures users can stay informed about important changes across their projects, even while on the move. Notifications from the web or desktop application are synchronized with the mobile app, making it easy to keep track of all relevant activity in one place.

Receiving and Viewing Notifications

After logging in to the app, you will automatically receive notifications generated in their OpenProject environment. Whenever an update occurs—such as a comment, status change, or mention—the notification will appear inside the Notification Centre. You can simply open the app and navigate to the Notification Centre to view any new, unread items waiting for their attention.

You can also choose to display all notifications, not just unread ones. By toggling the switch to view all items, the Notification Centre expands to include both read and unread notifications. This is useful for revisiting past activity or reviewing a complete history of updates.

Viewing Notification Details

Tapping on a notification opens the associated work package directly in the mobile app. You are taken to the Activity tab of that work package, where the specific update that triggered the notification is highlighted. This makes it easy to understand the context of the notification and respond immediately if needed.

Marking Notifications as Read

When a notification is opened or manually marked as read, it is removed from the Unread inbox. This allows you to maintain a clear and focused view of only pending items. For quicker inbox management, the Notification Centre also provides an option to mark all notifications as read from the top bar, clearing the unread list in a single action.

Switching Between Notification Queries

The Notification Centre includes filters that allow you to switch between different notification queries, similar to the web interface. You can choose alternative inboxes—such as “Assigne,” “Mention,” or other notification categories their instance provides. When switching queries, the list updates immediately to show only the notifications relevant to that filter.


The User Settings module allows users to personalize their mobile app experience, configure notifications, manage account details, and provide feedback. All settings are accessible through the user avatar, giving a central location for managing preferences and account-specific options.

Personalization

You can customize how the app behaves and appears to suit their workflow and preferences. The following options are available:

Account and Personal Details

You can manage their personal information from the Account Details section. Changes to the name, email, or other personal data are reflected across both the mobile app and desktop/web interface, ensuring consistency across all OpenProject platforms.

Notifications

The Notification Settings section allows you to configure how and when they receive notifications:

Feedback

The app includes a Feedback section where you can provide suggestions, report issues, or share their experiences. Submitted feedback is sent to the OpenProject Mobile app team for review.


Dear Team,

We are excited to announce the launch of the internal Alpha Testing phase for the OpenProject Mobile App! Your participation and feedback will be invaluable in shaping the future of our mobile experience. Below, you will find a document with all the details regarding the features of the app, what Alpha Testing entails, and how you can get involved.

Note: Please consider that the current state of the app is a work in progress and not considered ready for public release. That’s exactly the reason why we do this testing round, to gather feedback and improve the app until a point we can release it publicly.

What is Alpha Testing?

Alpha Testing is the first phase of testing a product in a controlled environment. During this phase, only internal team members (employees of OpenProject) will:

Overview of Features

The OpenProject Mobile App currently includes the following features:

We are continually enhancing these features and look forward to your insights for further improvements. Just for your information, these are the features that are already in our roadmap for the next months:

Who is Participating in the Alpha Testing?

This testing phase is exclusively open to employees of OpenProject. We encourage all team members to participate and help us refine the mobile app.

How to Participate in the Alpha Testing

Participating is simple and involves the following steps:

  1. Download the App: Follow the instructions below to download the app on your device.

  2. Test the Features: Use the app as you would in your daily workflow.

  3. Provide Feedback: Report your observations, including any bugs or suggestions.

How to Download the App

How to Provide Feedback

We have set up the Stream Mobile App project inside of Community as the central hub for feedback. Use the following categories to organise your input:

Steps to submit feedback:

  1. Open OpenProject Community (also from your mobile app if you are in Community of course 😉)

  2. Navigate to the Stream Mobile App project.

  3. Check if another similar work package with the same feedback exist, if not do point 4.

  4. Create a new work package with the correct type and information as specified in the section on top.

Your active participation and constructive feedback will be critical in ensuring the success of the OpenProject Mobile App. Let’s work together to make this a tool that enhances productivity and collaboration for all!

If you have any questions or need assistance, please don’t hesitate to reach out Marc at m.alcobe@openproject.com.

Thank you for your support and enthusiasm!


Testing strategy (managers and QA)

This document supports decisions about automated testing, CI, and how QA and engineering share responsibility. It is grounded in the current OpenProject Flutter app repository.

If you are new here: read Vision and planned directions first. It states what we want to achieve and why, in plain language. The rest of the document refines that vision with repository facts, priorities, risks, and effort estimates.

Vision and planned directions (read this first)

This section is for readers who were not part of earlier discussions. It captures our intended direction; later sections explain how that maps to this codebase, what already exists, and what we recommend adjusting.

Why automate tests at all

We ship a Flutter client against a living API and rich UI. Bugs show up as wrong data, broken flows, visual regressions, or surprises after server changes. The goal is not “maximum tests,” but predictable quality and earlier feedback, while keeping cost and flake risk under control.

Direction 1: Feature integration tests (device or emulator)

Vision: Run meaningful end-to-end style checks on a real app binding—on a device or emulator—so we exercise navigation, real layout, and timing closer to production.

Constraints we accept: These tests are expensive (time, machines, stability). We do not assume a device farm in CI today. The plan is not to run them on every pull request, but to use them as scheduled smoke (for example once a week) and/or around release candidates, to catch “glue” regressions and reduce repetitive manual load on QA without replacing exploratory testing.

Tooling stance: Prefer Flutter’s **integration_test** where possible; reserve heavier tools (for example Appium) only when the platform cannot be covered otherwise.

Direction 2: Widget tests and golden (screenshot) tests

Vision: While building a feature, add widget tests and, where agreed, golden (reference image) tests for the screens or states that matter—so we get fast feedback in GitHub Actions on layout and critical UI paths.

Open question we acknowledge: For those tests, we may mock BLoC/Cubit state (or fakes at the repository boundary) or push further and mock HTTP (Dio) with static JSON. The document later recommends a split: keep most widget/golden tests free of wire-level JSON; put HTTP parsing and contract behavior in dedicated API / contract tests so failures stay interpretable and maintenance stays sane.

Vision: Add tests that behave like integration checks for the client–API contract but run on Linux CI—no emulator. Typical forms: fixture-backed HTTP tests next to the generated or hand-written client, and/or tests that drive use cases with a fake HTTP port, still asserting realistic responses.

Motivation: We sometimes ship a broken client because the API or HAL changed and we were not aware. Running these suites on every PR (and optionally triggering workflows when the API repository changes) is meant to surface incompatibility early. This only works if the suite is deterministic (fixtures or a stable staging contract)—hooks without a real test body create noise, not safety.

Direction 4: Unit tests, BLoC tests, and small-scope tests

Vision: Keep growing unit tests, **bloc_test**-style tests, and use case tests as the default safety net for rules and state machines. They are the cheapest layer and should remain the bulk of automated coverage.

Optional direction: Full-app flow with JSON fixtures and screenshots

Some features may additionally use the flow snapshot pattern (full or near-full app under flutter_test, static JSON, faked platform APIs, golden milestones). That is optional and expensive—use for a few critical journeys; details appear below.

How we want to work as a team

Sprint planning: We intend to allocate visible time for tests alongside feature work (for example a agreed percentage or explicit tasks). Management may initially see this as overhead; the argument is that unplanned quality work still happens—it is simply deferred, more expensive, and often lands on QA or customers.

Bugs and TDD: When a bug is reproducible and worth preventing again, we want to fix it through a test-first or test-accompanying workflow where that is practical—not as a dogma for every one-line change, but as a default for real regressions.

How the rest of this document is organized

After this section

You will find

Executive summary

Short decisions and asks for leadership and QA.

Glossary

What we mean by each test type.

Current baseline

What already exists in this repo (CI, tests, gaps).

Later sections

ROI ordering, bootstrap vs ROI, mock boundaries, effort tables, risks, and QA handoff.

Executive summary

  1. Goal: Improve release quality and reduce surprise breakages—especially when the API or shared contracts change—without drowning the team in flaky or redundant tests.

  2. Current constraint: GitHub Actions runs flutter test on Ubuntu only. Device and emulator integration tests are not in CI today; they are suitable for a weekly smoke lane or pre-release, not for every PR.

  3. Highest ROI next step: Add contract or fixture-backed HTTP tests next to the API client layer (packages/openproject_api_sdk). That directly targets “the server changed and the client broke without us knowing.” Widget tests with mocked Dio are not a substitute.

  4. What already works: The repo has substantial unit, BLoC, and use case coverage under test/. The strategy is to extend proven layers, not restart from zero.

  5. Organizational ask: Treat test work as part of delivery in sprint planning (transparent capacity band and Definition of Done). Use TDD-style regression tests for reproducible bugs; avoid dogmatic TDD for trivial changes.

Decisions for management

Decisions for QA

Audience and how to use this doc

Audience

Use

Managers

Trade-offs (cost, schedule, risk), CI expectations, why sprint capacity for tests is rational.

QA

What automation can replace or narrow, weekly smoke scope, where to log gaps when coverage does not exist yet.

Glossary (short)

Term

Meaning here

Unit test

Fast, no I/O; pure functions, parsers, small helpers.

BLoC / Cubit test

State transitions and side-effect ordering with controlled fakes (bloc_test).

Use case test

Application service orchestration with fake repositories or ports—not real network.

Widget test

Pumps widgets under flutter_test; usually with injected fakes or fixed bloc states.

Golden test

Compares rasterized output to a reference image; great for stable design surfaces, sensitive to fonts and OS.

Integration test (integration_test)

Runs a real app binding; often on device or emulator; higher cost and flake risk.

Contract / API test

Asserts HTTP shapes, status codes, and parsing against fixtures or a staging API; catches server drift.

Flow snapshot test (optional pattern)

Full-app widget test: pump near-complete app, Dio (or client) returns static JSON from test/, platform dependencies faked, scripted user actions, golden screenshots at key states—see Option: Full-app fixture-driven flow tests with screenshots.

Current baseline in this repository

Facts you can cite when prioritizing work:

Area

Baseline

CI

.github/workflows/ci-cd.yml runs flutter test on ubuntu-latest. There is no integration_test job and no golden-specific job. iOS jobs build IPA but do not add extra automated test layers beyond the shared Flutter test job pattern.

Integration tests

integration_test/sign_in_test.dart plus mocks under integration_test/mocks/ show a viable pattern: real widget integration with mocked auth boundaries—good for smoke without Appium.

Unit / BLoC / use case

Many tests under test/ (blocs, use cases, forms, utils). This is an existing strength.

Golden tests

No matchesGoldenFile usage observed in test/ or lib/ at the time of writing—goldens would be a new investment with CI policy implications.

API SDK tests

packages/openproject_api_sdk/test/openproject_api_sdk_test.dart is effectively a stub—high-leverage gap for API drift detection.

Feature breadth versus “needs device or OS”

Feature areas: There are 21 top-level feature directories under lib/app/features/ (for example auth, work_package, home, time_tracking, shared_files, notifications, onboarding, projects, user).

Platform-sensitive dependencies (from pubspec.yaml) include OAuth (flutter_appauth), deep links (app_links), share-in (receive_sharing_intent), image_picker, file_picker, video_player, home_widget, live_activities, flutter_local_notifications, flutter_background_service, flutter_inappwebview, gal, permission_handler, Drift/SQLite, secure storage, and others.

Code touchpoints: A search for direct use of the heaviest plugins (for example ImagePicker, FilePicker, home_widget, local notifications, background service, sharing, Gal, flutter_appauth, AppLinks) lands on the order of roughly 20–25 Dart files under lib/. Many of these are shared services consumed by several features—not 25 separate products.

Interpretation

flowchart TB
  subgraph fastCI [Fast CI - GitHub Actions]
    unit[Unit utils parsers]
    bloc[BLoC Cubit bloc_test]
    usecase[Use cases fake repos]
    widget[Widget tests]
    golden[Golden tests optional]
    contract[API contract or fixture HTTP tests]
  end
  subgraph slowManual [Weekly or manual]
    integ[integration_test on device or emulator]
    smoke[Smoke subset of critical journeys]
  end
  subgraph hardE2E [Rare deep E2E if needed]
    appium[Only if Flutter integration_test insufficient]
  end
  unit --> bloc
  bloc --> usecase
  usecase --> widget
  widget --> golden
  contract --> usecase
  integ --> smoke

Planned test types and where they fit

1. Integration testing on device or emulator (weekly smoke)

Intent: Catch integration issues that unit tests miss, and reduce repetitive manual checks for QA—not to duplicate every manual case.

Reality: Expensive in time and infrastructure; no device farm in CI today. Recommendation: Run a small fixed set of integration_test journeys once per week (or per release candidate), with a named owner and published pass/fail.

Suggested smoke scope (5–10 journeys, illustrative):

QA handoff: Weekly smoke narrows regression risk on “whole app glue”; it does not remove need for exploratory testing on new features or visual polish.

2. Widget tests and golden tests (CI-friendly)

Widget tests: Prefer fake repositories or fixed Cubit/BLoC states so failures localize to layout and interaction, not wire format.

Golden tests: Best for design-system widgets and stable screens. Plan for maintenance cost when typography, themes, or locales change. CI must use a single pinned environment for goldens (see Appendix).

BLoC mocked versus Dio mocked in widget tests

Approach

When to use

Trade-off

Mock / fake BLoC or fixed state

Most widget and golden tests

Fast, stable; does not prove HTTP parsing.

Fake repository at domain boundary

When the widget depends on orchestration outcomes

More logic than a dumb bloc mock, still avoids JSON in every test.

Mock Dio deep in the tree

Rarely

Couples UI tests to serialization; noisy failures; prefer dedicated API tests instead.

More “logic covered” without device tests: Put that in use case tests with a fake port (same idea as integration_test/mocks/mock_auth_client.dart at unit speed).

3. API tests without device (GitHub Actions)

Intent: Detect client breakage when the API or HAL changes.

Recommendation: Implement fixture-backed or staging-backed tests in or beside packages/openproject_api_sdk: status codes, error bodies, parsing, and critical query shapes. Optionally trigger workflows when the API repository changes—only after a minimal runnable suite exists; otherwise hooks create noise without signal.

Do not rely on “run every BLoC” as a proxy for API correctness; BLoCs with mocks prove app logic, not server truth.

4. Unit tests and bloc tests

Continue as the default for new rules and regressions. This layer already exists; extend it for every non-trivial state machine and use case branch.

Option: Full-app fixture-driven flow tests with screenshots

This is an optional pattern—not the default for every feature—when the team wants a single automated “snapshot” of a flow (navigation + parsing + UI) under CI without a device.

Shape of the approach

When it helps

Costs and risks

Use this pattern for few high-value journeys (for example one happy path per critical feature), not as the only test type for every screen.

Protection against breaking changes (by test category)

“Breaking change” here means anything that could ship a bad build: wrong data, crash, wrong UI, broken navigation, incompatible API, or environment-specific failure.

Category

API / JSON contract drift

App logic & state

UI layout & visuals

Navigation & deep links

Real device / OS / plugins

Unit

Low

Low (local only)

None

None

None

BLoC / Cubit

Low (unless bloc parses raw JSON)

High for covered transitions

Low

Low

None

Use case + fake repo

Low at HTTP edge

High for orchestration

None

Low

None

Widget (scoped, fake state)

Low

Medium (binding only)

High for pumped screens

Medium

None

Golden (selective)

Low

Low

High at snapshot points

Low

None

Contract / API tests (fixtures or staging)

High

Low

None

Low

Low (staging deps)

Flow snapshot (full app + JSON + goldens)

Medium (only if fixtures match reality)

High for scripted paths

High at milestones

High for scripted paths

Low

integration_test on device

Medium–high (if real backend)

High

Medium

High

High for covered plugins

Reading the table: No single layer scores high everywhere. Combine contract tests (server truth), BLoC/use case (rules), scoped widget or goldens (UI), and a small set of device smokes or flow snapshots for glue.

What gives the most benefit without “testing for testing’s sake”

Ordered by defect prevention per minute of maintenance for this codebase:

  1. Contract or fixture-backed API tests — addresses unaware API-side breaks; lives next to HTTP/DTO code.

  2. BLoC and use case tests — fast feedback on business rules and orchestration.

  3. Widget tests — non-trivial UI, errors, empty states, accessibility fixes where applicable.

  4. Golden tests — selective; design system and stable screens; needs CI discipline.

  5. Weekly **integration_test** smoke — small journey set; human-process ownership.

  6. Flow snapshot tests (optional) — use sparingly for critical end-to-end UI stories under flutter test; pair with API contract tests so JSON fixtures do not drift silently.

Suggestions: ROI order, bootstrap order, limited time

Why flow snapshot is last in the numbered list — That list ranks return per minute of maintenance (and CI fit), not “business unimportance.” Flow snapshots combine DI, routing, fixtures, and goldens and overlap API and visual checks unless limited to very few journeys. Prefer them after cheaper layers, or only where one scripted story is worth that cost.

Two orderings (do not confuse them)

If there is no time for “everything” (digest)

  1. Fixture or contract tests at the HTTP client — server drift.

  2. BLoC and use case tests — rules and branches.

  3. A small device smoke set — glue.

  4. Scoped widget tests — risky UI states.

  5. Goldens — only with pinned CI and agreed scope.

  6. Flow snapshots — few critical stories, not a duplicate of the whole pyramid.

Bug-driven deepening (works with “big tests first”)

You may prioritize wide tests early; still add unit / BLoC / use case (or a small widget test) when fixing a bug or touching non-trivial logic—cheap regression nets grow on real pain. Use bugs and meaningful edits as triggers, not vague “when we have time.” For new API or domain behavior, add at least a contract or use case happy path—not only tests born from defects—so happy paths do not stay untested.

Effort and maintenance (qualitative scale)

Layer

Effort to write

Effort to maintain

Flake risk

CI fit today

Unit

Low

Low

Very low

Excellent

BLoC

Low–medium

Low

Low

Excellent

Use case + fake repo

Medium

Low–medium

Low

Excellent

Widget

Medium

Medium

Low

Good

Golden

Medium–high

High (design/locale)

Medium

Good if OS pinned

integration_test on device

High

Medium

Medium–high

Poor without device CI

Cross-repo API hook

Medium setup

Low per change if automated from OpenAPI/fixtures

Low

Excellent once suite exists

Flow snapshot (full app + fixtures + goldens)

Very high

High

Medium–high

Good if OS pinned for goldens

Authoring time: manual versus AI-assisted (Cursor, Claude)

The ranges below are indicative engineer-time for one medium-complexity feature in this codebase (significant UI + state + a few API calls). They are not estimates for legal or procurement use—teams vary with familiarity, DI shape, and how stable finders are.

Assumptions: AI = strong prompting + human review and correction; restricted environments may add time for redaction and offline iteration.

Initial coverage (first time you add tests for that feature)

Test category

Manual (typical range)

AI-assisted (typical range)

Notes

Unit (helpers, parsers)

0.25–1.5 h

0.15–0.75 h

AI excels at table-driven cases.

BLoC / Cubit

1–4 h

0.5–2 h

Depends on event/side-effect complexity.

Use case + fake repo

1.5–5 h

1–3 h

Fakes must match real ports; AI speeds scaffolding.

Widget (scoped subtree, fake bloc/repo)

2–8 h

1–4 h

Finder stability drives variance.

Golden only (a few stable widgets or screens)

2–6 h

1–3 h

First-time CI + font pinning not included.

Contract / API (first endpoints + fixtures)

3–12 h

2–8 h

Faster if OpenAPI or samples exist.

integration_test journey (device/emulator)

4–16 h

2.5–10 h

Flakiness tuning often dominates.

Flow snapshot (full app + Dio JSON + platform fakes + flow + goldens)

1–3 days

0.5–2 days

DI + routing + async + baseline images; AI helps but does not remove integration pain.

Ongoing cost (one sprint later: small product or API tweak)

Test category

Manual (typical range)

AI-assisted (typical range)

Unit / BLoC / use case

0.25–2 h

0.15–1.25 h

Widget (scoped)

0.5–3 h

0.25–2 h

Golden

0.5–4 h

0.25–3 h (often re-baselining images)

Contract / API

0.5–3 h

0.25–2 h

integration_test

1–6 h

0.5–4 h

Flow snapshot

0.5–2 days

0.25–1.5 days

What AI usually does not compress much

Classic authoring versus AI-assisted (Claude, Cursor)

Topic

Classic

With AI assistance

First draft of tests and mocks

Slower

Faster boilerplate and case enumeration

Flaky test diagnosis

Engineer-led

Still engineer-led; AI may suggest hypotheses

Golden review

Human judgment

Human judgment; AI should not “approve” pixels

Secrets and restricted env

Controlled manually

Still require policy: no credentials in prompts, offline constraints respected

Wrong green tests

Rare if review is strict

Higher risk if assertions are weak—review stays in Definition of Done

Bottom line for management: AI reduces typing and scaffolding time; it does not remove review, CI stability, or product choices about what must be covered. Use the authoring time tables above when negotiating sprint capacity.

Organizational recommendations

Sprint planning

TDD for bugs

Appendix: risks, open decisions, and environment limits

This appendix is not a list of blockers; it is a list of places where strategy meets reality. Each item mixes risk (what goes wrong if ignored), open decision (what leadership or the team must choose), and environment limit (what GitHub Actions, emulators, or OS vendors do not guarantee). Use it when estimating cost, assigning owners, or explaining to stakeholders why a test type “works in principle” but needs guardrails.

Weekly integration without rigor

Context: A policy of “run integration tests weekly” sounds simple. In practice it competes with releases, support, and PTO. If nobody is accountable, the habit dies and confidence drops back to manual-only without anyone updating the strategy doc.

Risk: Silent gaps—you believe smoke runs, but it has not run for weeks; regressions ship; QA is asked to compensate with broader manual passes under time pressure.

What to decide explicitly

Environment limit: Hosted device farms cost money; local devices depend on who is in the office. Budget and access are management inputs, not engineering-only details.

Golden tests on GitHub Actions

Context: Golden tests rasterize widgets to pixels. Pixel output depends on font metrics, subpixel rendering, theme, device pixel ratio, and Skia/Impeller behavior. GitHub’s ubuntu-latest runners are not pixel-identical to macOS, iOS, or Android.

Risk: PRs fail only because the runner image changed, or because a designer updated a token that was never meant to block merge. Teams then disable goldens or stop updating baselines—losing the benefit entirely.

What to decide explicitly

Environment limit: Linux vs macOS font shaping differs; emulator vs physical device differs. “Looks the same to a human” is not the same as “byte-identical PNG.”

API repository hooks

Context: The desirable story is: “API repo changed → client tests run → we know before merge.” That only works if the client repo contains a test suite that speaks the same contract as production (or staging), and if credentials and rate limits are handled.

Risk: A hook that runs a smoke URL against production creates flaky jobs, rate limits, and compliance issues. A hook that runs nothing meaningful trains everyone to ignore red builds.

What to decide explicitly

Environment limit: CI runners may not reach internal APIs without VPN or self-hosted runners; that is an infrastructure decision, not a test style decision.

Notifications, background work, Firebase

Context: The app uses platform channels, local notifications, background services, and Firebase-related tooling for stability and diagnostics. CI is a headless, often non-Google Play Services Linux environment. It does not replicate APNs delivery, exact alarm policies on newer Android, or user permission flows the way a phone does.

Risk: Assuming “green CI means push works” creates false confidence. Real failures appear only in dogfood, staging, or store review.

What to decide explicitly

Environment limit: Simulating “user dismissed notification” or “app killed then opened from tap” in CI is brittle; budget for targeted manual or device-farm runs for those stories when they change.

Appium (or other external UI drivers)

Context: Flutter’s **integration_test** package drives the app from Dart, shares the same isolate model, and is the default in the ecosystem. Appium (or similar) drives the UI from outside, often across a bridge, and shines when non-Flutter surfaces, system dialogs, or multi-app scenarios dominate.

Risk: Two stacks mean double maintenance, slower feedback, and harder debugging for the majority of flows that Flutter already covers.

What to decide explicitly

Environment limit: For this codebase, the share of UI that requires Appium-style control is small relative to total features; default to **integration_test** first.

Flow snapshot tests (full app + JSON fixtures + goldens)

Context: This pattern gives a cinematic record of a feature under **flutter_test**, but it stacks DI setup, routing, fixture curation, and golden churn in one place.

Risk: The team maintains two sources of truth for JSON—fixtures in widget tests and reality on the server—unless contract tests own the canonical fixtures.

What to decide explicitly

Environment limit: Same as goldens: OS and fonts must be pinned for comparable screenshots.

Local persistence, time, and locale (Drift, preferences, clocks)

Context: The app uses local storage (for example Drift/SQLite, preferences). Tests must control schema migrations, seed data, and clock (DateTime.now(), time zones) or become order-dependent and flaky.

Risk: Tests pass locally and fail in CI at midnight UTC, or fail only when run in parallel.

What to decide explicitly

Environment limit: CI default locale may differ from a developer’s laptop—document or fix locale in tests that format dates and numbers.

Secrets, compliance, and “restricted environment” work

Context: Some organizations forbid pasting production URLs or tokens into AI tools, block arbitrary outbound network from CI, or require audit trails for test data.

Risk: Engineers skip writing API tests because “CI cannot reach the server,” or leak secrets into logs and golden names.

What to decide explicitly

Environment limit: If outbound network is disallowed, contract tests must use checked-in HTTP recordings or static OpenAPI examples—there is no alternative in-process.

Document maintenance

Revisit this strategy after major changes: introduction of golden CI, addition of API contract suite, or onboarding of a device farm. Revisit the appendix decisions (owners, OS pins, fixtures, secrets) when those change. Update the smoke journey list with QA when major flows ship or retire.


Overview

We are excited to announce the Beta Release of the OpenProject Mobile App — now available in the App Store and Google Play Store. This Beta version marks the beginning of our journey to bring OpenProject to your mobile devices, enabling you to stay connected and productive wherever you are.

Note: The app is currently under active development, and core features are being continuously improved. We invite you to test the app, share feedback, and help shape the future of OpenProject Mobile.

Purpose and Vision

The OpenProject Mobile App is designed as a companion application to the OpenProject web and desktop experience. It allows you to:

The goal is to provide lightweight mobile access for essential collaboration and project management tasks, perfectly complementing the full web experience of OpenProject.

Current Beta Features

In this initial Beta version, you can:

Mobile-Only Features

The OpenProject Mobile App introduces a set of features built specifically for mobile devices, designed to make project management faster, more focused, and more convenient wherever you are:

These mobile-specific capabilities enhance your ability to work efficiently, document instantly, and stay connected — all while maintaining focus and flexibility on the go.

Coming Soon

The app is still under development, and many core features are planned for future updates, including:

These upcoming features will make the OpenProject Mobile App even more connected, collaborative, and aligned with the full OpenProject experience.

Feedback and Involvement

As a Beta user, your feedback is invaluable. If you encounter issues or have suggestions, please let us know: 

Your input directly helps improve the mobile experience and ensure a stable, feature-rich public release.

Availability

The OpenProject Mobile App (Beta) is available now for:

Requirements

To access and use the OpenProject Mobile App (Beta), you’ll need the following:

Note: Some features, such as deep-linking and realtime push notifications, may depend on your organization’s configuration or will become available in future updates.

Disclaimer

This is a Beta Release, which means the app may contain incomplete features and occasional bugs.
We recommend using it alongside the OpenProject web application for the full experience.


General code styling rules

Widgets layer

Preferably create stateless widgets, not methods if you build a reusable UI block

Working with Flutter BLoC:

Event Handling in Bloc:

By default, we prefer using sealed event classes with a single **on<Event>** handler. This approach ensures compile-time exhaustiveness checks — if a new event subtype is added, the compiler will require handling it explicitly in the switch statement. It also improves code organization by keeping related event logic grouped together and easier to maintain.

// events.dart
sealed class WorkPackageFormEvent {}

final class WorkPackageFormInit extends WorkPackageFormEvent {}
final class WorkPackageFormRefresh extends WorkPackageFormEvent {}
final class WorkPackageFormSubmit extends WorkPackageFormEvent {}
final class WorkPackageFormUpdated extends WorkPackageFormEvent {}

// bloc.dart
on<WorkPackageFormEvent>(
  (event, emit) => switch (event) {
    WorkPackageFormInit() => _onInit(event, emit),
    WorkPackageFormRefresh() => _onRefresh(event, emit),
    WorkPackageFormSubmit() => _onSubmit(emit),
    WorkPackageFormUpdated() => _onUpdated(event, emit),
  },
);

If no event transformers (e.g., debounce, throttle, droppable, restartable) are required, always use the sealed-class + single-handler pattern for clarity and type safety.

When individual events require different concurrency or timing behaviors, use separate **on<SpecificEvent>** handlers to assign appropriate transformers and keep event processing independent.

on<WorkPackagesInitEvent>((event, emit) => _init(event, emit));
on<WorkPackagesRefreshEvent>((event, emit) => _refresh(event, emit));
on<WorkPackagesLoadEvent>((event, emit) => _load(event, emit));

// Example: distinct transformer for one event
on<WorkPackagesUpdateFilterEvent>(
  transformer: debounceSequential(const Duration(milliseconds: 300)),
  (event, emit) => _updateFilter(event, emit),
);

 In summary:

Default → sealed class + single on<Event> with switch

⚙️ Exception → multiple on<SpecificEvent> when distinct transformers are needed


Smoke Tests

A comprehensive test that we can run once in several sprints to check that all main features are working. This can be a base of automated tests

---

1. Installation & Update

#  

Use Case

Steps

Expected Result

Result

1.1

Fresh install — Android

1. Uninstall any existing version
2. Install the new APK/AAB on a clean device
3. Launch the app

App installs without errors; splash screen and onboarding are shown


1.2

Fresh install — iOS

1. Uninstall any existing version
2. Install the new IPA on a clean device
3. Launch the app

App installs without errors; splash screen and onboarding are shown


1.3

Fresh install — complete login flow

1. Fresh install
2. Complete onboarding
3. Enter instance URL and credentials
4. Log in

User is authenticated and lands on Home dashboard


1.4

Fresh install — no leftover data

1. Fresh install after a previous installation existed
2. Launch app

No stale data, cached credentials, or broken state from the previous install


1.5

Update over existing install — Android

1. Install the previous release version
2. Log in and navigate to a few screens
3. Install the new build on top (without uninstalling)

App updates successfully; existing session is preserved


1.6

Update over existing install — iOS

1. Install the previous release version via TestFlight or direct install
2. Log in and use the app
3. Install the new build on top

App updates successfully; existing session is preserved


1.7

Session preserved after update

1. Log in on the old version
2. Update to the new build without uninstalling

User is still logged in after update; no forced re-login unless intentional


1.8

Cached data intact after update

1. Use the app on old version (load projects, work packages)
2. Update to new build
3. Open the app

Previously cached content is still accessible or gracefully refreshed


1.9

Settings preserved after update

1. Change user preferences (e.g., activity order, notification settings) on old version
2. Update to new build

User preferences are retained after the update


---

2. Login & Authentication

#

Use Case

Steps

Expected Result

Result

2.1

Launch app (not logged in)

Cold-start the app with no active session

Splash screen appears briefly, then redirects to Sign In page


2.2

Sign in with valid credentials

1. Enter valid server URL
2. Enter correct email & password
3. Tap Sign In

User is authenticated and redirected to Home dashboard


2.3

Sign in with wrong password

1. Enter valid server URL
2. Enter correct email, wrong password
3. Tap Sign In

Error message is shown; user remains on Sign In page


2.4

Sign in with no internet connection

1. Enter valid server URL
2. Tap Sign In

Error message is shown


2.5

Sign in to a wrong server instance

1. Enter an invalid URL (i.e. google.com)
2. Tap Sign In
3. Observe the wrong web page
4. Close the web page

Error message is shown; user remains on Sign In page


2.6

Instance selection via bottom sheet

1. On Sign In page, tap the instance selector control
2. Select or enter a different instance URL

Bottom sheet opens; selected instance URL is applied to the sign-in form


2.7

Session persistence after app restart

1. Log in successfully
2. Close and reopen the app

User lands directly on Home dashboard without seeing Sign In page


2.8

Sign out

1. Navigate to Account/User section
2. Tap Logout
3. Confirm if prompted

User is signed out and redirected to Sign In page; session is cleared


---

3. Onboarding

#

Use Case

Steps

Expected Result

Result

3.1

First-time onboarding shown

Install a fresh build and launch the app for the first time

Onboarding carousel is shown before the login screen


3.2

Swipe through onboarding pages

Swipe left through all onboarding slides

Each slide advances; progress indicator updates


3.3

Skip onboarding

Tap the Skip button on any onboarding page

Onboarding is dismissed; user is taken to Sign In page


3.4

Complete onboarding

Advance through all slides to the last one and tap Continue/Get Started

User is taken to Sign In page


3.5

Onboarding not shown on second launch

Complete onboarding, close the app, reopen it

Onboarding is not shown again; app goes to Sign In or Home directly


---

4. Home Dashboard

#

Use Case

Steps

Expected Result

Result

4.1

Dashboard loads with widgets

Log in and navigate to the Home tab

Home dashboard loads; visible widgets display their content without errors


4.2

Notifications widget

View the Notifications widget on Home

Widget shows the count of unread notifications


4.3

Assigned to Me widget

View the Assigned to Me widget

Widget lists work packages currently assigned to the logged-in user


4.4

Recently Edited widget

View the Recently Edited widget

Widget shows recently modified work packages


4.5

Favorite Projects widget

View the Favorite Projects widget

Widget shows the user's starred/favorited projects


4.6

Time Tracker widget

View the Time Tracker widget

Widget shows weekly tracked time summary


4.7

Tap a work package in a widget

Tap any work package listed in a Home widget

App navigates to the Work Package Details screen for that item


4.8

Tap a project in Favorite Projects

Tap a project in the Favorite Projects widget

App navigates to that project's overview


4.9

Pull to refresh

Pull down on the Home dashboard

Dashboard data refreshes; widgets reload their content


---

5. Projects / Workspaces

#

Use Case

Steps

Expected Result

Result

5.1

Projects list loads

Navigate to the Workspaces/Projects tab

List of accessible projects is displayed


5.2

Search projects

Tap the search field and type a partial project name

List filters to show matching projects only


5.3

Filter by project type

Apply a project type filter

Only projects matching the selected type are shown


5.4

Toggle favorites view

Switch between "All Projects" and "Favorites" view

List updates to show only favorited projects or all projects accordingly


5.5

Open project overview

Tap on a project in the list

Project Overview page opens showing project details


5.6

Project overview tabs

Inside a project, switch between the available tabs (Details, Work Packages, Subprojects, etc.)

Each tab loads its content correctly


5.7

Navigate to work packages from project

Inside a project's Work Packages tab, tap a work package

Work Package Details screen opens for that item


5.8

Subprojects list

Open a project that has subprojects and view the Subprojects tab

Subprojects are listed under that parent project


---

6. Work Packages

6a. Work Package List

#

Use Case

Steps

Expected Result

Result

6.1

Work packages list loads

Navigate to the Work Packages tab

List of work packages loads correctly


6.2

Filter work packages by status

Apply a status filter (e.g., "In Progress")

Only work packages with that status are shown


6.3

Filter by assignee

Apply an assignee filter

Only work packages assigned to that person are shown


6.4

Search work packages

Type a query in the search field

List filters to work packages matching the query


6.5

Pull to refresh

Pull down on the work packages list

List refreshes with latest data from the server


6.6

Tap a work package

Tap any item in the list

Work Package Details screen opens


6b. Work Package Details

#

Use Case

Steps

Expected Result

Result

6.7

Details screen loads

Open any work package

Title, type, status, and description are displayed correctly


6.8

Switch to Activity tab

In Work Package Details, tap the Activity tab

Activity/comment history is displayed


6.9

Switch to Attachments tab

Tap the Attachments tab

Uploaded files are listed (or empty state shown)


6.10

Switch to Relations tab

Tap the Relations tab

Related work packages are listed


6.11

View a file attachment

Tap an attachment in the Attachments tab

File preview or download opens


6c. Create Work Package

#

Use Case

Steps

Expected Result

Result

6.12

Open create form

Tap the "+" / Create button on the Work Packages screen

Create Work Package form opens


6.13

Create with required fields

1. Select a project
2. Select a type
3. Enter a subject/title
4. Tap Save

New work package is created; user is navigated to its details or back to the list


6.14

Validation on empty title

Leave the subject/title field empty and tap Save

Validation error is shown; work package is not created


6.15

Cancel creation

Open the create form and tap Cancel/Back

Form closes; no work package is created


6d. Edit Work Package

#

Use Case

Steps

Expected Result

Result

6.16

Edit title

Open work package details, tap Edit, change the title, save

Updated title is reflected in the details view


6.17

Change status

In work package details or edit form, change the status field

Status updates and the change appears in the Activity tab


6.18

Change assignee

Edit the assignee field and save

New assignee is shown in the details


6.19

Edit description

Open the description editor, make a change, save

Updated description is rendered in the details view


6.20

Add a comment

In the Activity tab, type a comment and submit

Comment appears in the activity timeline


---

7. Time Tracking

7a. Time Tracking Overview

#

Use Case

Steps

Expected Result

Result

7.1

Time tracking page loads

Navigate to the Time Tracking tab

Calendar view loads with existing time entries


7.2

Navigate calendar dates

Tap previous/next day or week in the calendar

View updates to show entries for the selected period


7.3

View daily time entries

Tap a specific date in the calendar

Time entries for that day are displayed below


7.4

Weekly hours summary

View the time tracking page for a week

Total hours logged for the week are shown


7b. Focus Timer

#

Use Case

Steps

Expected Result

Result

7.5

Open focus timer

Navigate to the Timer tab within Time Tracking

Focus timer page shows with a circular timer at 00:00


7.6

Start timer

Tap the Start button

Timer begins counting up; Start changes to Pause


7.7

Pause and resume timer

Tap Pause, then tap Resume

Timer pauses at the current time; resuming continues from that point


7.8

Stop timer

Tap Stop

Timer stops; Create Log Time form opens to finalize the entry


7.9

Link work package to timer

Before or during timing, select a work package to link

Timer shows the linked work package name


7c. Log Time Entry

#

Use Case

Steps

Expected Result

Result

7.10

Create log time entry

1. Open Create Log Time form
2. Select work package
3. Enter hours
4. Select activity type
5. Tap Save

Time entry is saved and appears in the time tracking calendar


7.11

Validation on empty hours

Submit log time form without entering hours

Validation error is shown; entry is not saved


7.12

Date selection

Change the date field to a past date and save

Time entry is saved for the selected date


---

#

Use Case

Steps

Expected Result

Result

8.1

Open global search

Tap the Search icon in the navigation

Global Search screen opens with Work Packages and Projects tabs


8.2

Search for a work package

Type a work package title in the search field (Work Packages tab)

Matching work packages appear in the results list


8.3

Search for a project

Switch to the Projects tab and type a project name

Matching projects appear in results


8.4

Filter search results

Apply a filter (status, type, etc.) within Work Packages search

Results are narrowed to match the applied filter


8.5

Navigate to result

Tap a work package in search results

Work Package Details screen opens for that item


8.6

Navigate to project result

Tap a project in search results

Project Overview page opens


8.7

Empty state

Search for a string with no matches

Empty state message is shown; no crash


8.8

Clear search query

Clear the search input field

Results reset; prior state or empty prompt is shown


---

9. Notifications

#

Use Case

Steps

Expected Result

Result

9.1

Notifications list loads

Navigate to the Notifications tab

List of notifications is displayed


9.2

Notification count badge

Check the Notifications tab icon when there are unread notifications

Badge shows correct unread count


9.3

View notification details

Tap a notification in the list

Associated work package details are shown inline or the user is navigated to it


9.4

Notification reason

Tap or long-press a notification to see the reason

Bottom sheet or tooltip explains why the user was notified (e.g., "Assigned to you")


9.5

Mark as read

Mark a notification as read (if the action is available)

Notification is marked read; unread count decreases


9.6

Empty state

View Notifications when there are none

Empty state message is displayed; no crash


9.7

Pull to refresh

Pull down on the notifications list

List refreshes with latest notifications


---

10. User Profile & Settings

10a. User Profile

#

Use Case

Steps

Expected Result

Result

10.1

Open user profile

Navigate to Account/User tab

User profile page shows name, email, and avatar


10.2

View account details

Tap on Account Details

Account info page opens with the user's profile data


10.3

View another user's profile

Tap a user's avatar or name (e.g., in work package details)

That user's profile view opens with their basic info


10b. Notification Settings

#

Use Case

Steps

Expected Result

Result

10.4

Open notification settings

Go to Settings → User Notifications

Notification preferences screen opens


10.5

Toggle a notification preference

Toggle an email notification setting on or off

Setting is saved; toggle reflects the new state after navigating away and back


10d. Work Package Settings

#

Use Case

Steps

Expected Result

Result

10.6

Open work package settings

Go to Settings → Work Package Settings

Settings page opens


10.7

Change activity sort order

Switch activity order between newest/oldest first

Setting is saved; activity in work packages reflects the chosen order


---

11. Rich Text Editor

#

Use Case

Steps

Expected Result

Result

11.1

Open editor

Edit the description of a work package or add a comment

Rich text editor opens


11.2

Bold text

Select text and tap the Bold button

Selected text becomes bold


11.3

Italic text

Select text and tap the Italic button

Selected text becomes italic


11.4

Bullet list

Tap the unordered list button and type items

Bullet list is created


11.5

Numbered list

Tap the ordered list button and type items

Numbered list is created


11.6

Add a hyperlink

Tap the link button, enter a URL and display text

Link is inserted and rendered as clickable text


11.7

Heading formatting

Select a heading level and type

Text is rendered as a heading


11.8

Mention a user

Type @ followed by a username

Autocomplete suggestion appears; selecting it inserts a user mention


11.9

Mention a work package

Type # followed by a work package ID or title

Autocomplete suggestion appears; selecting it inserts a work package link


11.10

Save edited content

Make changes and tap Save/Done

Changes are persisted and rendered correctly in the details view


11.11

Discard changes

Make changes and tap Cancel/Back without saving

Changes are discarded; original content is unchanged


---

12. Share to App (External File Sharing)

#

Use Case

Steps

Expected Result

Result

12.1

Share a file from another app

From the device Files app (or another app), share a file and select OpenProject

OpenProject opens the Share page with the file ready to attach


12.2

Select a project for attachment

On the Share page, select a target project

Project is selected and work packages for that project are available


12.3

Select a work package

Select a work package to attach the file to

Work package is confirmed as the attachment target


12.4

Confirm attachment upload

Tap Attach/Confirm

File is uploaded to the selected work package; success state is shown


12.5

Cancel sharing

Open the Share page and tap Cancel/Back

App closes the share intent; no file is uploaded


---

13. Navigation & General

#

Use Case

Steps

Expected Result

Result

13.1

Bottom navigation tabs

Tap each icon in the bottom navigation bar

Each tab navigates to the correct screen


13.2

Back navigation

Navigate into a deep screen and tap the back button/gesture

App navigates back through the screen stack correctly


13.3

Deep link to work package

Open a valid deep link to a work package (e.g., from a email)

App opens and navigates directly to the correct work package


13.4

App runs without crashes (baseline)

Use the app normally for 5 minutes across multiple screens

No unexpected crashes or ANR (unresponsive) events occur




Essential Smoke Tests


Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.  
**Full test suite:** See Comprehensive list

---

1. Installation & Update

#

Use Case

Steps

Expected Result

Result

1.1

Fresh install

Uninstall the app, install the new build, launch it

App opens without errors; onboarding or login screen is shown


1.2

Update over existing install

Install the previous release, log in, then install the new build on top
(this operation can be non-trivial for Android, so for a quick smoke test on Android we can rely on previous experience and omit this step)

App launches; user is still logged in, no crash


---

2. Login & Authentication

#

Use Case

Steps

Expected Result

Result

2.1

Sign in with valid credentials

Enter a valid instance URL, email, and password; tap Sign In

User reaches the Home dashboard


2.2

Sign in with wrong credentials

Enter a valid URL with a wrong password; tap Sign In

Error message is shown; user stays on Sign In page


2.3

Session persists after restart

Log in, close the app fully, reopen it

User lands on Home dashboard without re-login


2.4

Sign out

Navigate to Account, tap Log Out

User is returned to the Sign In screen


---

3. Home Dashboard

#

Use Case

Steps

Expected Result

Result

3.1

Dashboard loads

Log in and open the Home tab

Widgets load without errors or blank screens


3.2

Navigate from widget

Tap a work package in any Home widget

Work Package Details screen opens


---

4. Projects / Workspaces

#

Use Case

Steps

Expected Result

Result

4.1

Projects list loads

Open the Workspaces tab

List of projects is displayed


4.2

Open a project

Tap any project in the list

Project overview opens with at least one tab loading correctly


---

5. Work Packages

#

Use Case

Steps

Expected Result

Result

5.1

Work package list loads

Open the Work Packages tab

List of work packages is displayed


5.2

Open work package details

Tap any work package

Details screen shows title, status, and description


5.3

Create a work package

Tap "+", fill in title, type, and project; save

Work package is created and visible in the list


5.4

Edit a field

Open a work package, change the status, save

Updated status is shown in the details view


5.5

Add a comment

Open a work package, go to Activity tab, post a comment

Comment appears in the activity timeline


---

6. Time Tracking

#

Use Case

Steps

Expected Result

Result

6.1

Time tracking page loads

Open the Time Tracking tab

Calendar and time entries load


6.2

Start and stop timer

Open the Timer tab, tap Start, wait a few seconds, tap Stop

Log Time form opens pre-filled with elapsed time


6.3

Save a time entry

Fill in the Log Time form and confirm

Entry is saved and appears in the calendar view


---

#

Use Case

Steps

Expected Result

Result

7.1

Search returns results

Open Search, type a known work package title

Matching results appear in the list


7.2

Navigate to result

Tap a result

Correct work package detail screen opens


---

8. Notifications

#

Use Case

Steps

Expected Result

Result

8.1

Notifications list loads

Open the Notifications tab

Notification list is displayed (or empty state shown)


8.2

Tap a notification

Tap any notification

Associated work package detail opens


---

9. User Profile & Settings

#

Use Case

Steps

Expected Result

Result

9.1

Profile loads

Open the Account tab

User name, email, and avatar are displayed


9.2

Settings are accessible

Open Account → Work Package Settings

Settings page opens without error


---

10. Navigation & Stability

#

Use Case

Steps

Expected Result

Result

10.1

Bottom nav tabs all work

Tap each icon in the bottom navigation bar

Each tab opens its correct screen


10.2

Back navigation

Go several screens deep, press back

App navigates back correctly without crash


10.3

Offline error handling

Disable network, try to load any screen

Error or offline message shown; app does not crash


10.4

No crash during basic usage

Use the app across all main sections for ~10 minutes

No crashes or unresponsive states occur



Essential Smoke Tests


Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.  
**Full test suite:** See Comprehensive list

---

1. Installation & Update

#

Use Case

Steps

Expected Result

Result

1.1

Fresh install

Uninstall the app, install the new build, launch it

App opens without errors; onboarding or login screen is shown


1.2

Update over existing install

Install the previous release, log in, then install the new build on top
(this operation can be non-trivial for Android, so for a quick smoke test on Android we can rely on previous experience and omit this step)

App launches; user is still logged in, no crash


---

2. Login & Authentication

#

Use Case

Steps

Expected Result

Result

2.1

Sign in with valid credentials

Enter a valid instance URL, email, and password; tap Sign In

User reaches the Home dashboard



2.2

Sign in with wrong credentials

Enter a valid URL with a wrong password; tap Sign In

Error message is shown; user stays on Sign In page


2.3

Session persists after restart

Log in, close the app fully, reopen it

User lands on Home dashboard without re-login


2.4

Sign out

Navigate to Account, tap Log Out

User is returned to the Sign In screen


---

3. Home Dashboard

#

Use Case

Steps

Expected Result

Result

3.1

Dashboard loads

Log in and open the Home tab

Widgets load without errors or blank screens


3.2

Navigate from widget

Tap a work package in any Home widget

Work Package Details screen opens


---

4. Projects / Workspaces

#

Use Case

Steps

Expected Result

Result

4.1

Projects list loads

Open the Workspaces tab

List of projects is displayed


4.2

Open a project

Tap any project in the list

Project overview opens with at least one tab loading correctly


---

5. Work Packages

#

Use Case

Steps

Expected Result

Result

5.1

Work package list loads

Open the Work Packages tab

List of work packages is displayed


5.2

Open work package details

Tap any work package

Details screen shows title, status, and description


5.3

Create a work package

Tap "+", fill in title, type, and project; save

Work package is created and visible in the list


5.4

Edit a field

Open a work package, change the status, save

Updated status is shown in the details view


5.5

Add a comment

Open a work package, go to Activity tab, post a comment

Comment appears in the activity timeline


---

6. Time Tracking

#

Use Case

Steps

Expected Result

Result

6.1

Time tracking page loads

Open the Time Tracking tab

Calendar and time entries load


6.2

Start and stop timer

Open the Timer tab, tap Start, wait a few seconds, tap Stop

Log Time form opens pre-filled with elapsed time


6.3

Save a time entry

Fill in the Log Time form and confirm

Entry is saved and appears in the calendar view


---

#

Use Case

Steps

Expected Result

Result

7.1

Search returns results

Open Search, type a known work package title

Matching results appear in the list


7.2

Navigate to result

Tap a result

Correct work package detail screen opens


---

8. Notifications

#

Use Case

Steps

Expected Result

Result

8.1

Notifications list loads

Open the Notifications tab

Notification list is displayed (or empty state shown)


8.2

Tap a notification

Tap any notification

Associated work package detail opens


---

9. User Profile & Settings

#

Use Case

Steps

Expected Result

Result

9.1

Profile loads

Open the Account tab

User name, email, and avatar are displayed


9.2

Settings are accessible

Open Account → Work Package Settings

Settings page opens without error


---

10. Navigation & Stability

#

Use Case

Steps

Expected Result

Result

10.1

Bottom nav tabs all work

Tap each icon in the bottom navigation bar

Each tab opens its correct screen


10.2

Back navigation

Go several screens deep, press back

App navigates back correctly without crash


10.3

Offline error handling

Disable network, try to load any screen

Error or offline message shown; app does not crash


10.4

No crash during basic usage

Use the app across all main sections for ~10 minutes

No crashes or unresponsive states occur



  1. to have a signed certifcate (https) on your instance

  2. open {BASE_URL}/admin/settings/experimental

  3. enable "Built in OAuth applications" flag

  4. open {BASE_URL}/admin/oauth/applications

  5. enable "Built-in OAuth applications" there

  6. log in inside the app

    NOTE: from version 17.0, the flag "Built in OAuth applications" is not in experimental any more


Overview

The app uses SharedPreferences for local data persistence approach to manage different data scopes. For different platforms (ios, android, desktops) this storage has different naming. All these implementation are covered under one umbrella of flutter library shared_preferences

This document describes the architecture, data flow, categorisation, and naming convention.


Architecture

Core Components

1. PreferencesStorage - Low-level wrapper around SharedPreferences
2. MultiUserPreferencesStorage - Helper for multi-user data storage
3. SettingsRepository - Repository layer for accessing settings
4. Use Cases - Business logic layer (GetUserSettingUseCase, SaveUserSettingUseCase)
5. BLoCs - Presentation layer that uses Use Cases

Data Flow

BLoC/Service
    ↓ (uses)
Use Case (GetUserSettingUseCase/SaveUserSettingUseCase)
    ↓ (gets current userId)
UserRepository
    ↓ (passes userId to)
SettingsRepository
    ↓ (uses)
MultiUserPreferencesStorage
    ↓ (uses)
PreferencesStorage (SharedPreferences wrapper)

Data Categories

Currently preferences are organised into four categories based on their scope and lifecycle:

1. Multi-User Preferences

Scope: Per-user data
Lifecycle: Persists across logout (for user switching support)
Storage Format: `{"userId1": data1, "userId2": data2}`
Access: Via Use Cases (GetUserSettingUseCase/SaveUserSettingUseCase)

2. App-Level Preferences

Scope: Application-wide settings
Lifecycle: Persists across all sessions and users
Storage Format: Direct key-value pairs
Access: Direct repository access (no Use Cases needed)

3. Instance-Level Preferences

Scope: OpenProject server configuration
Lifecycle: Persists until instance is changed
Storage Format: Direct key-value pairs
Access: Via InstanceConfigurationRepository

4. Legacy Preferences

Scope: Deprecated keys pending migration
Lifecycle: Various
Status: Should not be used in new code


Preference Keys Reference

Multi-User Preferences

Key

Type

Description

Used In

multi_user_bottom_bar_configs

BottomBarConfiguration

Bottom navigation bar customization per user

BottomBarConfigurationRepository

multi_user_timers

Timer

Active time tracking timers per user

TimeEntriesRepository

multi_user_work_package_settings

WorkPackageSettings

Work package display preferences (sorting, filtering, activities display)

SettingsRepository

multi_user_local_notification_settings

LocalNotificationsSettings

Local notification preferences (enabled/disabled, participants, weekdays)

SettingsRepository

multi_user_home_widgets

HomeDashboardWidgets

Home dashboard widget configuration and visibility

SettingsRepository

multi_user_push_enabled

bool

Push notification toggle per user

PreferencesStorage (direct)

multi_user_projects_last_sync

int (timestamp)

Last project sync timestamp for incremental sync

ProjectsSyncPreferences

multi_user_default_page

int

Default launch page index (which tab opens on startup)

SettingsRepository

App-Level Preferences

Key

Type

Description

Used In

app_theme

String (ThemeMode)

App theme mode: light, dark, or system

SettingsRepository

app_locale

String

User's selected language code (e.g., "en", "de")

LocaleRepository

app_developer_settings

DeveloperSettings

Developer mode settings and feature toggles

SettingsRepository

app_feature_flags

FeatureFlags

Feature flags configuration (experimental features)

SettingsRepository

Instance-Level Preferences

Key

Type

Description

Used In

instance_base_url

String

OpenProject instance base URL

InstanceConfigurationRepository

instance_client_id

String

OAuth client ID for the instance

InstanceConfigurationRepository

instance_instances_map

Map<String, String>

Map of instance URLs to client IDs for multi-instance support

InstanceConfigurationRepository

Legacy Preferences (need to be reviewed)

Key

Type

Description

Status

unreadNotificationsIdsPrefKey

List<int>

IDs of unread notifications

Used in background service, needs migration

Naming Convention

Follow the naming convention for new keys:
- Multi-user: multi_user_<descriptive_name>
- App-level: app_<descriptive_name>
- Instance-level: instance_<descriptive_name>


If you’re having trouble logging in to the OpenProject Mobile App, the following sections will help you identify and resolve the most common issues.

1. Invalid or Inaccessible Instance URL

Symptom:
You see an error such as “We can't connect with the instance URL. Please, check possible solutions here”

Cause:
The URL you entered may be incorrect, inaccessible, or not using HTTPS.

How to Fix:

2. OAuth Application Not Enabled

Symptom:
Login fails with an error such as “We can't complete the OAuth Authentication. Please, check possible solutions here”, or you are redirected back to the login screen without authentication.

Cause:
The mobile app uses OAuth 2.0 for secure authentication. If the built-in OAuth applications are not enabled in your instance, the app cannot log you in.

How to Fix:

  1. Go to your OpenProject administration area at:
    {BASE_URL}/admin/oauth/applications

  2. Make sure that Built-in OAuth applications are enabled.

  3. If you don’t have admin rights, contact your OpenProject administrator.

3. Instance Not on Minimum Supported Version

Symptom:
You receive an error such as “Instance not on minimum supported version: OpenProject 17.0.0”, or the authentication window fails to open.

Cause:
The OpenProject Mobile App requires your instance to be on OpenProject version 17.0.0 or later.
If your instance is running an older version, OAuth authentication may be disabled by default.

How to Fix:

💡 Note: Upgrading to the latest OpenProject version is recommended for the best compatibility and security.

4. Invalid SSL Certificate

Symptom:
You receive a message such as “Secure connection failed. Untrusted certificate”.

Cause:
Your OpenProject instance must use a valid, signed SSL certificate (HTTPS). Self-signed certificates or expired certificates are not supported.

How to Fix:

5. Wrong Credentials

Symptom:
You see “Invalid username or password” when logging in.

Cause:
Your login credentials are incorrect or have been changed.

How to Fix:

6. On-Premises API Access Disabled

Symptom:
Login attempts fail with no clear error message.

Cause:
Your on-premises OpenProject instance may have API access disabled, preventing the mobile app from connecting.

How to Fix:

7. Instance Using HTTP Instead of HTTPS

Symptom:
The app refuses to connect or shows “Secure connection failed. Untrusted certificate”.

Cause:
The mobile app only supports secure connections via HTTPS.

How to Fix:

8. Firewall or Network Restrictions

Symptom:
Login attempts time out or fail when using certain networks with an error such as “Login time out. Check your network”.

Cause:
Corporate or restricted networks may block outbound requests to your OpenProject instance or authentication endpoints.

How to Fix:



Currently we have iOs and Android builds. Both of them have two flavors for now: openproject and pmflexone

to build apps for prod please run: 

flutter build ios --flavor openproject --release

flutter build appbundle --flavor openproject --release



Smoke Tests

A comprehensive test that we can run once in several sprints to check that all main features are working. This can be a base of automated tests

---

1. Installation & Update

#  

Use Case

Steps

Expected Result

1.1

Fresh install — Android

1. Uninstall any existing version
2. Install the new APK/AAB on a clean device
3. Launch the app

App installs without errors; splash screen and onboarding are shown

1.2

Fresh install — iOS

1. Uninstall any existing version
2. Install the new IPA on a clean device
3. Launch the app

App installs without errors; splash screen and onboarding are shown

1.3

Fresh install — complete login flow

1. Fresh install
2. Complete onboarding
3. Enter instance URL and credentials
4. Log in

User is authenticated and lands on Home dashboard

1.4

Fresh install — no leftover data

1. Fresh install after a previous installation existed
2. Launch app

No stale data, cached credentials, or broken state from the previous install

1.5

Update over existing install — Android

1. Install the previous release version
2. Log in and navigate to a few screens
3. Install the new build on top (without uninstalling)

App updates successfully; existing session is preserved

1.6

Update over existing install — iOS

1. Install the previous release version via TestFlight or direct install
2. Log in and use the app
3. Install the new build on top

App updates successfully; existing session is preserved

1.7

Session preserved after update

1. Log in on the old version
2. Update to the new build without uninstalling

User is still logged in after update; no forced re-login unless intentional

1.8

Cached data intact after update

1. Use the app on old version (load projects, work packages)
2. Update to new build
3. Open the app

Previously cached content is still accessible or gracefully refreshed

1.9

Settings preserved after update

1. Change user preferences (e.g., activity order, notification settings) on old version
2. Update to new build

User preferences are retained after the update

---

2. Login & Authentication

#

Use Case

Steps

Expected Result

2.1

Launch app (not logged in)

Cold-start the app with no active session

Splash screen appears briefly, then redirects to Sign In page

2.2

Sign in with valid credentials

1. Enter valid server URL
2. Enter correct email & password
3. Tap Sign In

User is authenticated and redirected to Home dashboard

2.3

Sign in with wrong password

1. Enter valid server URL
2. Enter correct email, wrong password
3. Tap Sign In

Error message is shown; user remains on Sign In page

2.4

Sign in with no internet connection

1. Enter valid server URL
2. Tap Sign In

Error message is shown

2.5

Sign in to a wrong server instance

1. Enter an invalid URL (i.e. google.com)
2. Tap Sign In
3. Observe the wrong web page
4. Close the web page

Error message is shown; user remains on Sign In page

2.6

Instance selection via bottom sheet

1. On Sign In page, tap the instance selector control
2. Select or enter a different instance URL

Bottom sheet opens; selected instance URL is applied to the sign-in form

2.7

Session persistence after app restart

1. Log in successfully
2. Close and reopen the app

User lands directly on Home dashboard without seeing Sign In page

2.8

Sign out

1. Navigate to Account/User section
2. Tap Logout
3. Confirm if prompted

User is signed out and redirected to Sign In page; session is cleared

---

3. Onboarding

#

Use Case

Steps

Expected Result

3.1

First-time onboarding shown

Install a fresh build and launch the app for the first time

Onboarding carousel is shown before the login screen

3.2

Swipe through onboarding pages

Swipe left through all onboarding slides

Each slide advances; progress indicator updates

3.3

Skip onboarding

Tap the Skip button on any onboarding page

Onboarding is dismissed; user is taken to Sign In page

3.4

Complete onboarding

Advance through all slides to the last one and tap Continue/Get Started

User is taken to Sign In page

3.5

Onboarding not shown on second launch

Complete onboarding, close the app, reopen it

Onboarding is not shown again; app goes to Sign In or Home directly

---

4. Home Dashboard

#

Use Case

Steps

Expected Result

4.1

Dashboard loads with widgets

Log in and navigate to the Home tab

Home dashboard loads; visible widgets display their content without errors

4.2

Notifications widget

View the Notifications widget on Home

Widget shows the count of unread notifications

4.3

Assigned to Me widget

View the Assigned to Me widget

Widget lists work packages currently assigned to the logged-in user

4.4

Recently Edited widget

View the Recently Edited widget

Widget shows recently modified work packages

4.5

Favorite Projects widget

View the Favorite Projects widget

Widget shows the user's starred/favorited projects

4.6

Time Tracker widget

View the Time Tracker widget

Widget shows weekly tracked time summary

4.7

Tap a work package in a widget

Tap any work package listed in a Home widget

App navigates to the Work Package Details screen for that item

4.8

Tap a project in Favorite Projects

Tap a project in the Favorite Projects widget

App navigates to that project's overview

4.9

Pull to refresh

Pull down on the Home dashboard

Dashboard data refreshes; widgets reload their content

---

5. Projects / Workspaces

#

Use Case

Steps

Expected Result

5.1

Projects list loads

Navigate to the Workspaces/Projects tab

List of accessible projects is displayed

5.2

Search projects

Tap the search field and type a partial project name

List filters to show matching projects only

5.3

Filter by project type

Apply a project type filter

Only projects matching the selected type are shown

5.4

Toggle favorites view

Switch between "All Projects" and "Favorites" view

List updates to show only favorited projects or all projects accordingly

5.5

Open project overview

Tap on a project in the list

Project Overview page opens showing project details

5.6

Project overview tabs

Inside a project, switch between the available tabs (Details, Work Packages, Subprojects, etc.)

Each tab loads its content correctly

5.7

Navigate to work packages from project

Inside a project's Work Packages tab, tap a work package

Work Package Details screen opens for that item

5.8

Subprojects list

Open a project that has subprojects and view the Subprojects tab

Subprojects are listed under that parent project

---

6. Work Packages

6a. Work Package List

#

Use Case

Steps

Expected Result

6.1

Work packages list loads

Navigate to the Work Packages tab

List of work packages loads correctly

6.2

Filter work packages by status

Apply a status filter (e.g., "In Progress")

Only work packages with that status are shown

6.3

Filter by assignee

Apply an assignee filter

Only work packages assigned to that person are shown

6.4

Search work packages

Type a query in the search field

List filters to work packages matching the query

6.5

Pull to refresh

Pull down on the work packages list

List refreshes with latest data from the server

6.6

Tap a work package

Tap any item in the list

Work Package Details screen opens

6b. Work Package Details

#

Use Case

Steps

Expected Result

6.7

Details screen loads

Open any work package

Title, type, status, and description are displayed correctly

6.8

Switch to Activity tab

In Work Package Details, tap the Activity tab

Activity/comment history is displayed

6.9

Switch to Attachments tab

Tap the Attachments tab

Uploaded files are listed (or empty state shown)

6.10

Switch to Relations tab

Tap the Relations tab

Related work packages are listed

6.11

View a file attachment

Tap an attachment in the Attachments tab

File preview or download opens

6c. Create Work Package

#

Use Case

Steps

Expected Result

6.12

Open create form

Tap the "+" / Create button on the Work Packages screen

Create Work Package form opens

6.13

Create with required fields

1. Select a project
2. Select a type
3. Enter a subject/title
4. Tap Save

New work package is created; user is navigated to its details or back to the list

6.14

Validation on empty title

Leave the subject/title field empty and tap Save

Validation error is shown; work package is not created

6.15

Cancel creation

Open the create form and tap Cancel/Back

Form closes; no work package is created

6d. Edit Work Package

#

Use Case

Steps

Expected Result

6.16

Edit title

Open work package details, tap Edit, change the title, save

Updated title is reflected in the details view

6.17

Change status

In work package details or edit form, change the status field

Status updates and the change appears in the Activity tab

6.18

Change assignee

Edit the assignee field and save

New assignee is shown in the details

6.19

Edit description

Open the description editor, make a change, save

Updated description is rendered in the details view

6.20

Add a comment

In the Activity tab, type a comment and submit

Comment appears in the activity timeline

---

7. Time Tracking

7a. Time Tracking Overview

#

Use Case

Steps

Expected Result

7.1

Time tracking page loads

Navigate to the Time Tracking tab

Calendar view loads with existing time entries

7.2

Navigate calendar dates

Tap previous/next day or week in the calendar

View updates to show entries for the selected period

7.3

View daily time entries

Tap a specific date in the calendar

Time entries for that day are displayed below

7.4

Weekly hours summary

View the time tracking page for a week

Total hours logged for the week are shown

7b. Focus Timer

#

Use Case

Steps

Expected Result

7.5

Open focus timer

Navigate to the Timer tab within Time Tracking

Focus timer page shows with a circular timer at 00:00

7.6

Start timer

Tap the Start button

Timer begins counting up; Start changes to Pause

7.7

Pause and resume timer

Tap Pause, then tap Resume

Timer pauses at the current time; resuming continues from that point

7.8

Stop timer

Tap Stop

Timer stops; Create Log Time form opens to finalize the entry

7.9

Link work package to timer

Before or during timing, select a work package to link

Timer shows the linked work package name

7c. Log Time Entry

#

Use Case

Steps

Expected Result

7.10

Create log time entry

1. Open Create Log Time form
2. Select work package
3. Enter hours
4. Select activity type
5. Tap Save

Time entry is saved and appears in the time tracking calendar

7.11

Validation on empty hours

Submit log time form without entering hours

Validation error is shown; entry is not saved

7.12

Date selection

Change the date field to a past date and save

Time entry is saved for the selected date

---

#

Use Case

Steps

Expected Result

8.1

Open global search

Tap the Search icon in the navigation

Global Search screen opens with Work Packages and Projects tabs

8.2

Search for a work package

Type a work package title in the search field (Work Packages tab)

Matching work packages appear in the results list

8.3

Search for a project

Switch to the Projects tab and type a project name

Matching projects appear in results

8.4

Filter search results

Apply a filter (status, type, etc.) within Work Packages search

Results are narrowed to match the applied filter

8.5

Navigate to result

Tap a work package in search results

Work Package Details screen opens for that item

8.6

Navigate to project result

Tap a project in search results

Project Overview page opens

8.7

Empty state

Search for a string with no matches

Empty state message is shown; no crash

8.8

Clear search query

Clear the search input field

Results reset; prior state or empty prompt is shown

---

9. Notifications

#

Use Case

Steps

Expected Result

9.1

Notifications list loads

Navigate to the Notifications tab

List of notifications is displayed

9.2

Notification count badge

Check the Notifications tab icon when there are unread notifications

Badge shows correct unread count

9.3

View notification details

Tap a notification in the list

Associated work package details are shown inline or the user is navigated to it

9.4

Notification reason

Tap or long-press a notification to see the reason

Bottom sheet or tooltip explains why the user was notified (e.g., "Assigned to you")

9.5

Mark as read

Mark a notification as read (if the action is available)

Notification is marked read; unread count decreases

9.6

Empty state

View Notifications when there are none

Empty state message is displayed; no crash

9.7

Pull to refresh

Pull down on the notifications list

List refreshes with latest notifications

---

10. User Profile & Settings

10a. User Profile

#

Use Case

Steps

Expected Result

10.1

Open user profile

Navigate to Account/User tab

User profile page shows name, email, and avatar

10.2

View account details

Tap on Account Details

Account info page opens with the user's profile data

10.3

View another user's profile

Tap a user's avatar or name (e.g., in work package details)

That user's profile view opens with their basic info

10b. Notification Settings

#

Use Case

Steps

Expected Result

10.4

Open notification settings

Go to Settings → User Notifications

Notification preferences screen opens

10.5

Toggle a notification preference

Toggle an email notification setting on or off

Setting is saved; toggle reflects the new state after navigating away and back

10d. Work Package Settings

#

Use Case

Steps

Expected Result

10.6

Open work package settings

Go to Settings → Work Package Settings

Settings page opens

10.7

Change activity sort order

Switch activity order between newest/oldest first

Setting is saved; activity in work packages reflects the chosen order

---

11. Rich Text Editor

#

Use Case

Steps

Expected Result

11.1

Open editor

Edit the description of a work package or add a comment

Rich text editor opens

11.2

Bold text

Select text and tap the Bold button

Selected text becomes bold

11.3

Italic text

Select text and tap the Italic button

Selected text becomes italic

11.4

Bullet list

Tap the unordered list button and type items

Bullet list is created

11.5

Numbered list

Tap the ordered list button and type items

Numbered list is created

11.6

Add a hyperlink

Tap the link button, enter a URL and display text

Link is inserted and rendered as clickable text

11.7

Heading formatting

Select a heading level and type

Text is rendered as a heading

11.8

Mention a user

Type @ followed by a username

Autocomplete suggestion appears; selecting it inserts a user mention

11.9

Mention a work package

Type # followed by a work package ID or title

Autocomplete suggestion appears; selecting it inserts a work package link

11.10

Save edited content

Make changes and tap Save/Done

Changes are persisted and rendered correctly in the details view

11.11

Discard changes

Make changes and tap Cancel/Back without saving

Changes are discarded; original content is unchanged

---

12. Share to App (External File Sharing)

#

Use Case

Steps

Expected Result

12.1

Share a file from another app

From the device Files app (or another app), share a file and select OpenProject

OpenProject opens the Share page with the file ready to attach

12.2

Select a project for attachment

On the Share page, select a target project

Project is selected and work packages for that project are available

12.3

Select a work package

Select a work package to attach the file to

Work package is confirmed as the attachment target

12.4

Confirm attachment upload

Tap Attach/Confirm

File is uploaded to the selected work package; success state is shown

12.5

Cancel sharing

Open the Share page and tap Cancel/Back

App closes the share intent; no file is uploaded

---

13. Navigation & General

#

Use Case

Steps

Expected Result

13.1

Bottom navigation tabs

Tap each icon in the bottom navigation bar

Each tab navigates to the correct screen

13.2

Back navigation

Navigate into a deep screen and tap the back button/gesture

App navigates back through the screen stack correctly

13.3

Deep link to work package

Open a valid deep link to a work package (e.g., from a email)

App opens and navigates directly to the correct work package

13.4

App runs without crashes (baseline)

Use the app normally for 5 minutes across multiple screens

No unexpected crashes or ANR (unresponsive) events occur


Essential Smoke Tests


Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.  
**Full test suite:** See Comprehensive list

---

1. Installation & Update

#

Use Case

Steps

Expected Result

1.1

Fresh install

Uninstall the app, install the new build, launch it

App opens without errors; onboarding or login screen is shown

1.2

Update over existing install

Install the previous release, log in, then install the new build on top
(this operation can be non-trivial for Android, so for a quick smoke test on Android we can rely on previous experience and omit this step)

App launches; user is still logged in, no crash

---

2. Login & Authentication

#

Use Case

Steps

Expected Result

2.1

Sign in with valid credentials

Enter a valid instance URL, email, and password; tap Sign In

User reaches the Home dashboard

2.2

Sign in with wrong credentials

Enter a valid URL with a wrong password; tap Sign In

Error message is shown; user stays on Sign In page

2.3

Session persists after restart

Log in, close the app fully, reopen it

User lands on Home dashboard without re-login

2.4

Sign out

Navigate to Account, tap Log Out

User is returned to the Sign In screen

---

3. Home Dashboard

#

Use Case

Steps

Expected Result

3.1

Dashboard loads

Log in and open the Home tab

Widgets load without errors or blank screens

3.2

Navigate from widget

Tap a work package in any Home widget

Work Package Details screen opens

---

4. Projects / Workspaces

#

Use Case

Steps

Expected Result

4.1

Projects list loads

Open the Workspaces tab

List of projects is displayed

4.2

Open a project

Tap any project in the list

Project overview opens with at least one tab loading correctly

---

5. Work Packages

#

Use Case

Steps

Expected Result

5.1

Work package list loads

Open the Work Packages tab

List of work packages is displayed

5.2

Open work package details

Tap any work package

Details screen shows title, status, and description

5.3

Create a work package

Tap "+", fill in title, type, and project; save

Work package is created and visible in the list

5.4

Edit a field

Open a work package, change the status, save

Updated status is shown in the details view

5.5

Add a comment

Open a work package, go to Activity tab, post a comment

Comment appears in the activity timeline

---

6. Time Tracking

#

Use Case

Steps

Expected Result

6.1

Time tracking page loads

Open the Time Tracking tab

Calendar and time entries load

6.2

Start and stop timer

Open the Timer tab, tap Start, wait a few seconds, tap Stop

Log Time form opens pre-filled with elapsed time

6.3

Save a time entry

Fill in the Log Time form and confirm

Entry is saved and appears in the calendar view

---

#

Use Case

Steps

Expected Result

7.1

Search returns results

Open Search, type a known work package title

Matching results appear in the list

7.2

Navigate to result

Tap a result

Correct work package detail screen opens

---

8. Notifications

#

Use Case

Steps

Expected Result

8.1

Notifications list loads

Open the Notifications tab

Notification list is displayed (or empty state shown)

8.2

Tap a notification

Tap any notification

Associated work package detail opens

---

9. User Profile & Settings

#

Use Case

Steps

Expected Result

9.1

Profile loads

Open the Account tab

User name, email, and avatar are displayed

9.2

Settings are accessible

Open Account → Work Package Settings

Settings page opens without error

---

10. Navigation & Stability

#

Use Case

Steps

Expected Result

10.1

Bottom nav tabs all work

Tap each icon in the bottom navigation bar

Each tab opens its correct screen

10.2

Back navigation

Go several screens deep, press back

App navigates back correctly without crash

10.3

Offline error handling

Disable network, try to load any screen

Error or offline message shown; app does not crash

10.4

No crash during basic usage

Use the app across all main sections for ~10 minutes

No crashes or unresponsive states occur


OpenProject Mobile App - Testing

This folder contains all data, files, thoughts, approaches of testing the Mobile App. The info here is not final and will be improved.

Pages:

1. Quick Smoke Test

A short checklist of most required cases covering the critical path of every major feature. Use this as the minimum bar before any release. It is designed to be completed in affordable amount of time on both platforms.

Run this when:

2. Full Smoke Tests

A comprehensive manual test suite with more that 100 cases covering most features in depth, including some edge cases, empty states, error handling, and platform-specific scenarios. Use this for thorough regression testing.

Run this when:

3. Automated Tests  (WIP  🚧)

Documents the automated test coverage, how to run the test suite locally and in CI, and how to interpret results. This document is in progress 🚧