Compare commits
60 commits
antifascis
...
ce1527f259
Author | SHA1 | Date | |
---|---|---|---|
|
ce1527f259 | ||
|
71f35b069e | ||
|
3ddb52c9b9 | ||
|
2346eaa005 | ||
|
d17e3c5b55 | ||
|
8762f96810 | ||
|
6281816d4d | ||
|
372bbb0751 | ||
|
fa8588855c | ||
|
905bdd512b | ||
|
fd99f097d5 | ||
|
880b2fd131 | ||
|
c4ccbc46ff | ||
|
d638f02a12 | ||
|
497b6aaeff | ||
|
4e05f0c121 | ||
|
f18c0c9571 | ||
|
d288b48b0a | ||
|
94011846d6 | ||
|
09fc94cf72 | ||
|
c34452f65e | ||
|
2b77711150 | ||
|
57945692cc | ||
|
dfb2abe380 | ||
|
07c6bdacfb | ||
|
ff03e664db | ||
|
c72006216e | ||
|
6efafd37ae | ||
|
35f45f690f | ||
|
23c8db7e58 | ||
|
8382a71813 | ||
|
9bb1cf6d00 | ||
|
2bba743dc3 | ||
|
d7b0c639c4 | ||
|
13668dfc8b | ||
|
1e70665d1a | ||
|
4b0d4f798f | ||
|
9ad7c43cd5 | ||
|
ab9fa3d23d | ||
|
5222f4ba6d | ||
|
9689d3d97e | ||
|
6a10308f29 | ||
|
ab3cede8ef | ||
|
fa3cb1925d | ||
|
a7def1d62d | ||
|
a3df6b8581 | ||
|
dd201db791 | ||
|
60c0b08d21 | ||
|
95571b70c9 | ||
|
678161be2e | ||
|
008053f730 | ||
|
ed1782fafc | ||
|
72f39d0d9d | ||
|
7a156c5d48 | ||
|
f31aeec8db | ||
|
f67cf3ab1e | ||
|
b125b3603e | ||
|
b1e8b3afae | ||
|
573c975bad | ||
|
25155eb6a3 |
56 changed files with 1545 additions and 990 deletions
|
@ -1,9 +1,8 @@
|
||||||
## What does this MR do?
|
## What does this MR do?
|
||||||
|
|
||||||
<!--Insert the link to a GitHub issue in (), or describe the changes if there is no issue -->
|
<!-- Is there a lot to say? Consider creating an issue. -->
|
||||||
[Issue Link]()
|
|
||||||
|
|
||||||
## Screenshots <!-- Optional, very helpful for the reviewer colleagues from other teams -->
|
## Screenshots <!-- Optional -->
|
||||||
|
|
||||||
### Before
|
### Before
|
||||||
|
|
||||||
|
@ -13,7 +12,7 @@
|
||||||
|
|
||||||
![alt text](https://example.com/after.png)
|
![alt text](https://example.com/after.png)
|
||||||
|
|
||||||
## Code Changes
|
## Notes
|
||||||
|
|
||||||
* This MR
|
* This MR
|
||||||
**does** <!-- KEEP ONLY ONE -->
|
**does** <!-- KEEP ONLY ONE -->
|
||||||
|
@ -59,36 +58,9 @@ How do your performance changes scale on a system of this size?
|
||||||
they are really big customers, and we want to keep their business!)
|
they are really big customers, and we want to keep their business!)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
### Documentation Follow-up Required?
|
### Follow-up Required <!-- Optional -->
|
||||||
|
|
||||||
<!-- Keep one of the two sections -->
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
If this MR does change:
|
Does your MR require coordination with the documentation/support teams?
|
||||||
- How the user experiences or uses the application
|
If so, apply the label and explain here.
|
||||||
- Visual appearance
|
|
||||||
- Screen flow
|
|
||||||
- Texts
|
|
||||||
- How the application is deployed an maintained
|
|
||||||
- Deployment process
|
|
||||||
- System requirements
|
|
||||||
- Command line interfaces
|
|
||||||
-->
|
|
||||||
This MR may require follow-up by the documentation team.
|
|
||||||
/label ~Documentation
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Otherwise
|
|
||||||
-->
|
-->
|
||||||
This MR does not require any follow-up.
|
|
||||||
|
|
||||||
## QA Checklist (to be filled by the reviewer)
|
|
||||||
|
|
||||||
- [ ] Implementation satisfies specification
|
|
||||||
- [ ] Changes confirmed by manual testing
|
|
||||||
- [ ] [Code style](https://git.znuny.com/zammad/zammad/-/wikis/Coding-style-guide) is appropriate
|
|
||||||
- [ ] Performance will not degrade
|
|
||||||
- [ ] Code is properly covered with tests
|
|
||||||
- If follow-up by the documentation team is needed:
|
|
||||||
- [ ] Add a comment with this text
|
|
||||||
> @<!-- don't treat this as a mention until copied -->MrGeneration please check if this MR requires changes to the documentation. Thanks!
|
|
||||||
|
|
|
@ -6,8 +6,6 @@ require:
|
||||||
- rubocop-performance
|
- rubocop-performance
|
||||||
- rubocop-rails
|
- rubocop-rails
|
||||||
- rubocop-rspec
|
- rubocop-rspec
|
||||||
- rubocop-inflector
|
|
||||||
- ../config/initializers/inflections.rb
|
|
||||||
- ./rubocop_zammad.rb
|
- ./rubocop_zammad.rb
|
||||||
|
|
||||||
inherit_from:
|
inherit_from:
|
||||||
|
|
|
@ -887,6 +887,10 @@ Metrics/PerceivedComplexity:
|
||||||
- 'test/browser_test_helper.rb'
|
- 'test/browser_test_helper.rb'
|
||||||
- 'test/integration/slack_test.rb'
|
- 'test/integration/slack_test.rb'
|
||||||
|
|
||||||
|
Rails/AssertNot:
|
||||||
|
Exclude:
|
||||||
|
- 'test/browser/admin_permissions_granular_vs_full_test.rb'
|
||||||
|
|
||||||
Rails/CreateTableWithTimestamps:
|
Rails/CreateTableWithTimestamps:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'db/migrate/20120101000001_create_base.rb'
|
- 'db/migrate/20120101000001_create_base.rb'
|
||||||
|
|
195
CHANGELOG.md
195
CHANGELOG.md
|
@ -1,15 +1,196 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## [5.1.0](https://github.com/zammad/zammad/tree/5.1.0) (2021-xx-xx)
|
## [5.0.1](https://github.com/zammad/zammad/tree/5.0.1) (2021-10-08)
|
||||||
[Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.1.0)
|
[Full Changelog](https://github.com/zammad/zammad/compare/5.0.0...5.0.1)
|
||||||
|
|
||||||
**Implemented enhancements:**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Fixed bugs:**
|
**Fixed bugs:**
|
||||||
|
- Bug Report 4.1.x Overview Sort - Grouped by user [3737](https://github.com/zammad/zammad/issues/3737) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Article box opening on tickets with no changes [3789](https://github.com/zammad/zammad/issues/3789) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- UploadCacheCleanupJob does not execute [3787](https://github.com/zammad/zammad/issues/3787) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- lib/fill_db.rb fails to work in production environments [3788](https://github.com/zammad/zammad/issues/3788) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
|
||||||
|
|
||||||
|
## [5.0.0](https://github.com/zammad/zammad/tree/5.0.0) (2021-10-05)
|
||||||
|
[Full Changelog](https://github.com/zammad/zammad/compare/4.1.0...5.0.0)
|
||||||
|
|
||||||
|
**Implemented enhancements:**
|
||||||
|
- Core Workflow: Add organization condition attributes for object User [3779](https://github.com/zammad/zammad/issues/3779) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- No script content (e. g. javascript) in emails [3365](https://github.com/zammad/zammad/issues/3365) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
|
||||||
|
- Read-only custom objects [2102](https://github.com/zammad/zammad/issues/2102) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Granular admin permission for google channel is missing [3194](https://github.com/zammad/zammad/issues/3194) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- Use country codes (e.g. `DE` or `ES`) for knowledgebase answer selection [3574](https://github.com/zammad/zammad/issues/3574) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- New email account expert view cannot be opened without filling in all fields [3137](https://github.com/zammad/zammad/issues/3137) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- Don't provide option to create API-Token if authentication via API token is disabled [3168](https://github.com/zammad/zammad/issues/3168) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- Define default "stay on tab" / "close tab" behavior [257](https://github.com/zammad/zammad/issues/257) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Space after ticket hook in ticket/zoom [3265](https://github.com/zammad/zammad/issues/3265) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- Enhance LDAP login to not affect "failed logins" [2389](https://github.com/zammad/zammad/issues/2389) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[LDAP](https://github.com/zammad/zammad/labels/LDAP)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Detect Jira follow-ups [3695](https://github.com/zammad/zammad/issues/3695) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
|
||||||
|
- csv import example file download (organizations) is empty [3514](https://github.com/zammad/zammad/issues/3514) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- Add bulk option to extended search [445](https://github.com/zammad/zammad/issues/445) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- MessageBird integration [3672](https://github.com/zammad/zammad/issues/3672) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Add attachment via Trigger and scheduler if wanted by admin [2485](https://github.com/zammad/zammad/issues/2485) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[admin area](https://github.com/zammad/zammad/labels/admin area)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Tag KB Answers [2612](https://github.com/zammad/zammad/issues/2612) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- Backtrace lines pollute log [3556](https://github.com/zammad/zammad/issues/3556) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[authentication](https://github.com/zammad/zammad/labels/authentication)]
|
||||||
|
- Visualise locked users in UI and make them unlock-able for admin [2565](https://github.com/zammad/zammad/issues/2565) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Representation of inactive customers and orgnizations [3302](https://github.com/zammad/zammad/issues/3302) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- No possibility to enforce auto response if one of the blocking auto response mail header exists [3667](https://github.com/zammad/zammad/issues/3667) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
|
||||||
|
- REST doc of Online Notification controler is outdated/wrong and expand param is missing. [3635](https://github.com/zammad/zammad/issues/3635) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- Scroll background instead of foreground [978](https://github.com/zammad/zammad/issues/978) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
|
||||||
|
- Log if a active user (in UI) has been logged out due to SessionTimeout [3614](https://github.com/zammad/zammad/issues/3614) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- The rake task `zammad:package:migrate` does not execute migrations for linked packages. [3606](https://github.com/zammad/zammad/issues/3606) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[developer experience](https://github.com/zammad/zammad/labels/developer experience)]
|
||||||
|
- Accept 2xx as response for requests in UserAgent [3573](https://github.com/zammad/zammad/pull/3573) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- Don't fail job is `deletable_id` is no longer available [3536](https://github.com/zammad/zammad/issues/3536) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
|
||||||
|
- Add console output for searchindex rebuild status [3562](https://github.com/zammad/zammad/issues/3562) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)]
|
||||||
|
- Display minutes for session timeouts instead of seconds [3575](https://github.com/zammad/zammad/issues/3575) [[enhancement](https://github.com/zammad/zammad/labels/enhancement)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[admin area](https://github.com/zammad/zammad/labels/admin area)]
|
||||||
|
|
||||||
|
**Fixed bugs:**
|
||||||
|
- Inconstant alignment in the listing of attachments/submit button in new article area [3773](https://github.com/zammad/zammad/issues/3773) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Improve contrasts in answer search for articles [3783](https://github.com/zammad/zammad/issues/3783) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- escaped 'Set fixed' workflows don't refresh set values on active ticket sessions [3757](https://github.com/zammad/zammad/issues/3757) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- ObjectManager Attribute without screen attribute causes CoreWorkflows migration to fail [3781](https://github.com/zammad/zammad/issues/3781) [[bug](https://github.com/zammad/zammad/labels/bug)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
|
||||||
|
- Zammad preflight check warning output causes Syntax-Error in postinstall.sh and failing installation [2674](https://github.com/zammad/zammad/issues/2674) [[bug](https://github.com/zammad/zammad/labels/bug)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
|
||||||
|
- Shared organization issue (Create your first ticket) [2780](https://github.com/zammad/zammad/issues/2780) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- Force users to reload after system migration [3776](https://github.com/zammad/zammad/issues/3776) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Unable to cancel attachment upload [2351](https://github.com/zammad/zammad/issues/2351) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- [BUG] miss spell in db/migrate/20210923172256_issue_2619_kb_header_link_color.rb [3777](https://github.com/zammad/zammad/issues/3777) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
|
||||||
|
- KB header and footer link-color not changeable [2619](https://github.com/zammad/zammad/issues/2619) [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)] [[specification required](https://github.com/zammad/zammad/labels/specification required)] [[theming / skinning](https://github.com/zammad/zammad/labels/theming / skinning)]
|
||||||
|
- Syntax errors break scheduler job for good [3028](https://github.com/zammad/zammad/issues/3028) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Existing tickets: New article modal with padding-left: 0; padding-right: 0; [3772](https://github.com/zammad/zammad/issues/3772) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Possible race condition causing OTRS import to fail [3765](https://github.com/zammad/zammad/issues/3765) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Incorrect alignment in the listing of attachments when creating a ticket [3746](https://github.com/zammad/zammad/issues/3746) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Saved conditions break on selections without reloading [3758](https://github.com/zammad/zammad/issues/3758) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Misleading view of user icons which are on vacation and disabled [3075](https://github.com/zammad/zammad/issues/3075) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- User with user_id 1 is show in admin interface (which should not) [3755](https://github.com/zammad/zammad/issues/3755) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)]
|
||||||
|
- Unable to close tickets in certran cases if core workflow is used [3710](https://github.com/zammad/zammad/issues/3710) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Login failed after upgrade to zammad 5.0 [3759](https://github.com/zammad/zammad/issues/3759) [[bug](https://github.com/zammad/zammad/labels/bug)] [[blocker](https://github.com/zammad/zammad/labels/blocker)] [[migration / update](https://github.com/zammad/zammad/labels/migration / update)]
|
||||||
|
- Unable to create a ticket in web app if default for additional boolean value is FALSE [3762](https://github.com/zammad/zammad/issues/3762) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- User search / selection does not always work if you want to correct your search [3696](https://github.com/zammad/zammad/issues/3696) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Unable to create new organization [3751](https://github.com/zammad/zammad/issues/3751) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Core Workflow "is not" operator is working unexpected [3752](https://github.com/zammad/zammad/issues/3752) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- scrollPageHeader disappears when answering via email [3736](https://github.com/zammad/zammad/issues/3736) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- Scheduler ignores "disable notifications == no" [3684](https://github.com/zammad/zammad/issues/3684) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Notes on existing ticks are discarded by editing profile settings [3088](https://github.com/zammad/zammad/issues/3088) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- Owner selection empty or pending reminder data picker not shown if customer field has content but no customer is selected (in ticket create screen) [3743](https://github.com/zammad/zammad/issues/3743) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Removal of Microsoft365-Channel not possible via UI when having no email address relation [3741](https://github.com/zammad/zammad/issues/3741) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)]
|
||||||
|
- Removal of Google-Channel not possible via UI when having a normal email channel of same account [3203](https://github.com/zammad/zammad/issues/3203) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[channel](https://github.com/zammad/zammad/labels/channel)]
|
||||||
|
- Core-Workflow: Option manipulation of boolean attributes not possible [3740](https://github.com/zammad/zammad/issues/3740) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Core Workflow: Show hidden attributes on group selection (ticket edit) [3739](https://github.com/zammad/zammad/issues/3739) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- OTRS migration doesn't import article creation time [3235](https://github.com/zammad/zammad/issues/3235) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Spaces stay URL-encoded when going back to search results on KB for agents [3378](https://github.com/zammad/zammad/issues/3378) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- Not working unpack of mail body if decrypted body is in signed-data attachment [3705](https://github.com/zammad/zammad/issues/3705) [[bug](https://github.com/zammad/zammad/labels/bug)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
|
||||||
|
- It should be possible to show attributes which are configured `shown` false [3726](https://github.com/zammad/zammad/issues/3726) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- admin.core_workflow permission is missing [3732](https://github.com/zammad/zammad/issues/3732) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- AttributeManager doesn't display boolean default values within the UI [3271](https://github.com/zammad/zammad/issues/3271) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)]
|
||||||
|
- Spaces in front of mentions can cause partly content removal [3717](https://github.com/zammad/zammad/issues/3717) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Drop files here not disappearing after dropping a file [3725](https://github.com/zammad/zammad/issues/3725) [[bug](https://github.com/zammad/zammad/labels/bug)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- ⚙ -> Manage -> Calendars -> Edit: "Subscribe to public holidays in" sorted wrong [2528](https://github.com/zammad/zammad/issues/2528) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- Pending reminder notifications are not sent if ticket is opened in tab [2931](https://github.com/zammad/zammad/issues/2931) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
|
||||||
|
- Fields are falsey displayed as mandatory if they contain historic screen values [3721](https://github.com/zammad/zammad/issues/3721) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- `ticket.customer_id` is `current_user` breaks email fetching [3503](https://github.com/zammad/zammad/issues/3503) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- Scheduler jobs don't ensure current ticket information if they're running a long time [3329](https://github.com/zammad/zammad/issues/3329) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- groups selection for customer panel is not working anymore (with core workflows) [3713](https://github.com/zammad/zammad/issues/3713) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Scheduler Time offset [457](https://github.com/zammad/zammad/issues/457) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- "Warten auf Erinnerung" - Inconsistent timestamps [2366](https://github.com/zammad/zammad/issues/2366) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Ical escaltion update the calendar entry to 2:00 am [2157](https://github.com/zammad/zammad/issues/2157) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Inheritance of out of office settings [3694](https://github.com/zammad/zammad/issues/3694) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Core worflow perform action "select" should not make multiple values selectable [3712](https://github.com/zammad/zammad/issues/3712) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Setting for CheckMK not saved in zammad [3707](https://github.com/zammad/zammad/issues/3707) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Any user can be set as a replacement for out of office [2293](https://github.com/zammad/zammad/issues/2293) [[bug](https://github.com/zammad/zammad/labels/bug)] [[personal settings/menu](https://github.com/zammad/zammad/labels/personal settings/menu)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Core Workflow Implementation [3709](https://github.com/zammad/zammad/issues/3709) [[feature backlog](https://github.com/zammad/zammad/labels/feature backlog)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[core](https://github.com/zammad/zammad/labels/core)] [[core workflows](https://github.com/zammad/zammad/labels/core workflows)]
|
||||||
|
- Can't remove auto assignment timeout [2544](https://github.com/zammad/zammad/issues/2544) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Assign Follow ups has no affect [2455](https://github.com/zammad/zammad/issues/2455) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- The calendar shows Chilean holidays one day in advance [3706](https://github.com/zammad/zammad/issues/3706) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Organization removal does not clear organization_id from Tickets [3703](https://github.com/zammad/zammad/issues/3703) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Merge not possible with not set, required attributes [2634](https://github.com/zammad/zammad/issues/2634) [[bug](https://github.com/zammad/zammad/labels/bug)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)]
|
||||||
|
- Merging tickets doesn’t trigger notification for target ticket [3105](https://github.com/zammad/zammad/issues/3105) [[bug](https://github.com/zammad/zammad/labels/bug)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[ticket](https://github.com/zammad/zammad/labels/ticket)]
|
||||||
|
- One of DB migrations timestamp breaks migrations queue [3702](https://github.com/zammad/zammad/issues/3702) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Tags in ticket create screen displayed wrong [3701](https://github.com/zammad/zammad/issues/3701) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[regression](https://github.com/zammad/zammad/labels/regression)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- Custom date attributes provide inconsistent sorting within grouping [3663](https://github.com/zammad/zammad/issues/3663) [[bug](https://github.com/zammad/zammad/labels/bug)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Mix of binary encoded ISO-8859-1 data in header fields (e.g. to) fails mail processing [3697](https://github.com/zammad/zammad/issues/3697) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
|
||||||
|
- Zammad sends mails even though there is no email address visible in TO or CC fields (any more) [3554](https://github.com/zammad/zammad/issues/3554) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- Error 500 / zammad {"error":" 123456 is out of range for ActiveModel::Type::Integer with limit 4 bytes"} [3647](https://github.com/zammad/zammad/issues/3647) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Default value not set for attributes of type input, select, tree_select, richtext, textarea, checkbox [1653](https://github.com/zammad/zammad/issues/1653) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[object manager attribute](https://github.com/zammad/zammad/labels/object manager attribute)]
|
||||||
|
- When replying, quote article content only [3539](https://github.com/zammad/zammad/issues/3539) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Trigger ignores changes on some Ticket attributes [3428](https://github.com/zammad/zammad/issues/3428) [[bug](https://github.com/zammad/zammad/labels/bug)] [[trigger](https://github.com/zammad/zammad/labels/trigger)]
|
||||||
|
- KB search does not allow pagination on endpoint [3068](https://github.com/zammad/zammad/issues/3068) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)] [[search](https://github.com/zammad/zammad/labels/search)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- “You have not created a ticket yet” shown but I already have closed tickets [3053](https://github.com/zammad/zammad/issues/3053) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[🚧 refactoring 2.0 🚧](https://github.com/zammad/zammad/labels/🚧 refactoring 2.0 🚧)]
|
||||||
|
- Support HTML5 'required' attribute in forms [1890](https://github.com/zammad/zammad/pull/1890)
|
||||||
|
- Freshdesk import works not with more then 30_000 tickets [3681](https://github.com/zammad/zammad/issues/3681) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Pagination for knowledge base answer sorting breaks sorting [3660](https://github.com/zammad/zammad/issues/3660) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[admin area](https://github.com/zammad/zammad/labels/admin area)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- Zendesk-Import `Connection reset by peer` cancels import [3583](https://github.com/zammad/zammad/issues/3583) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)] [[waiting for feedback](https://github.com/zammad/zammad/labels/waiting for feedback)]
|
||||||
|
- Prefer HTTP standard header "From" over custom "X-On-Behalf-Of" for impersonation [3113](https://github.com/zammad/zammad/issues/3113) [[API](https://github.com/zammad/zammad/labels/API)] [[help appreciated](https://github.com/zammad/zammad/labels/help appreciated)] [[authentication](https://github.com/zammad/zammad/labels/authentication)] [[hacktoberfest](https://github.com/zammad/zammad/labels/hacktoberfest)] [[:construction: refactoring :construction:](https://github.com/zammad/zammad/labels/:construction: refactoring :construction:)] [[specification required](https://github.com/zammad/zammad/labels/specification required)] [[good first issue](https://github.com/zammad/zammad/labels/good first issue)] [[deprecation](https://github.com/zammad/zammad/labels/deprecation)]
|
||||||
|
- Do not send `domain` and migrate `domain` out of Google and Microsoft 365 channels [3669](https://github.com/zammad/zammad/issues/3669) [[bug](https://github.com/zammad/zammad/labels/bug)] [[channel](https://github.com/zammad/zammad/labels/channel)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- high organization user count relates to bad performance [3648](https://github.com/zammad/zammad/issues/3648) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[performance](https://github.com/zammad/zammad/labels/performance)]
|
||||||
|
- Removing organizations removes user and ticket as well [3688](https://github.com/zammad/zammad/issues/3688) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Wrong user is used when "X-On-Behalf-Of” header value is an email that starts with digits [2851](https://github.com/zammad/zammad/issues/2851) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)]
|
||||||
|
- Allow out of office for one day without setting two days [3590](https://github.com/zammad/zammad/issues/3590) [[bug](https://github.com/zammad/zammad/labels/bug)] [[personal settings/menu](https://github.com/zammad/zammad/labels/personal settings/menu)]
|
||||||
|
- FreshDesk Import doesn't pull in auto-assign domain(s) for organizations [3687](https://github.com/zammad/zammad/issues/3687) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- FreshDesk Import brings in all users as inactive [3689](https://github.com/zammad/zammad/issues/3689) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- KB Public UI icons are misspaced [3680](https://github.com/zammad/zammad/issues/3680) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- FreshDesk Import Error - undefined method `body' for 10:Integer [3661](https://github.com/zammad/zammad/issues/3661) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Cannot select multiple tickets in ticket overview with shift+click in Firefox [3449](https://github.com/zammad/zammad/issues/3449) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[overviews](https://github.com/zammad/zammad/labels/overviews)]
|
||||||
|
- "Drop files here" drag area not always hiding [3460](https://github.com/zammad/zammad/issues/3460) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[help appreciated](https://github.com/zammad/zammad/labels/help appreciated)]
|
||||||
|
- CTI Callerlog signaling hides "+" for new ticket if more than one user is found [2930](https://github.com/zammad/zammad/issues/2930) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
|
||||||
|
- Zendesk URL check fails with Net::HTTPForbidden 403 error [3679](https://github.com/zammad/zammad/issues/3679) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Mac Mail inline PDF destroys E-Mail-Body [2407](https://github.com/zammad/zammad/issues/2407) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[mail processing](https://github.com/zammad/zammad/labels/mail processing)]
|
||||||
|
- Outdated urls on security page (third-party logins) [3627](https://github.com/zammad/zammad/issues/3627) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Duplicated article after bulk action was executed for newly created tickets without a browser refresh in between [3568](https://github.com/zammad/zammad/issues/3568) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Text Editor deletes text unrecoverably if quicktext was canceled with Ctrl+Backspace [2886](https://github.com/zammad/zammad/issues/2886) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
|
||||||
|
- The defined ignored attributes in the popover context are not working [3668](https://github.com/zammad/zammad/issues/3668) [[bug](https://github.com/zammad/zammad/labels/bug)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
|
||||||
|
- Ensure Upload Cache files are removed after grace period [3579](https://github.com/zammad/zammad/issues/3579) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Package installation fails because of too long file names [3666](https://github.com/zammad/zammad/issues/3666) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Package migrations fail on package installation or update due to codebase self-modification [3580](https://github.com/zammad/zammad/issues/3580) [[bug](https://github.com/zammad/zammad/labels/bug)] [[core](https://github.com/zammad/zammad/labels/core)]
|
||||||
|
- saving Boolean field with empty values [2973](https://github.com/zammad/zammad/issues/2973) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- CTI-API should handle doubled requests better [3247](https://github.com/zammad/zammad/issues/3247) [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[CTI](https://github.com/zammad/zammad/labels/CTI)] [[specification required](https://github.com/zammad/zammad/labels/specification required)]
|
||||||
|
- In some situations the chat button is visible without a active websocket connection [2258](https://github.com/zammad/zammad/issues/2258) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)]
|
||||||
|
- Fixes mistypes in article_view.coffee [3658](https://github.com/zammad/zammad/pull/3658)
|
||||||
|
- Creating and editing users via office 365 failes with Image source is invalid [3617](https://github.com/zammad/zammad/issues/3617) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- FreshDesk Import fails with timeout error [3653](https://github.com/zammad/zammad/issues/3653) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Chat widget cannot load CSS on (sub)domains that contain "ws" characters [3654](https://github.com/zammad/zammad/issues/3654) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)]
|
||||||
|
- timezone issue with elasticsearch [2085](https://github.com/zammad/zammad/issues/2085) [[duplicate](https://github.com/zammad/zammad/labels/duplicate)]
|
||||||
|
- Invalid html signature detection for exchange warning boxes [3571](https://github.com/zammad/zammad/issues/3571) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Searching for integer fields does not work as expected [3599](https://github.com/zammad/zammad/issues/3599) [[bug](https://github.com/zammad/zammad/labels/bug)] [[search](https://github.com/zammad/zammad/labels/search)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- FreshDesk import fails on certain custom field types [3628](https://github.com/zammad/zammad/issues/3628) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Freshdesk import subdomain selection fails [3631](https://github.com/zammad/zammad/issues/3631) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Search results missing for users with two names within lastname [3598](https://github.com/zammad/zammad/issues/3598) [[bug](https://github.com/zammad/zammad/labels/bug)] [[search](https://github.com/zammad/zammad/labels/search)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- New location notification with X-On-Behalf [3611](https://github.com/zammad/zammad/issues/3611) [[bug](https://github.com/zammad/zammad/labels/bug)] [[API](https://github.com/zammad/zammad/labels/API)] [[notification](https://github.com/zammad/zammad/labels/notification)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- State list of tickets ignore locale for their sorting [3335](https://github.com/zammad/zammad/issues/3335) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Newly created users are only shown in the admin interface after reload [3050](https://github.com/zammad/zammad/issues/3050) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[frontend / JS app](https://github.com/zammad/zammad/labels/frontend / JS app)]
|
||||||
|
- Migration 3.6.1 to 4.1 : No configured business hours found! [3641](https://github.com/zammad/zammad/issues/3641) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Verification tokens questionable behavior in developer mode [3116](https://github.com/zammad/zammad/issues/3116) [[developer experience](https://github.com/zammad/zammad/labels/developer experience)]
|
||||||
|
- Replacing a mention with a new leads to mentioning both agents [3636](https://github.com/zammad/zammad/issues/3636) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Attachment order is wrong [3584](https://github.com/zammad/zammad/issues/3584) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)]
|
||||||
|
- When disconnecting a Chat, customer can still continue posting messages [2559](https://github.com/zammad/zammad/issues/2559) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- some macros are hidden in the drag & drop- overview with a small screen size [3359](https://github.com/zammad/zammad/issues/3359) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Add redis as an (optional) session store backend [3450](https://github.com/zammad/zammad/pull/3450)
|
||||||
|
- Text Module widget is broken/hidden after pressing backspace (once) [3637](https://github.com/zammad/zammad/issues/3637) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Mention widget show same users several times (if rest requests will return in different order) [3639](https://github.com/zammad/zammad/issues/3639) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- The rebuild of the index is failing [3633](https://github.com/zammad/zammad/issues/3633) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Monitoring endpoint complains about `Failed to run SessionTimeoutJob.perform_now after 10 tries #<NoMethodError: undefined method `id' for nil:NilClass` [3632](https://github.com/zammad/zammad/issues/3632) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Updating package-based installations can break the front end. [3629](https://github.com/zammad/zammad/issues/3629) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- backup: stop using su for pg_dump [3352](https://github.com/zammad/zammad/pull/3352) [[waiting for feedback](https://github.com/zammad/zammad/labels/waiting for feedback)]
|
||||||
|
- Reply-to header ignored if from contains a system address [2551](https://github.com/zammad/zammad/issues/2551) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Maintenance: Fix handling of test that require secrets not to run for GitHub PRs. [3626](https://github.com/zammad/zammad/pull/3626)
|
||||||
|
- replacing find -mtime with find -mmin [3570](https://github.com/zammad/zammad/pull/3570)
|
||||||
|
- Ensure to migrate old calendar URLs for google calendar sources [3618](https://github.com/zammad/zammad/issues/3618) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[regression](https://github.com/zammad/zammad/labels/regression)]
|
||||||
|
- Mentions/Subscribe with read permissions [3615](https://github.com/zammad/zammad/issues/3615) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Chat-Message references not cleared with data privacy task [3610](https://github.com/zammad/zammad/issues/3610) [[bug](https://github.com/zammad/zammad/labels/bug)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
|
||||||
|
- Overview names are hidden in mobile view for RTL languages [3500](https://github.com/zammad/zammad/issues/3500) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[mobile](https://github.com/zammad/zammad/labels/mobile)]
|
||||||
|
- SMTP-Attachments missing when using the API under high load [2991](https://github.com/zammad/zammad/issues/2991) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Inline image conversion from jpeg to png causes huge overhead [3538](https://github.com/zammad/zammad/issues/3538) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- session timeout does regulary logout active users before timeout because of dead old sessions [3605](https://github.com/zammad/zammad/issues/3605) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Zendesk import creates new ticket numbers rather than using the Zendesk ticket IDs also as ticket numbers in Zammad [3593](https://github.com/zammad/zammad/issues/3593) [[bug](https://github.com/zammad/zammad/labels/bug)] [[import](https://github.com/zammad/zammad/labels/import)] [[ticket](https://github.com/zammad/zammad/labels/ticket)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- wrong behaviour for the disabled option in session timeout [3600](https://github.com/zammad/zammad/issues/3600) [[bug](https://github.com/zammad/zammad/labels/bug)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Header links are not responsive [3133](https://github.com/zammad/zammad/issues/3133) [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- Update description of the session timeout setting [3597](https://github.com/zammad/zammad/issues/3597) [[bug](https://github.com/zammad/zammad/labels/bug)] [[admin area](https://github.com/zammad/zammad/labels/admin area)]
|
||||||
|
- Escalation calculation breaks data privacy ticket deletion [3588](https://github.com/zammad/zammad/issues/3588) [[bug](https://github.com/zammad/zammad/labels/bug)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
|
||||||
|
- `SessionTimeoutJob.perform_now` fails if user no longer exists [3586](https://github.com/zammad/zammad/issues/3586) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Robots.txt should allow indexing Knowledge Base on custom URLs [3164](https://github.com/zammad/zammad/issues/3164) [[bug](https://github.com/zammad/zammad/labels/bug)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- DataPrivacy may fail to clear user relations [3585](https://github.com/zammad/zammad/issues/3585) [[bug](https://github.com/zammad/zammad/labels/bug)] [[data privacy](https://github.com/zammad/zammad/labels/data privacy)]
|
||||||
|
- SessionTimeoutJob.perform_now scheduler job fails on update if scheduler process wasn't restarted [3581](https://github.com/zammad/zammad/issues/3581) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- Freshdesk import attribute ID mapping lookup constants fail application boot in systems with changed default names [3582](https://github.com/zammad/zammad/issues/3582) [[bug](https://github.com/zammad/zammad/labels/bug)]
|
||||||
|
- mentioned KB entries with the same title in different categories can not distinguished [3559](https://github.com/zammad/zammad/issues/3559) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)] [[knowledge base](https://github.com/zammad/zammad/labels/knowledge base)]
|
||||||
|
- Invalid auto assignment conditions may break ticket view for unassigned tickets [3567](https://github.com/zammad/zammad/issues/3567) [[bug](https://github.com/zammad/zammad/labels/bug)] [[UX/UI](https://github.com/zammad/zammad/labels/UX/UI)] [[prioritised by payment](https://github.com/zammad/zammad/labels/prioritised by payment)]
|
||||||
|
- Add Greek translation for chat [3569](https://github.com/zammad/zammad/pull/3569) [[chat](https://github.com/zammad/zammad/labels/chat)] [[translation](https://github.com/zammad/zammad/labels/translation)]
|
||||||
|
- Freshdesk [865](https://github.com/zammad/zammad/issues/865) [[feature backlog](https://github.com/zammad/zammad/labels/feature backlog)] [[import](https://github.com/zammad/zammad/labels/import)]
|
||||||
|
- Old JQuery version delivered [3431](https://github.com/zammad/zammad/issues/3431) [[bug](https://github.com/zammad/zammad/labels/bug)] [[chat](https://github.com/zammad/zammad/labels/chat)]
|
||||||
|
|
5
Gemfile
5
Gemfile
|
@ -3,8 +3,8 @@
|
||||||
source 'https://gems.sutty.nl'
|
source 'https://gems.sutty.nl'
|
||||||
|
|
||||||
# core - base
|
# core - base
|
||||||
ruby '2.7.3'
|
ruby '2.7.4'
|
||||||
gem 'rails', '~> 6.0.0'
|
gem 'rails', '~> 6.0'
|
||||||
|
|
||||||
# core - rails additions
|
# core - rails additions
|
||||||
gem 'activerecord-import'
|
gem 'activerecord-import'
|
||||||
|
@ -198,7 +198,6 @@ group :development, :test do
|
||||||
gem 'overcommit'
|
gem 'overcommit'
|
||||||
gem 'rubocop'
|
gem 'rubocop'
|
||||||
gem 'rubocop-faker'
|
gem 'rubocop-faker'
|
||||||
gem 'rubocop-inflector'
|
|
||||||
gem 'rubocop-performance'
|
gem 'rubocop-performance'
|
||||||
gem 'rubocop-rails'
|
gem 'rubocop-rails'
|
||||||
gem 'rubocop-rspec'
|
gem 'rubocop-rspec'
|
||||||
|
|
71
Gemfile.lock
71
Gemfile.lock
|
@ -90,31 +90,31 @@ GEM
|
||||||
activerecord (>= 4.2)
|
activerecord (>= 4.2)
|
||||||
addressable (2.8.0)
|
addressable (2.8.0)
|
||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
argon2 (2.1.1)
|
argon2 (2.0.3)
|
||||||
ffi (~> 1.14)
|
ffi (~> 1.14)
|
||||||
ffi-compiler (~> 1.0)
|
ffi-compiler (~> 1.0)
|
||||||
argon2 (2.0.3-x86_64-linux-musl)
|
argon2 (2.0.3-x86_64-linux-musl)
|
||||||
ffi (~> 1.14)
|
ffi (~> 1.14)
|
||||||
ffi-compiler (~> 1.0)
|
ffi-compiler (~> 1.0)
|
||||||
ast (2.4.2)
|
ast (2.4.2)
|
||||||
async (1.30.1)
|
async (1.29.1)
|
||||||
console (~> 1.10)
|
console (~> 1.10)
|
||||||
nio4r (~> 2.3)
|
nio4r (~> 2.3)
|
||||||
timers (~> 4.1)
|
timers (~> 4.1)
|
||||||
async-http (0.56.5)
|
async-http (0.56.3)
|
||||||
async (>= 1.25)
|
async (~> 1.25)
|
||||||
async-io (>= 1.28)
|
async-io (~> 1.28)
|
||||||
async-pool (>= 0.2)
|
async-pool (~> 0.2)
|
||||||
protocol-http (~> 0.22.0)
|
protocol-http (~> 0.22.0)
|
||||||
protocol-http1 (~> 0.14.0)
|
protocol-http1 (~> 0.14.0)
|
||||||
protocol-http2 (~> 0.14.0)
|
protocol-http2 (~> 0.14.0)
|
||||||
async-http-faraday (0.11.0)
|
async-http-faraday (0.11.0)
|
||||||
async-http (~> 0.42)
|
async-http (~> 0.42)
|
||||||
faraday
|
faraday
|
||||||
async-io (1.32.2)
|
async-io (1.32.1)
|
||||||
async
|
async (~> 1.14)
|
||||||
async-pool (0.3.9)
|
async-pool (0.3.7)
|
||||||
async (>= 1.25)
|
async (~> 1.25)
|
||||||
autoprefixer-rails (10.3.3.0)
|
autoprefixer-rails (10.3.3.0)
|
||||||
execjs (~> 2)
|
execjs (~> 2)
|
||||||
binding_of_caller (1.0.0)
|
binding_of_caller (1.0.0)
|
||||||
|
@ -188,7 +188,7 @@ GEM
|
||||||
docile (1.4.0)
|
docile (1.4.0)
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
doorkeeper (5.5.4)
|
doorkeeper (5.5.2)
|
||||||
railties (>= 5)
|
railties (>= 5)
|
||||||
dotenv (2.7.6)
|
dotenv (2.7.6)
|
||||||
eco (1.0.0)
|
eco (1.0.0)
|
||||||
|
@ -232,9 +232,9 @@ GEM
|
||||||
faraday-net_http_persistent (1.2.0)
|
faraday-net_http_persistent (1.2.0)
|
||||||
faraday-patron (1.0.0)
|
faraday-patron (1.0.0)
|
||||||
faraday-rack (1.0.0)
|
faraday-rack (1.0.0)
|
||||||
faraday_middleware (1.1.0)
|
faraday_middleware (1.0.0)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
ffi (1.15.4-x86_64-linux-musl)
|
ffi (1.15.3-x86_64-linux-musl)
|
||||||
ffi-compiler (1.0.1)
|
ffi-compiler (1.0.1)
|
||||||
ffi (>= 1.0.0)
|
ffi (>= 1.0.0)
|
||||||
rake
|
rake
|
||||||
|
@ -302,17 +302,17 @@ GEM
|
||||||
inflection (1.0.0)
|
inflection (1.0.0)
|
||||||
iniparse (1.5.0)
|
iniparse (1.5.0)
|
||||||
interception (0.5)
|
interception (0.5)
|
||||||
|
json (2.5.1)
|
||||||
json (2.5.1-x86_64-linux-musl)
|
json (2.5.1-x86_64-linux-musl)
|
||||||
jwt (2.3.0)
|
jwt (2.2.3)
|
||||||
kgio (2.11.4)
|
kgio (2.11.4)
|
||||||
kgio (2.11.4-x86_64-linux-musl)
|
kgio (2.11.4-x86_64-linux-musl)
|
||||||
koala (3.0.0)
|
koala (3.0.0)
|
||||||
addressable
|
addressable
|
||||||
faraday
|
faraday
|
||||||
json (>= 1.8)
|
json (>= 1.8)
|
||||||
libv8 (8.4.255.0)
|
|
||||||
libv8 (8.4.255.0-x86_64-linux)
|
libv8 (8.4.255.0-x86_64-linux)
|
||||||
listen (3.7.0)
|
listen (3.5.1)
|
||||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
rb-inotify (~> 0.9, >= 0.9.10)
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
little-plugger (1.1.4)
|
little-plugger (1.1.4)
|
||||||
|
@ -323,14 +323,14 @@ GEM
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
lumberjack (1.2.8)
|
lumberjack (1.2.8)
|
||||||
marcel (1.0.2)
|
marcel (1.0.1)
|
||||||
memoizable (0.4.2)
|
memoizable (0.4.2)
|
||||||
thread_safe (~> 0.3, >= 0.3.1)
|
thread_safe (~> 0.3, >= 0.3.1)
|
||||||
messagebird-rest (3.0.0)
|
messagebird-rest (3.0.0)
|
||||||
method_source (1.0.0)
|
method_source (1.0.0)
|
||||||
mime-types (3.3.1)
|
mime-types (3.3.1)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2021.0901)
|
mime-types-data (3.2021.0225)
|
||||||
mini_mime (1.1.1)
|
mini_mime (1.1.1)
|
||||||
mini_portile2 (2.6.1)
|
mini_portile2 (2.6.1)
|
||||||
mini_racer (0.2.9)
|
mini_racer (0.2.9)
|
||||||
|
@ -422,8 +422,8 @@ GEM
|
||||||
pg (0.21.0-x86_64-linux-musl)
|
pg (0.21.0-x86_64-linux-musl)
|
||||||
power_assert (2.0.1)
|
power_assert (2.0.1)
|
||||||
protocol-hpack (1.4.2)
|
protocol-hpack (1.4.2)
|
||||||
protocol-http (0.22.5)
|
protocol-http (0.22.4)
|
||||||
protocol-http1 (0.14.2)
|
protocol-http1 (0.14.1)
|
||||||
protocol-http (~> 0.22)
|
protocol-http (~> 0.22)
|
||||||
protocol-http2 (0.14.2)
|
protocol-http2 (0.14.2)
|
||||||
protocol-hpack (~> 1.4)
|
protocol-hpack (~> 1.4)
|
||||||
|
@ -480,7 +480,7 @@ GEM
|
||||||
rails-dom-testing (2.0.3)
|
rails-dom-testing (2.0.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.4.2)
|
rails-html-sanitizer (1.4.1)
|
||||||
loofah (~> 2.3)
|
loofah (~> 2.3)
|
||||||
railties (6.0.4.1)
|
railties (6.0.4.1)
|
||||||
actionpack (= 6.0.4.1)
|
actionpack (= 6.0.4.1)
|
||||||
|
@ -521,41 +521,38 @@ GEM
|
||||||
rspec-mocks (~> 3.10)
|
rspec-mocks (~> 3.10)
|
||||||
rspec-support (~> 3.10)
|
rspec-support (~> 3.10)
|
||||||
rspec-support (3.10.2)
|
rspec-support (3.10.2)
|
||||||
|
rszr (0.5.2)
|
||||||
rszr (0.5.2-x86_64-linux-musl)
|
rszr (0.5.2-x86_64-linux-musl)
|
||||||
rubocop (1.22.1)
|
rubocop (1.21.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.0.0.0)
|
parser (>= 3.0.0.0)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
rexml
|
rexml
|
||||||
rubocop-ast (>= 1.12.0, < 2.0)
|
rubocop-ast (>= 1.9.1, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 1.4.0, < 3.0)
|
||||||
rubocop-ast (1.12.0)
|
rubocop-ast (1.11.0)
|
||||||
parser (>= 3.0.1.1)
|
parser (>= 3.0.1.1)
|
||||||
rubocop-faker (1.1.0)
|
rubocop-faker (1.1.0)
|
||||||
faker (>= 2.12.0)
|
faker (>= 2.12.0)
|
||||||
rubocop (>= 0.82.0)
|
rubocop (>= 0.82.0)
|
||||||
rubocop-inflector (0.1.1)
|
|
||||||
activesupport
|
|
||||||
rubocop
|
|
||||||
rubocop-rspec
|
|
||||||
rubocop-performance (1.11.5)
|
rubocop-performance (1.11.5)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-ast (>= 0.4.0)
|
rubocop-ast (>= 0.4.0)
|
||||||
rubocop-rails (2.12.3)
|
rubocop-rails (2.12.2)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-rspec (2.5.0)
|
rubocop-rspec (2.5.0)
|
||||||
rubocop (~> 1.19)
|
rubocop (~> 1.19)
|
||||||
ruby-progressbar (1.11.0)
|
ruby-progressbar (1.11.0)
|
||||||
ruby-saml (1.13.0)
|
ruby-saml (1.12.2)
|
||||||
nokogiri (>= 1.10.5)
|
nokogiri (>= 1.10.5)
|
||||||
rexml
|
rexml
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
rubyntlm (0.6.3)
|
rubyntlm (0.6.3)
|
||||||
rubyzip (2.3.2)
|
rubyzip (2.3.0)
|
||||||
sassc (2.4.0)
|
sassc (2.4.0)
|
||||||
ffi (~> 1.9)
|
ffi (~> 1.9)
|
||||||
sassc (2.4.0-x86_64-linux-musl)
|
sassc (2.4.0-x86_64-linux-musl)
|
||||||
|
@ -619,7 +616,7 @@ GEM
|
||||||
timers (4.3.3)
|
timers (4.3.3)
|
||||||
tins (1.29.1)
|
tins (1.29.1)
|
||||||
sync
|
sync
|
||||||
twilio-ruby (5.59.0)
|
twilio-ruby (5.58.3)
|
||||||
faraday (>= 0.9, < 2.0)
|
faraday (>= 0.9, < 2.0)
|
||||||
jwt (>= 1.5, <= 2.5)
|
jwt (>= 1.5, <= 2.5)
|
||||||
nokogiri (>= 1.6, < 2.0)
|
nokogiri (>= 1.6, < 2.0)
|
||||||
|
@ -640,8 +637,7 @@ GEM
|
||||||
execjs (>= 0.3.0, < 3)
|
execjs (>= 0.3.0, < 3)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.8)
|
unf_ext (0.0.7.7-x86_64-linux-musl)
|
||||||
unf_ext (0.0.8-x86_64-linux-musl)
|
|
||||||
unicode-display_width (2.1.0)
|
unicode-display_width (2.1.0)
|
||||||
unicorn (6.0.0)
|
unicorn (6.0.0)
|
||||||
kgio (~> 2.6)
|
kgio (~> 2.6)
|
||||||
|
@ -757,7 +753,7 @@ DEPENDENCIES
|
||||||
pundit
|
pundit
|
||||||
pundit-matchers
|
pundit-matchers
|
||||||
rack-livereload
|
rack-livereload
|
||||||
rails (~> 6.0.0)
|
rails (~> 6.0)
|
||||||
rails-controller-testing
|
rails-controller-testing
|
||||||
rb-fsevent
|
rb-fsevent
|
||||||
rchardet (>= 1.8.0)
|
rchardet (>= 1.8.0)
|
||||||
|
@ -766,7 +762,6 @@ DEPENDENCIES
|
||||||
rszr (= 0.5.2)
|
rszr (= 0.5.2)
|
||||||
rubocop
|
rubocop
|
||||||
rubocop-faker
|
rubocop-faker
|
||||||
rubocop-inflector
|
|
||||||
rubocop-performance
|
rubocop-performance
|
||||||
rubocop-rails
|
rubocop-rails
|
||||||
rubocop-rspec
|
rubocop-rspec
|
||||||
|
@ -797,7 +792,7 @@ DEPENDENCIES
|
||||||
zendesk_api
|
zendesk_api
|
||||||
|
|
||||||
RUBY VERSION
|
RUBY VERSION
|
||||||
ruby 2.7.3p183
|
ruby 2.7.4p191
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.2.27
|
2.2.20
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
5.1.x
|
5.0.x
|
||||||
|
|
|
@ -497,9 +497,7 @@ class App.ControllerTable extends App.Controller
|
||||||
reference_key = groupBy + '_id'
|
reference_key = groupBy + '_id'
|
||||||
|
|
||||||
if reference_key of object
|
if reference_key of object
|
||||||
attribute = _.findWhere(object.constructor.configure_attributes, { name: reference_key })
|
return reference_key
|
||||||
|
|
||||||
return App[attribute.relation]?.find(object[reference_key])?.displayName() || reference_key
|
|
||||||
|
|
||||||
groupBy
|
groupBy
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class App.UiElement.ApplicationUiElement
|
||||||
result = []
|
result = []
|
||||||
for row in selection
|
for row in selection
|
||||||
if attribute.translate
|
if attribute.translate
|
||||||
row.name = App.i18n.translatePlain(row.name)
|
row.name = App.i18n.translateInline(row.name)
|
||||||
if !_.isEmpty(row.children)
|
if !_.isEmpty(row.children)
|
||||||
row.children = @getConfigOptionListArray(attribute, row.children)
|
row.children = @getConfigOptionListArray(attribute, row.children)
|
||||||
result.push row
|
result.push row
|
||||||
|
@ -65,7 +65,7 @@ class App.UiElement.ApplicationUiElement
|
||||||
for key in order
|
for key in order
|
||||||
name_new = selection[key]
|
name_new = selection[key]
|
||||||
if attribute.translate
|
if attribute.translate
|
||||||
name_new = App.i18n.translatePlain(name_new)
|
name_new = App.i18n.translateInline(name_new)
|
||||||
attribute.options.push {
|
attribute.options.push {
|
||||||
name: name_new
|
name: name_new
|
||||||
value: key
|
value: key
|
||||||
|
@ -162,7 +162,7 @@ class App.UiElement.ApplicationUiElement
|
||||||
nameNew = item.name
|
nameNew = item.name
|
||||||
|
|
||||||
if attribute.translate
|
if attribute.translate
|
||||||
nameNew = App.i18n.translatePlain(nameNew)
|
nameNew = App.i18n.translateInline(nameNew)
|
||||||
|
|
||||||
row =
|
row =
|
||||||
value: item.id,
|
value: item.id,
|
||||||
|
|
|
@ -37,11 +37,11 @@ class App.Browser
|
||||||
|
|
||||||
# define min. required browser version
|
# define min. required browser version
|
||||||
map =
|
map =
|
||||||
Firefox: 78 # ESR
|
Chrome: 37
|
||||||
Chrome: 83 # parallel to FF ESR - Edge is also detected as Chrome
|
Firefox: 36
|
||||||
Opera: 69 # based on Chrome 83
|
Explorer: 10
|
||||||
Explorer: 11 # 10 is EOL
|
Safari: 6
|
||||||
Safari: 11 # released 2018
|
Opera: 22
|
||||||
|
|
||||||
# disable id older
|
# disable id older
|
||||||
if data.browser
|
if data.browser
|
|
@ -14,7 +14,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group js-sure">
|
<div class="form-group js-sure">
|
||||||
<h3 class="danger-color"><%- @T('Warning') %></h3>
|
<h3 class="danger-color"><%- @T('Warning') %></h3>
|
||||||
<p class="danger-color"><%- @T('There is no rollback of this deletion possible. If you are absolutely sure to do this, then type in "%s" into the input.', App.i18n.translatePlain('delete').toUpperCase()) %></p>
|
<p class="danger-color"><%- @T('There is no rollback of this deletion possible. If you are absolutely sure to do this, then type in "%s" into the input.', App.i18n.translateInline('delete').toUpperCase()) %></p>
|
||||||
<%- @sure_html %>
|
<%- @sure_html %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="login fullscreen">
|
<div class="login fullscreen">
|
||||||
<div class="fullscreen-center">
|
<div class="fullscreen-center">
|
||||||
<div class="fullscreen-body">
|
<div class="fullscreen-body">
|
||||||
<p><%- @T('Log in to %s', @C('fqdn')) %></p>
|
<p><%- @T('Login with %s', @C('fqdn')) %></p>
|
||||||
|
|
||||||
<% if @C('maintenance_mode'): %>
|
<% if @C('maintenance_mode'): %>
|
||||||
<div class="hero-unit alert alert--danger js-maintenanceMode"><%- @T('Zammad is currently in maintenance mode. Only administrators can login. Please wait until the maintenance window is over.') %></div>
|
<div class="hero-unit alert alert--danger js-maintenanceMode"><%- @T('Zammad is currently in maintenance mode. Only administrators can login. Please wait until the maintenance window is over.') %></div>
|
||||||
|
|
|
@ -7,8 +7,6 @@ class Channel::Driver::Imap < Channel::EmailParser
|
||||||
FETCH_METADATA_TIMEOUT = 2.minutes
|
FETCH_METADATA_TIMEOUT = 2.minutes
|
||||||
FETCH_MSG_TIMEOUT = 4.minutes
|
FETCH_MSG_TIMEOUT = 4.minutes
|
||||||
EXPUNGE_TIMEOUT = 16.minutes
|
EXPUNGE_TIMEOUT = 16.minutes
|
||||||
DEFAULT_TIMEOUT = 45.seconds
|
|
||||||
CHECK_ONLY_TIMEOUT = 6.seconds
|
|
||||||
|
|
||||||
def fetchable?(_channel)
|
def fetchable?(_channel)
|
||||||
true
|
true
|
||||||
|
@ -112,7 +110,10 @@ example
|
||||||
Rails.logger.info "fetching imap (#{options[:host]}/#{options[:user]} port=#{port},ssl=#{ssl},starttls=#{starttls},folder=#{folder},keep_on_server=#{keep_on_server},auth_type=#{options.fetch(:auth_type, 'LOGIN')})"
|
Rails.logger.info "fetching imap (#{options[:host]}/#{options[:user]} port=#{port},ssl=#{ssl},starttls=#{starttls},folder=#{folder},keep_on_server=#{keep_on_server},auth_type=#{options.fetch(:auth_type, 'LOGIN')})"
|
||||||
|
|
||||||
# on check, reduce open_timeout to have faster probing
|
# on check, reduce open_timeout to have faster probing
|
||||||
check_type_timeout = check_type == 'check' ? CHECK_ONLY_TIMEOUT : DEFAULT_TIMEOUT
|
check_type_timeout = 45
|
||||||
|
if check_type == 'check'
|
||||||
|
check_type_timeout = 6
|
||||||
|
end
|
||||||
|
|
||||||
timeout(check_type_timeout) do
|
timeout(check_type_timeout) do
|
||||||
@imap = ::Net::IMAP.new(options[:host], port, ssl, nil, false)
|
@imap = ::Net::IMAP.new(options[:host], port, ssl, nil, false)
|
||||||
|
|
|
@ -502,7 +502,7 @@ process unprocessable_mails (tmp/unprocessable_mail/*.eml) again
|
||||||
path = Rails.root.join('tmp/unprocessable_mail')
|
path = Rails.root.join('tmp/unprocessable_mail')
|
||||||
files = []
|
files = []
|
||||||
Dir.glob("#{path}/*.eml") do |entry|
|
Dir.glob("#{path}/*.eml") do |entry|
|
||||||
ticket, _article, _user, _mail = Channel::EmailParser.new.process(params, File.binread(entry))
|
ticket, _article, _user, _mail = Channel::EmailParser.new.process(params, IO.binread(entry))
|
||||||
next if ticket.blank?
|
next if ticket.blank?
|
||||||
|
|
||||||
files.push entry
|
files.push entry
|
||||||
|
|
|
@ -678,7 +678,7 @@ to send no browser reload event, pass false
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
where attributes are used in conditions
|
where attributes are used by triggers, overviews or schedulers
|
||||||
|
|
||||||
result = ObjectManager::Attribute.attribute_to_references_hash
|
result = ObjectManager::Attribute.attribute_to_references_hash
|
||||||
|
|
||||||
|
@ -696,36 +696,22 @@ where attributes are used in conditions
|
||||||
=end
|
=end
|
||||||
|
|
||||||
def self.attribute_to_references_hash
|
def self.attribute_to_references_hash
|
||||||
|
objects = Trigger.select(:name, :condition) + Overview.select(:name, :condition) + Job.select(:name, :condition)
|
||||||
attribute_list = {}
|
attribute_list = {}
|
||||||
|
objects.each do |item|
|
||||||
|
item.condition.each do |condition_key, _condition_attributes|
|
||||||
|
attribute_list[condition_key] ||= {}
|
||||||
|
attribute_list[condition_key][item.class.name] ||= []
|
||||||
|
next if attribute_list[condition_key][item.class.name].include?(item.name)
|
||||||
|
|
||||||
attribute_to_references_hash_objects
|
attribute_list[condition_key][item.class.name].push item.name
|
||||||
.map { |elem| elem.select(:name, :condition) }
|
|
||||||
.flatten
|
|
||||||
.each do |item|
|
|
||||||
item.condition.each do |condition_key, _condition_attributes|
|
|
||||||
attribute_list[condition_key] ||= {}
|
|
||||||
attribute_list[condition_key][item.class.name] ||= []
|
|
||||||
next if attribute_list[condition_key][item.class.name].include?(item.name)
|
|
||||||
|
|
||||||
attribute_list[condition_key][item.class.name].push item.name
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
attribute_list
|
attribute_list
|
||||||
end
|
end
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
models that may reference attributes
|
|
||||||
|
|
||||||
=end
|
|
||||||
|
|
||||||
def self.attribute_to_references_hash_objects
|
|
||||||
Models.all.keys.select { |elem| elem.include? ChecksConditionValidation }
|
|
||||||
end
|
|
||||||
|
|
||||||
=begin
|
|
||||||
|
|
||||||
is certain attribute used by triggers, overviews or schedulers
|
is certain attribute used by triggers, overviews or schedulers
|
||||||
|
|
||||||
ObjectManager::Attribute.attribute_used_by_references?('Ticket', 'attribute_name')
|
ObjectManager::Attribute.attribute_used_by_references?('Ticket', 'attribute_name')
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
class Report::Profile < ApplicationModel
|
class Report::Profile < ApplicationModel
|
||||||
self.table_name = 'report_profiles'
|
self.table_name = 'report_profiles'
|
||||||
include ChecksConditionValidation
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
store :condition
|
store :condition
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
|
||||||
|
|
||||||
# Rails thinks the singularized version of knowledge_bases is knowledge_basis?!
|
# Rails thinks the singularized version of knowledge_bases is knowledge_basis?!
|
||||||
# see: KnowledgeBase.table_name.singularize
|
# see: KnowledgeBase.table_name.singularize
|
||||||
inflect.irregular 'base', 'bases'
|
inflect.singular(%r{(knowledge_base)s$}i, '\1')
|
||||||
inflect.acronym 'SMIME'
|
inflect.acronym 'SMIME'
|
||||||
inflect.acronym 'GitLab'
|
inflect.acronym 'GitLab'
|
||||||
inflect.acronym 'GitHub'
|
inflect.acronym 'GitHub'
|
||||||
|
|
|
@ -4,7 +4,7 @@ class Issue2619KbHeaderLinkColor < ActiveRecord::Migration[6.0]
|
||||||
def up
|
def up
|
||||||
return if !Setting.exists?(name: 'system_init_done')
|
return if !Setting.exists?(name: 'system_init_done')
|
||||||
|
|
||||||
add_column :knowledge_bases, :color_header_link, :string, limit: 25, null: false, default: 'hsl(206,8%,50%)'
|
add_column :knowledge_bases, :color_header_link, :string, limit: 25, null: false, default: 'hsl(206,8%,50%)' # rubocop:disable Zammad/ExistsResetColumnInformation
|
||||||
change_column_default :knowledge_bases, :color_header_link, nil
|
change_column_default :knowledge_bases, :color_header_link, nil
|
||||||
KnowledgeBase.reset_column_information
|
KnowledgeBase.reset_column_information
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
class ReloadAfterCoreWorkflow < ActiveRecord::Migration[6.0]
|
class ReloadAfterCoreWorkflow < ActiveRecord::Migration[4.2]
|
||||||
def up
|
def up
|
||||||
|
|
||||||
# return if it's a new setup
|
# return if it's a new setup
|
||||||
|
|
|
@ -161,8 +161,8 @@ satinize html string based on whiltelist
|
||||||
# wrap plain-text URLs in <a> tags
|
# wrap plain-text URLs in <a> tags
|
||||||
if node.is_a?(Nokogiri::XML::Text) && node.content.present? && node.content.include?(':') && node.ancestors.map(&:name).exclude?('a')
|
if node.is_a?(Nokogiri::XML::Text) && node.content.present? && node.content.include?(':') && node.ancestors.map(&:name).exclude?('a')
|
||||||
urls = URI.extract(node.content, LINKABLE_URL_SCHEMES)
|
urls = URI.extract(node.content, LINKABLE_URL_SCHEMES)
|
||||||
.map { |u| u.sub(%r{[,.]$}, '') } # URI::extract captures trailing dots/commas
|
.map { |u| u.sub(%r{[,.]$}, '') } # URI::extract captures trailing dots/commas
|
||||||
.grep_v(%r{^[^:]+:$}) # URI::extract will match, e.g., 'tel:'
|
.reject { |u| u.match?(%r{^[^:]+:$}) } # URI::extract will match, e.g., 'tel:'
|
||||||
|
|
||||||
next if urls.blank?
|
next if urls.blank?
|
||||||
|
|
||||||
|
|
|
@ -360,7 +360,7 @@ do(window) ->
|
||||||
'Send': 'Wyślij'
|
'Send': 'Wyślij'
|
||||||
'Chat closed by %s': 'Czat zamknięty przez %s'
|
'Chat closed by %s': 'Czat zamknięty przez %s'
|
||||||
'Compose your message...': 'Utwórz swoją wiadomość...'
|
'Compose your message...': 'Utwórz swoją wiadomość...'
|
||||||
'All colleagues are busy.': 'Wszyscy konsultanci są zajęci.'
|
'All colleagues are busy.': 'Wszyscy koledzy są zajęci.'
|
||||||
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.'
|
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.'
|
||||||
'Start new conversation': 'Rozpoczęcie nowej konwersacji'
|
'Start new conversation': 'Rozpoczęcie nowej konwersacji'
|
||||||
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.'
|
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.'
|
||||||
|
|
|
@ -578,7 +578,7 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
|
||||||
'Send': 'Wyślij',
|
'Send': 'Wyślij',
|
||||||
'Chat closed by %s': 'Czat zamknięty przez %s',
|
'Chat closed by %s': 'Czat zamknięty przez %s',
|
||||||
'Compose your message...': 'Utwórz swoją wiadomość...',
|
'Compose your message...': 'Utwórz swoją wiadomość...',
|
||||||
'All colleagues are busy.': 'Wszyscy konsultanci są zajęci.',
|
'All colleagues are busy.': 'Wszyscy koledzy są zajęci.',
|
||||||
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.',
|
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.',
|
||||||
'Start new conversation': 'Rozpoczęcie nowej konwersacji',
|
'Start new conversation': 'Rozpoczęcie nowej konwersacji',
|
||||||
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.',
|
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.',
|
||||||
|
|
2
public/assets/chat/chat-no-jquery.min.js
vendored
2
public/assets/chat/chat-no-jquery.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -358,7 +358,7 @@ do($ = window.jQuery, window) ->
|
||||||
'Send': 'Wyślij'
|
'Send': 'Wyślij'
|
||||||
'Chat closed by %s': 'Czat zamknięty przez %s'
|
'Chat closed by %s': 'Czat zamknięty przez %s'
|
||||||
'Compose your message...': 'Utwórz swoją wiadomość...'
|
'Compose your message...': 'Utwórz swoją wiadomość...'
|
||||||
'All colleagues are busy.': 'Wszyscy konsultanci są zajęci.'
|
'All colleagues are busy.': 'Wszyscy koledzy są zajęci.'
|
||||||
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.'
|
'You are on waiting list position <strong>%s</strong>.': 'Na liście oczekujących znajduje się pozycja <strong>%s</strong>.'
|
||||||
'Start new conversation': 'Rozpoczęcie nowej konwersacji'
|
'Start new conversation': 'Rozpoczęcie nowej konwersacji'
|
||||||
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.'
|
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.': 'Ponieważ w ciągu ostatnich %s minut nie odpowiedziałeś, Twoja rozmowa z <strong>%s</strong> została zamknięta.'
|
||||||
|
|
File diff suppressed because one or more lines are too long
2
public/assets/chat/chat.min.js
vendored
2
public/assets/chat/chat.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -11,8 +11,10 @@ if [ "$LEVEL" == '1' ]; then
|
||||||
cp contrib/auto_wizard_test.json auto_wizard.json
|
cp contrib/auto_wizard_test.json auto_wizard.json
|
||||||
cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb
|
cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb
|
||||||
rm test/browser/abb_one_group_test.rb
|
rm test/browser/abb_one_group_test.rb
|
||||||
|
rm test/browser/admin_channel_email_test.rb
|
||||||
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
||||||
rm test/browser/admin_overview_test.rb
|
rm test/browser/admin_overview_test.rb
|
||||||
|
rm test/browser/admin_permissions_granular_vs_full_test.rb
|
||||||
rm test/browser/admin_role_test.rb
|
rm test/browser/admin_role_test.rb
|
||||||
# test/browser/agent_navigation_and_title_test.rb
|
# test/browser/agent_navigation_and_title_test.rb
|
||||||
# test/browser/agent_organization_profile_test.rb
|
# test/browser/agent_organization_profile_test.rb
|
||||||
|
@ -43,11 +45,16 @@ if [ "$LEVEL" == '1' ]; then
|
||||||
rm test/browser/agent_ticket_zoom_hide_test.rb
|
rm test/browser/agent_ticket_zoom_hide_test.rb
|
||||||
rm test/browser/agent_user_manage_test.rb
|
rm test/browser/agent_user_manage_test.rb
|
||||||
rm test/browser/agent_user_profile_test.rb
|
rm test/browser/agent_user_profile_test.rb
|
||||||
|
# test/browser/auth_test.rb
|
||||||
rm test/browser/customer_ticket_create_test.rb
|
rm test/browser/customer_ticket_create_test.rb
|
||||||
rm test/browser/first_steps_test.rb
|
rm test/browser/first_steps_test.rb
|
||||||
rm test/browser/integration_test.rb
|
rm test/browser/integration_test.rb
|
||||||
rm test/browser/keyboard_shortcuts_test.rb
|
rm test/browser/keyboard_shortcuts_test.rb
|
||||||
# test/browser/manage_test.rb
|
# test/browser/manage_test.rb
|
||||||
|
# test/browser/monitoring_test.rb
|
||||||
|
rm test/browser/integration_sipgate_test.rb
|
||||||
|
rm test/browser/integration_cti_test.rb
|
||||||
|
rm test/browser/preferences_language_test.rb
|
||||||
# test/browser/swich_to_user_test.rb
|
# test/browser/swich_to_user_test.rb
|
||||||
# test/browser/taskbar_session_test.rb
|
# test/browser/taskbar_session_test.rb
|
||||||
# test/browser/taskbar_task_test.rb
|
# test/browser/taskbar_task_test.rb
|
||||||
|
@ -60,8 +67,10 @@ elif [ "$LEVEL" == '2' ]; then
|
||||||
# only ticket action 2/3
|
# only ticket action 2/3
|
||||||
# test/browser/aaa_getting_started_test.rb
|
# test/browser/aaa_getting_started_test.rb
|
||||||
# test/browser/abb_one_group_test.rb
|
# test/browser/abb_one_group_test.rb
|
||||||
|
rm test/browser/admin_channel_email_test.rb
|
||||||
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
||||||
rm test/browser/admin_overview_test.rb
|
rm test/browser/admin_overview_test.rb
|
||||||
|
rm test/browser/admin_permissions_granular_vs_full_test.rb
|
||||||
#rm test/browser/admin_role_test.rb
|
#rm test/browser/admin_role_test.rb
|
||||||
rm test/browser/agent_navigation_and_title_test.rb
|
rm test/browser/agent_navigation_and_title_test.rb
|
||||||
rm test/browser/agent_organization_profile_test.rb
|
rm test/browser/agent_organization_profile_test.rb
|
||||||
|
@ -92,11 +101,17 @@ elif [ "$LEVEL" == '2' ]; then
|
||||||
# test/browser/agent_ticket_zoom_hide_test.rb
|
# test/browser/agent_ticket_zoom_hide_test.rb
|
||||||
rm test/browser/agent_user_manage_test.rb
|
rm test/browser/agent_user_manage_test.rb
|
||||||
rm test/browser/agent_user_profile_test.rb
|
rm test/browser/agent_user_profile_test.rb
|
||||||
|
rm test/browser/auth_test.rb
|
||||||
rm test/browser/customer_ticket_create_test.rb
|
rm test/browser/customer_ticket_create_test.rb
|
||||||
rm test/browser/first_steps_test.rb
|
rm test/browser/first_steps_test.rb
|
||||||
rm test/browser/integration_test.rb
|
rm test/browser/integration_test.rb
|
||||||
rm test/browser/keyboard_shortcuts_test.rb
|
rm test/browser/keyboard_shortcuts_test.rb
|
||||||
rm test/browser/manage_test.rb
|
rm test/browser/manage_test.rb
|
||||||
|
rm test/browser/monitoring_test.rb
|
||||||
|
rm test/browser/integration_sipgate_test.rb
|
||||||
|
rm test/browser/integration_cti_test.rb
|
||||||
|
rm test/browser/preferences_language_test.rb
|
||||||
|
rm test/browser/switch_to_user_test.rb
|
||||||
rm test/browser/taskbar_session_test.rb
|
rm test/browser/taskbar_session_test.rb
|
||||||
rm test/browser/taskbar_task_test.rb
|
rm test/browser/taskbar_task_test.rb
|
||||||
# test/browser/user_access_permissions_test.rb
|
# test/browser/user_access_permissions_test.rb
|
||||||
|
@ -108,8 +123,10 @@ elif [ "$LEVEL" == '3' ]; then
|
||||||
# only ticket action 2/3
|
# only ticket action 2/3
|
||||||
# test/browser/aaa_getting_started_test.rb
|
# test/browser/aaa_getting_started_test.rb
|
||||||
# test/browser/abb_one_group_test.rb
|
# test/browser/abb_one_group_test.rb
|
||||||
|
rm test/browser/admin_channel_email_test.rb
|
||||||
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
||||||
rm test/browser/admin_overview_test.rb
|
rm test/browser/admin_overview_test.rb
|
||||||
|
rm test/browser/admin_permissions_granular_vs_full_test.rb
|
||||||
rm test/browser/admin_role_test.rb
|
rm test/browser/admin_role_test.rb
|
||||||
rm test/browser/agent_navigation_and_title_test.rb
|
rm test/browser/agent_navigation_and_title_test.rb
|
||||||
rm test/browser/agent_organization_profile_test.rb
|
rm test/browser/agent_organization_profile_test.rb
|
||||||
|
@ -140,11 +157,17 @@ elif [ "$LEVEL" == '3' ]; then
|
||||||
rm test/browser/agent_ticket_zoom_hide_test.rb
|
rm test/browser/agent_ticket_zoom_hide_test.rb
|
||||||
rm test/browser/agent_user_manage_test.rb
|
rm test/browser/agent_user_manage_test.rb
|
||||||
rm test/browser/agent_user_profile_test.rb
|
rm test/browser/agent_user_profile_test.rb
|
||||||
|
rm test/browser/auth_test.rb
|
||||||
rm test/browser/customer_ticket_create_test.rb
|
rm test/browser/customer_ticket_create_test.rb
|
||||||
rm test/browser/first_steps_test.rb
|
rm test/browser/first_steps_test.rb
|
||||||
rm test/browser/integration_test.rb
|
rm test/browser/integration_test.rb
|
||||||
rm test/browser/keyboard_shortcuts_test.rb
|
rm test/browser/keyboard_shortcuts_test.rb
|
||||||
rm test/browser/manage_test.rb
|
rm test/browser/manage_test.rb
|
||||||
|
rm test/browser/monitoring_test.rb
|
||||||
|
rm test/browser/integration_sipgate_test.rb
|
||||||
|
rm test/browser/integration_cti_test.rb
|
||||||
|
rm test/browser/preferences_language_test.rb
|
||||||
|
rm test/browser/switch_to_user_test.rb
|
||||||
rm test/browser/taskbar_session_test.rb
|
rm test/browser/taskbar_session_test.rb
|
||||||
rm test/browser/taskbar_task_test.rb
|
rm test/browser/taskbar_task_test.rb
|
||||||
rm test/browser/user_access_permissions_test.rb
|
rm test/browser/user_access_permissions_test.rb
|
||||||
|
@ -156,8 +179,10 @@ elif [ "$LEVEL" == '4' ]; then
|
||||||
# only ticket action 3/3
|
# only ticket action 3/3
|
||||||
# test/browser/aaa_getting_started_test.rb
|
# test/browser/aaa_getting_started_test.rb
|
||||||
# test/browser/abb_one_group_test.rb
|
# test/browser/abb_one_group_test.rb
|
||||||
|
rm test/browser/admin_channel_email_test.rb
|
||||||
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
||||||
rm test/browser/admin_overview_test.rb
|
rm test/browser/admin_overview_test.rb
|
||||||
|
rm test/browser/admin_permissions_granular_vs_full_test.rb
|
||||||
rm test/browser/admin_role_test.rb
|
rm test/browser/admin_role_test.rb
|
||||||
rm test/browser/agent_navigation_and_title_test.rb
|
rm test/browser/agent_navigation_and_title_test.rb
|
||||||
rm test/browser/agent_organization_profile_test.rb
|
rm test/browser/agent_organization_profile_test.rb
|
||||||
|
@ -188,11 +213,17 @@ elif [ "$LEVEL" == '4' ]; then
|
||||||
rm test/browser/agent_ticket_zoom_hide_test.rb
|
rm test/browser/agent_ticket_zoom_hide_test.rb
|
||||||
rm test/browser/agent_user_manage_test.rb
|
rm test/browser/agent_user_manage_test.rb
|
||||||
rm test/browser/agent_user_profile_test.rb
|
rm test/browser/agent_user_profile_test.rb
|
||||||
|
rm test/browser/auth_test.rb
|
||||||
# test/browser/customer_ticket_create_test.rb
|
# test/browser/customer_ticket_create_test.rb
|
||||||
rm test/browser/first_steps_test.rb
|
rm test/browser/first_steps_test.rb
|
||||||
rm test/browser/integration_test.rb
|
rm test/browser/integration_test.rb
|
||||||
rm test/browser/keyboard_shortcuts_test.rb
|
rm test/browser/keyboard_shortcuts_test.rb
|
||||||
rm test/browser/manage_test.rb
|
rm test/browser/manage_test.rb
|
||||||
|
rm test/browser/monitoring_test.rb
|
||||||
|
rm test/browser/integration_sipgate_test.rb
|
||||||
|
rm test/browser/integration_cti_test.rb
|
||||||
|
rm test/browser/preferences_language_test.rb
|
||||||
|
rm test/browser/switch_to_user_test.rb
|
||||||
rm test/browser/taskbar_session_test.rb
|
rm test/browser/taskbar_session_test.rb
|
||||||
rm test/browser/taskbar_task_test.rb
|
rm test/browser/taskbar_task_test.rb
|
||||||
rm test/browser/user_access_permissions_test.rb
|
rm test/browser/user_access_permissions_test.rb
|
||||||
|
@ -203,8 +234,10 @@ elif [ "$LEVEL" == '5' ]; then
|
||||||
|
|
||||||
# only profile action & admin
|
# only profile action & admin
|
||||||
# test/browser/abb_one_group_test.rb
|
# test/browser/abb_one_group_test.rb
|
||||||
|
# test/browser/admin_channel_email_test.rb
|
||||||
# rm test/browser/admin_drag_drop_to_new_group_test.rb
|
# rm test/browser/admin_drag_drop_to_new_group_test.rb
|
||||||
# test/browser/admin_overview_test.rb
|
# test/browser/admin_overview_test.rb
|
||||||
|
# rm test/browser/admin_permissions_granular_vs_full_test.rb
|
||||||
rm test/browser/admin_role_test.rb
|
rm test/browser/admin_role_test.rb
|
||||||
rm test/browser/agent_navigation_and_title_test.rb
|
rm test/browser/agent_navigation_and_title_test.rb
|
||||||
rm test/browser/agent_organization_profile_test.rb
|
rm test/browser/agent_organization_profile_test.rb
|
||||||
|
@ -235,11 +268,17 @@ elif [ "$LEVEL" == '5' ]; then
|
||||||
rm test/browser/agent_ticket_zoom_hide_test.rb
|
rm test/browser/agent_ticket_zoom_hide_test.rb
|
||||||
# test/browser/agent_user_manage_test.rb
|
# test/browser/agent_user_manage_test.rb
|
||||||
# test/browser/agent_user_profile_test.rb
|
# test/browser/agent_user_profile_test.rb
|
||||||
|
rm test/browser/auth_test.rb
|
||||||
rm test/browser/customer_ticket_create_test.rb
|
rm test/browser/customer_ticket_create_test.rb
|
||||||
rm test/browser/first_steps_test.rb
|
rm test/browser/first_steps_test.rb
|
||||||
rm test/browser/integration_test.rb
|
rm test/browser/integration_test.rb
|
||||||
rm test/browser/keyboard_shortcuts_test.rb
|
rm test/browser/keyboard_shortcuts_test.rb
|
||||||
rm test/browser/manage_test.rb
|
rm test/browser/manage_test.rb
|
||||||
|
rm test/browser/monitoring_test.rb
|
||||||
|
rm test/browser/integration_sipgate_test.rb
|
||||||
|
rm test/browser/integration_cti_test.rb
|
||||||
|
rm test/browser/preferences_language_test.rb
|
||||||
|
rm test/browser/switch_to_user_test.rb
|
||||||
rm test/browser/taskbar_session_test.rb
|
rm test/browser/taskbar_session_test.rb
|
||||||
rm test/browser/taskbar_task_test.rb
|
rm test/browser/taskbar_task_test.rb
|
||||||
rm test/browser/user_access_permissions_test.rb
|
rm test/browser/user_access_permissions_test.rb
|
||||||
|
@ -253,8 +292,10 @@ elif [ "$LEVEL" == '6' ]; then
|
||||||
cp contrib/auto_wizard_test.json auto_wizard.json
|
cp contrib/auto_wizard_test.json auto_wizard.json
|
||||||
cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb
|
cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb
|
||||||
rm test/browser/abb_one_group_test.rb
|
rm test/browser/abb_one_group_test.rb
|
||||||
|
rm test/browser/admin_channel_email_test.rb
|
||||||
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
rm test/browser/admin_drag_drop_to_new_group_test.rb
|
||||||
rm test/browser/admin_overview_test.rb
|
rm test/browser/admin_overview_test.rb
|
||||||
|
rm test/browser/admin_permissions_granular_vs_full_test.rb
|
||||||
rm test/browser/admin_role_test.rb
|
rm test/browser/admin_role_test.rb
|
||||||
rm test/browser/agent_navigation_and_title_test.rb
|
rm test/browser/agent_navigation_and_title_test.rb
|
||||||
rm test/browser/agent_organization_profile_test.rb
|
rm test/browser/agent_organization_profile_test.rb
|
||||||
|
@ -285,11 +326,17 @@ elif [ "$LEVEL" == '6' ]; then
|
||||||
rm test/browser/agent_ticket_zoom_hide_test.rb
|
rm test/browser/agent_ticket_zoom_hide_test.rb
|
||||||
rm test/browser/agent_user_manage_test.rb
|
rm test/browser/agent_user_manage_test.rb
|
||||||
rm test/browser/agent_user_profile_test.rb
|
rm test/browser/agent_user_profile_test.rb
|
||||||
|
rm test/browser/auth_test.rb
|
||||||
rm test/browser/customer_ticket_create_test.rb
|
rm test/browser/customer_ticket_create_test.rb
|
||||||
# test/browser/first_steps_test.rb
|
# test/browser/first_steps_test.rb
|
||||||
# test/browser/integration_test.rb
|
# test/browser/integration_test.rb
|
||||||
# test/browser/keyboard_shortcuts_test.rb
|
# test/browser/keyboard_shortcuts_test.rb
|
||||||
rm test/browser/manage_test.rb
|
rm test/browser/manage_test.rb
|
||||||
|
rm test/browser/monitoring_test.rb
|
||||||
|
# rm test/browser/integration_sipgate_test.rb
|
||||||
|
# rm test/browser/integration_cti_test.rb
|
||||||
|
# test/browser/preferences_language_test.rb
|
||||||
|
rm test/browser/switch_to_user_test.rb
|
||||||
rm test/browser/taskbar_session_test.rb
|
rm test/browser/taskbar_session_test.rb
|
||||||
rm test/browser/taskbar_task_test.rb
|
rm test/browser/taskbar_task_test.rb
|
||||||
rm test/browser/user_access_permissions_test.rb
|
rm test/browser/user_access_permissions_test.rb
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
RSpec.describe GitHub, type: :integration, required_envs: %w[GITHUB_ENDPOINT GITHUB_APITOKEN] do
|
RSpec.describe GitHub, type: :integration, required_envs: %w[GITHUB_ENDPOINT GITHUB_APITOKEN] do # rubocop:disable RSpec/FilePath
|
||||||
|
|
||||||
let(:instance) { described_class.new(ENV['GITHUB_ENDPOINT'], ENV['GITHUB_APITOKEN']) }
|
let(:instance) { described_class.new(ENV['GITHUB_ENDPOINT'], ENV['GITHUB_APITOKEN']) }
|
||||||
let(:issue_data) do
|
let(:issue_data) do
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
RSpec.describe GitLab, type: :integration, required_envs: %w[GITLAB_ENDPOINT GITLAB_APITOKEN] do
|
RSpec.describe GitLab, type: :integration, required_envs: %w[GITLAB_ENDPOINT GITLAB_APITOKEN] do # rubocop:disable RSpec/FilePath
|
||||||
|
|
||||||
let(:instance) { described_class.new(ENV['GITLAB_ENDPOINT'], ENV['GITLAB_APITOKEN']) }
|
let(:instance) { described_class.new(ENV['GITLAB_ENDPOINT'], ENV['GITLAB_APITOKEN']) }
|
||||||
let(:issue_data) do
|
let(:issue_data) do
|
||||||
|
|
|
@ -148,12 +148,4 @@ RSpec.describe ObjectManager::Attribute, type: :model do
|
||||||
it { is_expected.to be_valid }
|
it { is_expected.to be_valid }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Class methods:' do
|
|
||||||
describe '.attribute_to_references_hash_objects' do
|
|
||||||
it 'returns classes with conditions' do
|
|
||||||
expect(described_class.attribute_to_references_hash_objects).to match_array [Trigger, Overview, Job, Sla, Report::Profile ]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -32,21 +32,6 @@ module BrowserTestHelper
|
||||||
sleep wait_time
|
sleep wait_time
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get the current cookies from the browser with the driver object.
|
|
||||||
#
|
|
||||||
def cookies
|
|
||||||
page.driver.browser.manage.all_cookies
|
|
||||||
end
|
|
||||||
|
|
||||||
# Get a single cookie by the given name (regex possible)
|
|
||||||
#
|
|
||||||
# @example
|
|
||||||
# cookie('cookie-name')
|
|
||||||
#
|
|
||||||
def cookie(name)
|
|
||||||
cookies.find { |cookie| cookie[:name].match?(name) }
|
|
||||||
end
|
|
||||||
|
|
||||||
# Finds an element and clicks it - wrapped in one method.
|
# Finds an element and clicks it - wrapped in one method.
|
||||||
#
|
#
|
||||||
# @example
|
# @example
|
||||||
|
|
|
@ -92,8 +92,6 @@ module CommonActions
|
||||||
#
|
#
|
||||||
def logout
|
def logout
|
||||||
visit('logout')
|
visit('logout')
|
||||||
|
|
||||||
wait.until_disappears { find('.user-menu .user a', wait: false) }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Overwrites the Capybara::Session#visit method to allow SPA navigation
|
# Overwrites the Capybara::Session#visit method to allow SPA navigation
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe 'Authentication', type: :system do
|
RSpec.describe 'Authentication', type: :system do
|
||||||
|
|
||||||
it 'Login', authenticated_as: false do
|
it 'Login', authenticated_as: false do
|
||||||
login(
|
login(
|
||||||
username: 'admin@example.com',
|
username: 'admin@example.com',
|
||||||
|
@ -10,35 +11,6 @@ RSpec.describe 'Authentication', type: :system do
|
||||||
)
|
)
|
||||||
|
|
||||||
expect_current_route 'dashboard'
|
expect_current_route 'dashboard'
|
||||||
|
|
||||||
refresh
|
|
||||||
|
|
||||||
# Check that cookies is temporary.
|
|
||||||
cookie = cookie('^_zammad.+?')
|
|
||||||
expect(cookie[:expires]).to eq(nil)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'Login with remember me', authenticated_as: false do
|
|
||||||
login(
|
|
||||||
username: 'admin@example.com',
|
|
||||||
password: 'test',
|
|
||||||
remember_me: true
|
|
||||||
)
|
|
||||||
|
|
||||||
expect_current_route 'dashboard'
|
|
||||||
|
|
||||||
refresh
|
|
||||||
|
|
||||||
# Check that cookies has a expire date.
|
|
||||||
cookie = cookie('^_zammad.+?')
|
|
||||||
expect(cookie[:expires]).to be_truthy
|
|
||||||
|
|
||||||
logout
|
|
||||||
expect_current_route 'login', wait: 10
|
|
||||||
|
|
||||||
# Check that cookies has no longer a expire date after logout.
|
|
||||||
cookie = cookie('^_zammad.+?')
|
|
||||||
expect(cookie[:expires]).to eq(nil)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'Logout' do
|
it 'Logout' do
|
||||||
|
|
|
@ -4,113 +4,6 @@ require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe 'Manage > Channels > Email', type: :system do
|
RSpec.describe 'Manage > Channels > Email', type: :system do
|
||||||
|
|
||||||
context 'when managing email channels', required_envs: %w[MAILBOX_INIT] do
|
|
||||||
|
|
||||||
before do
|
|
||||||
visit '/#channels/email'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when looking at the default screen' do
|
|
||||||
|
|
||||||
it 'has correct default settings' do
|
|
||||||
|
|
||||||
within :active_content do
|
|
||||||
# check if postmaster filters are shown
|
|
||||||
click 'a[href="#c-filter"]'
|
|
||||||
expect(find('#c-filter .overview')).to have_text 'NO ENTRIES'
|
|
||||||
|
|
||||||
# check if signatures are shown
|
|
||||||
click 'a[href="#c-signature"]'
|
|
||||||
expect(find('#c-signature .overview')).to have_text 'default'
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when creating new channels' do
|
|
||||||
let(:mailbox_user) { ENV['MAILBOX_INIT'].split(':')[0] }
|
|
||||||
let(:mailbox_password) { ENV['MAILBOX_INIT'].split(':')[1] }
|
|
||||||
|
|
||||||
before do
|
|
||||||
# Make sure the channel is loaded
|
|
||||||
'Channel::Driver::Imap'.constantize
|
|
||||||
# The normal timeout may be too low in slow CI environments.
|
|
||||||
stub_const 'Channel::Driver::Imap::CHECK_ONLY_TIMEOUT', 1.minute
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'refuses wrong credentials' do
|
|
||||||
|
|
||||||
click 'a[href="#c-account"]'
|
|
||||||
click '.js-channelNew'
|
|
||||||
modal_ready
|
|
||||||
|
|
||||||
within '.modal' do
|
|
||||||
fill_in 'realname', with: 'My System'
|
|
||||||
fill_in 'email', with: "unknown_user.#{mailbox_user}"
|
|
||||||
fill_in 'password', with: mailbox_password
|
|
||||||
select 'Users', from: 'group_id'
|
|
||||||
click '.js-submit'
|
|
||||||
expect(page).to have_text('Unable to detect your server settings. Manual configuration needed.')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'accepts correct credentials' do
|
|
||||||
|
|
||||||
click 'a[href="#c-account"]'
|
|
||||||
click '.js-channelNew'
|
|
||||||
modal_ready
|
|
||||||
|
|
||||||
within '.modal' do
|
|
||||||
fill_in 'realname', with: 'My System'
|
|
||||||
fill_in 'email', with: mailbox_user
|
|
||||||
fill_in 'password', with: mailbox_password
|
|
||||||
select 'Users', from: 'group_id'
|
|
||||||
click '.js-submit'
|
|
||||||
end
|
|
||||||
|
|
||||||
modal_disappear timeout: 2.minutes
|
|
||||||
|
|
||||||
within :active_content do
|
|
||||||
expect(page).to have_text(mailbox_user)
|
|
||||||
all('.js-editInbound').last.click
|
|
||||||
fill_in 'options::folder', with: 'nonexisting_folder'
|
|
||||||
click '.js-submit'
|
|
||||||
expect(page).to have_text("Mailbox doesn\'t exist")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when managing filters' do
|
|
||||||
let(:filter_name) { "Test Filter #{SecureRandom.uuid}" }
|
|
||||||
|
|
||||||
it 'works as expected' do
|
|
||||||
|
|
||||||
click 'a[href="#c-filter"]'
|
|
||||||
click '.content.active a[data-type="new"]'
|
|
||||||
|
|
||||||
modal_ready
|
|
||||||
within '.modal' do
|
|
||||||
fill_in 'name', with: filter_name
|
|
||||||
fill_in 'match::from::value', with: 'target'
|
|
||||||
click '.js-submit'
|
|
||||||
end
|
|
||||||
modal_disappear
|
|
||||||
|
|
||||||
expect(page).to have_text(filter_name)
|
|
||||||
click '.content.active .table .dropdown .btn--table'
|
|
||||||
click '.content.active .table .dropdown .js-clone'
|
|
||||||
|
|
||||||
modal_ready
|
|
||||||
click '.modal .js-submit'
|
|
||||||
modal_disappear
|
|
||||||
|
|
||||||
expect(page).to have_text("Clone: #{filter_name}")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'non editable' do
|
context 'non editable' do
|
||||||
|
|
||||||
it 'hides "Edit" links' do
|
it 'hides "Edit" links' do
|
||||||
|
|
|
@ -2,234 +2,62 @@
|
||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe 'Caller log', type: :system, authenticated_as: :agent do
|
RSpec.describe 'Caller log', type: %i[system request] do
|
||||||
let(:agent_phone) { '0190111' }
|
let(:admin) do
|
||||||
let(:customer_phone) { '0190333' }
|
create(:admin, groups: Group.all)
|
||||||
let(:cti_token) { 'token1234' }
|
end
|
||||||
let(:agent) { create(:agent, phone: agent_phone) }
|
|
||||||
let(:customer) { create(:customer, phone: customer_phone) }
|
let!(:customer) { create(:customer, phone: '0190333') }
|
||||||
let(:cti_on) { true }
|
|
||||||
|
|
||||||
let(:params) do
|
let(:params) do
|
||||||
{
|
{
|
||||||
direction: 'in',
|
direction: 'in',
|
||||||
from: customer.phone,
|
from: '0190333',
|
||||||
to: agent_phone,
|
to: '0190111',
|
||||||
callId: '111',
|
callId: '111',
|
||||||
cause: 'busy',
|
cause: 'busy'
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:first_params) { params.merge(event: 'newCall') }
|
def prepare
|
||||||
let(:second_params) { params.merge(event: 'hangup') }
|
Setting.set('cti_integration', true)
|
||||||
|
Setting.set('cti_token', 'token1234')
|
||||||
let(:place_call) do
|
current_user.update(phone: '0190111')
|
||||||
post "#{Capybara.app_host}/api/v1/cti/#{cti_token}", params: first_params
|
|
||||||
post "#{Capybara.app_host}/api/v1/cti/#{cti_token}", params: second_params
|
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:prepare) do
|
context 'without active tickets' do
|
||||||
Setting.set('cti_integration', cti_on)
|
it 'checks opening of the ticket creation screen after phone call inbound' do
|
||||||
Setting.set('cti_token', cti_token)
|
prepare
|
||||||
end
|
|
||||||
|
|
||||||
before { prepare }
|
travel(-2.months)
|
||||||
|
create(:ticket, customer: customer)
|
||||||
|
travel_back
|
||||||
|
|
||||||
context 'when cti integration is on' do
|
|
||||||
it 'shows the phone menu in nav bar' do
|
|
||||||
|
|
||||||
within '#navigation .menu' do
|
|
||||||
expect(page).to have_link('Phone', href: '#cti')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when cti integration is not on' do
|
|
||||||
let(:cti_on) { false }
|
|
||||||
|
|
||||||
it 'does not show the phone menu in nav bar' do
|
|
||||||
|
|
||||||
within '#navigation .menu' do
|
|
||||||
expect(page).to have_no_link('Phone', href: '#cti')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when a customer call is answered' do
|
|
||||||
let(:second_params) { params.merge(event: 'answer', answeringNumber: agent_phone) }
|
|
||||||
|
|
||||||
context 'without active tickets' do
|
|
||||||
before do
|
|
||||||
travel(-2.months)
|
|
||||||
create(:ticket, customer: customer)
|
|
||||||
travel_back
|
|
||||||
|
|
||||||
visit 'cti'
|
|
||||||
|
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'opens a new ticket after phone call inbound' do
|
|
||||||
within(:active_content) do
|
|
||||||
expect(page).to have_text('New Ticket')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with active tickets' do
|
|
||||||
before do
|
|
||||||
create(:ticket, customer: customer)
|
|
||||||
|
|
||||||
visit 'cti'
|
|
||||||
|
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'opens the customer profile screen after phone call inbound with tickets in the last month' do
|
|
||||||
within(:active_content) do
|
|
||||||
expect(page).to have_text(customer.fullname)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with incoming call' do
|
|
||||||
before do
|
|
||||||
visit 'cti'
|
visit 'cti'
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'increments the call counter notification badge' do
|
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'newCall'), as: :json
|
||||||
within '[href="#cti"].js-phoneMenuItem' do
|
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'answer', answeringNumber: '0190111'), as: :json
|
||||||
counter = find('.counter')
|
|
||||||
expect(counter).to have_content 1
|
within(:active_content) do
|
||||||
|
expect(page).to have_text('New Ticket', wait: 5)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when incoming call is checked' do
|
context 'with active tickets' do
|
||||||
before do
|
it 'checks opening of the user profile screen after phone call inbound with tickets in the last month' do
|
||||||
|
prepare
|
||||||
|
|
||||||
|
create(:ticket, customer: customer)
|
||||||
|
|
||||||
visit 'cti'
|
visit 'cti'
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'clears the call counter notification badge' do
|
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'newCall'), as: :json
|
||||||
within :active_content do
|
post "#{Capybara.app_host}/api/v1/cti/token1234", params: params.merge(event: 'answer', answeringNumber: '0190111'), as: :json
|
||||||
find('.table-checkbox input.js-check', visible: :all).check allow_label_click: true
|
|
||||||
|
within(:active_content) do
|
||||||
|
expect(page).to have_text(customer.fullname, wait: 5)
|
||||||
end
|
end
|
||||||
|
|
||||||
within '[href="#cti"].js-phoneMenuItem' do
|
|
||||||
expect(page).to have_no_selector('.counter')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Regression test for #2018
|
|
||||||
context 'phone numbers format' do
|
|
||||||
before do
|
|
||||||
visit 'cti'
|
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with private number' do
|
|
||||||
let(:customer_phone) { '007' }
|
|
||||||
let(:agent_phone) { '008' }
|
|
||||||
|
|
||||||
it 'appears verbatim' do
|
|
||||||
|
|
||||||
within :active_content do
|
|
||||||
expect(page).to have_selector('.js-callerLog', text: customer_phone)
|
|
||||||
.and have_selector('.js-callerLog', text: agent_phone)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with e164 number' do
|
|
||||||
let(:customer_phone) { '4930609854180' }
|
|
||||||
let(:agent_phone) { '4930609811111' }
|
|
||||||
let(:prettified_customer_phone) { '+49 30 609854180' }
|
|
||||||
let(:prettified_current_user_phone) { '+49 30 609811111' }
|
|
||||||
|
|
||||||
it 'appears prettified' do
|
|
||||||
within :active_content do
|
|
||||||
expect(page).to have_selector('.js-callerLog', text: prettified_customer_phone)
|
|
||||||
.and have_selector('.js-callerLog', text: prettified_current_user_phone)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'done not appear verbatim' do
|
|
||||||
within :active_content do
|
|
||||||
expect(page).to have_no_selector('.js-callerLog', text: customer_phone)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Regression test for #2096
|
|
||||||
context 'with inactive user' do
|
|
||||||
before do
|
|
||||||
visit 'cti'
|
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:customer) do
|
|
||||||
create(:customer,
|
|
||||||
phone: customer_phone,
|
|
||||||
active: false,
|
|
||||||
firstname: 'John',
|
|
||||||
lastname: 'Doe')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'appears inactive' do
|
|
||||||
within :active_content do
|
|
||||||
expect(page).to have_selector('span.avatar--inactive', text: 'JD')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Regression test for #2075
|
|
||||||
context 'when user is with organization name' do
|
|
||||||
before do
|
|
||||||
visit 'cti'
|
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:firstname) { 'John' }
|
|
||||||
let(:lastname) { 'Doe' }
|
|
||||||
let(:organization_name) { 'Test Organization' }
|
|
||||||
let(:organization) { create(:organization, name: organization_name) }
|
|
||||||
let(:full_name) { "#{firstname} #{lastname}" }
|
|
||||||
let(:customer) do
|
|
||||||
create(:customer,
|
|
||||||
phone: customer_phone,
|
|
||||||
firstname: firstname,
|
|
||||||
lastname: lastname,
|
|
||||||
organization: organization)
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'showing user with thier organization name' do
|
|
||||||
it 'shows user with thier organization name' do
|
|
||||||
within :active_content do
|
|
||||||
expect(page).to have_selector(
|
|
||||||
'.js-callerLog tr div.user-popover',
|
|
||||||
text: "#{full_name} (#{organization_name})"
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with call direction out' do
|
|
||||||
let(:first_params) { params.merge(event: 'newCall', direction: 'out', from: agent_phone, to: customer.phone) }
|
|
||||||
let(:second_params) { params.merge(event: 'hangup', direction: 'out', from: agent_phone, to: customer.phone) }
|
|
||||||
|
|
||||||
it_behaves_like 'showing user with thier organization name'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with call direction in' do
|
|
||||||
let(:first_params) { params.merge(event: 'newCall', direction: 'in') }
|
|
||||||
let(:second_params) { params.merge(event: 'hangup', direction: 'in') }
|
|
||||||
|
|
||||||
it_behaves_like 'showing user with thier organization name'
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -112,7 +112,7 @@ RSpec.describe 'Import Freshdesk', type: :system, set_up: false, authenticated_a
|
||||||
|
|
||||||
Rake::Task['zammad:setup:auto_wizard'].execute
|
Rake::Task['zammad:setup:auto_wizard'].execute
|
||||||
|
|
||||||
expect(page).to have_text(Setting.get('fqdn'))
|
expect(page).to have_text('Login')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -121,7 +121,7 @@ RSpec.describe 'Import Zendesk', type: :system, set_up: false, authenticated_as:
|
||||||
|
|
||||||
Rake::Task['zammad:setup:auto_wizard'].execute
|
Rake::Task['zammad:setup:auto_wizard'].execute
|
||||||
|
|
||||||
expect(page).to have_text(Setting.get('fqdn'))
|
expect(page).to have_text('Login')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe 'Login', type: :system, authenticated_as: false do
|
|
||||||
before do
|
|
||||||
visit '/'
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'fqdn is visible on login page' do
|
|
||||||
expect(page).to have_css('.login p', text: Setting.get('fqdn'))
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'Login with wrong credentials' do
|
|
||||||
within('#login') do
|
|
||||||
fill_in 'username', with: 'admin@example.com'
|
|
||||||
fill_in 'password', with: 'wrong'
|
|
||||||
|
|
||||||
click_button
|
|
||||||
end
|
|
||||||
|
|
||||||
expect(page).to have_css('#login .alert')
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -111,33 +111,6 @@ RSpec.describe 'Manage > Users', type: :system do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'updating a user' do
|
|
||||||
before do
|
|
||||||
create(:admin)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'handles permission checkboxes correctly' do
|
|
||||||
visit '#manage/users'
|
|
||||||
|
|
||||||
within(:active_content) do
|
|
||||||
click 'table.user-list tbody tr:first-child'
|
|
||||||
end
|
|
||||||
in_modal disappears: false do
|
|
||||||
scroll_into_view 'table.settings-list'
|
|
||||||
within 'table.settings-list tbody tr:first-child' do
|
|
||||||
click 'input[value="full"]', visible: :all
|
|
||||||
expect(find('input[value="full"]', visible: :all).checked?).to be true
|
|
||||||
click 'input[value="read"]', visible: :all
|
|
||||||
expect(find('input[value="full"]', visible: :all).checked?).to be false
|
|
||||||
expect(find('input[value="read"]', visible: :all).checked?).to be true
|
|
||||||
click 'input[value="full"]', visible: :all
|
|
||||||
expect(find('input[value="full"]', visible: :all).checked?).to be true
|
|
||||||
expect(find('input[value="read"]', visible: :all).checked?).to be false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'check user edit permissions', authenticated_as: -> { user } do
|
describe 'check user edit permissions', authenticated_as: -> { user } do
|
||||||
|
|
||||||
shared_examples 'user permission' do |allow|
|
shared_examples 'user permission' do |allow|
|
||||||
|
|
|
@ -66,19 +66,13 @@ RSpec.describe 'Overview', type: :system do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'sorting when group by is set', authenticated_as: :user do
|
context 'sorting when group by is set' do
|
||||||
let(:user) { create(:agent, groups: [group_c, group_a, group_b]) }
|
let(:user) { create(:customer) }
|
||||||
|
let(:ticket1) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 1, customer: user) }
|
||||||
let(:group_a) { create(:group, name: 'aaa') }
|
let(:ticket2) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 2, customer: user) }
|
||||||
let(:group_b) { create(:group, name: 'bbb') }
|
let(:ticket3) { create(:ticket, group: Group.find_by(name: 'Users'), priority_id: 3, customer: user) }
|
||||||
let(:group_c) { create(:group, name: 'ccc') }
|
|
||||||
|
|
||||||
let(:ticket1) { create(:ticket, group: group_a, priority_id: 1, customer: user) }
|
|
||||||
let(:ticket2) { create(:ticket, group: group_c, priority_id: 2, customer: user) }
|
|
||||||
let(:ticket3) { create(:ticket, group: group_b, priority_id: 3, customer: user) }
|
|
||||||
|
|
||||||
let(:overview) do
|
let(:overview) do
|
||||||
create(:overview, group_by: group_key, group_direction: group_direction, condition: {
|
create(:overview, group_by: 'priority', group_direction: group_direction, condition: {
|
||||||
'ticket.customer_id' => {
|
'ticket.customer_id' => {
|
||||||
operator: 'is',
|
operator: 'is',
|
||||||
value: user.id
|
value: user.id
|
||||||
|
@ -92,60 +86,48 @@ RSpec.describe 'Overview', type: :system do
|
||||||
visit "ticket/view/#{overview.link}"
|
visit "ticket/view/#{overview.link}"
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when grouping by priority' do
|
context 'when group direction is default' do
|
||||||
let(:group_key) { 'priority' }
|
let(:group_direction) { nil }
|
||||||
|
|
||||||
context 'when group direction is default' do
|
it 'sorts groups 1 > 3' do
|
||||||
let(:group_direction) { nil }
|
within :active_content do
|
||||||
|
expect(find('.table-overview table tbody tr:first-child td:nth-child(1)').text).to match('1 low')
|
||||||
it 'sorts groups 1 > 3' do
|
expect(find('.table-overview table tbody tr:nth-child(5) td:nth-child(1)').text).to match('3 high')
|
||||||
within :active_content do
|
|
||||||
expect(all('.table-overview table b').map(&:text)).to eq ['1 low', '2 normal', '3 high']
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'does not show duplicates when any ticket attribute is updated using bulk update' do
|
|
||||||
find("tr[data-id='#{ticket3.id}']").check('bulk', allow_label_click: true)
|
|
||||||
select '2 normal', from: 'priority_id'
|
|
||||||
|
|
||||||
click '.js-confirm'
|
|
||||||
find('.js-confirm-step textarea').fill_in with: 'test tickets ordering'
|
|
||||||
click '.js-submit'
|
|
||||||
|
|
||||||
within :active_content do
|
|
||||||
expect(page).to have_css("tr[data-id='#{ticket3.id}']", count: 1)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when group direction is ASC' do
|
it 'does not show duplicates when any ticket attribute is updated using bulk update' do
|
||||||
let(:group_direction) { 'ASC' }
|
find("tr[data-id='#{ticket3.id}']").check('bulk', allow_label_click: true)
|
||||||
|
select '2 normal', from: 'priority_id'
|
||||||
|
|
||||||
it 'sorts groups 1 > 3' do
|
click '.js-confirm'
|
||||||
within :active_content do
|
find('.js-confirm-step textarea').fill_in with: 'test tickets ordering'
|
||||||
expect(all('.table-overview table b').map(&:text)).to eq ['1 low', '2 normal', '3 high']
|
click '.js-submit'
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when group direction is DESC' do
|
within :active_content do
|
||||||
let(:group_direction) { 'DESC' }
|
expect(page).to have_css("tr[data-id='#{ticket3.id}']", count: 1)
|
||||||
|
|
||||||
it 'sorts groups 3 > 1' do
|
|
||||||
within :active_content do
|
|
||||||
expect(all('.table-overview table b').map(&:text)).to eq ['3 high', '2 normal', '1 low']
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when grouping by groups' do
|
context 'when group direction is ASC' do
|
||||||
let(:group_key) { 'group' }
|
|
||||||
let(:group_direction) { 'ASC' }
|
let(:group_direction) { 'ASC' }
|
||||||
|
|
||||||
it 'sorts groups a > b > c' do
|
it 'sorts groups 1 > 3' do
|
||||||
within :active_content do
|
within :active_content do
|
||||||
expect(all('.table-overview table b').map(&:text)).to eq %w[aaa bbb ccc]
|
expect(find('.table-overview table tbody tr:first-child td:nth-child(1)').text).to match('1 low')
|
||||||
|
expect(find('.table-overview table tbody tr:nth-child(5) td:nth-child(1)').text).to match('3 high')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when group direction is DESC' do
|
||||||
|
let(:group_direction) { 'DESC' }
|
||||||
|
|
||||||
|
it 'sorts groups 3 > 1' do
|
||||||
|
within :active_content do
|
||||||
|
expect(find('.table-overview table tbody tr:first-child td:nth-child(1)').text).to match('3 high')
|
||||||
|
expect(find('.table-overview table tbody tr:nth-child(5) td:nth-child(1)').text).to match('1 low')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,236 +0,0 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe 'Profile > Language', type: :system do
|
|
||||||
let(:group) { create(:group) }
|
|
||||||
let(:session_user) { create(:admin, preferences: { locale: locale }, groups: Group.all) }
|
|
||||||
let(:path) { 'profile/language' }
|
|
||||||
|
|
||||||
shared_examples 'having translated content in' do |current_element|
|
|
||||||
it "the '#{current_element}' element" do
|
|
||||||
within current_element do
|
|
||||||
expect(page).to have_text(translated_content)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'having translated content in the page title' do
|
|
||||||
it 'shows the translated content' do
|
|
||||||
expect(page).to have_title(translated_content)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'displaying the current language' do
|
|
||||||
it 'shows the current language' do
|
|
||||||
within :active_content do
|
|
||||||
within '.page-content' do
|
|
||||||
expect(page).to have_field(with: full_current_locale)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_examples 'have translations in ticket page' do |translated_element|
|
|
||||||
it_behaves_like 'having translated content in the page title'
|
|
||||||
|
|
||||||
context 'when translated content is ticket priority' do
|
|
||||||
let(:translated_content) { priority }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', translated_element
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when translated content is ticket owner' do
|
|
||||||
let(:translated_content) { owner }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', translated_element
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when translated content is ticket title' do
|
|
||||||
let(:translated_content) { title }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', :active_content
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when user locale is English (en-gb)', authenticated_as: :session_user do
|
|
||||||
let(:locale) { 'en-gb' }
|
|
||||||
let(:translated_content) { 'Overview' }
|
|
||||||
let(:full_current_locale) { 'English (Great Britain)' }
|
|
||||||
let(:priority) { 'PRIORITY' }
|
|
||||||
let(:owner) { 'OWNER' }
|
|
||||||
|
|
||||||
before { visit path }
|
|
||||||
|
|
||||||
it_behaves_like 'displaying the current language'
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', '.js-menu'
|
|
||||||
|
|
||||||
context 'when profile language is changed' do
|
|
||||||
let(:new_locale) { 'de-de' }
|
|
||||||
let(:full_current_locale) { 'Deutsch' }
|
|
||||||
|
|
||||||
before do
|
|
||||||
within :active_content do
|
|
||||||
within '.page-content' do
|
|
||||||
find('input.searchableSelect-main.js-input').click
|
|
||||||
find("[data-value=#{new_locale}].js-option").click
|
|
||||||
|
|
||||||
click_button
|
|
||||||
session_user.reload
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'changes the user preference language' do
|
|
||||||
expect(session_user.preferences[:locale]).to eq(new_locale)
|
|
||||||
end
|
|
||||||
|
|
||||||
it_behaves_like 'displaying the current language'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with language page visited' do
|
|
||||||
let(:translated_content) { 'Language' }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', '.page-header'
|
|
||||||
it_behaves_like 'having translated content in', '.sidebar.NavBarProfile'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with dashboard page visited' do
|
|
||||||
let(:path) { 'dashboard' }
|
|
||||||
let(:translated_content) { 'My Stats' }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', :active_content
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with overview page visited' do
|
|
||||||
let(:path) { 'ticket/view' }
|
|
||||||
let(:translated_content) { 'My assigned Tickets' }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in the page title'
|
|
||||||
it_behaves_like 'having translated content in', :active_content
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with drafted ticket create' do
|
|
||||||
let(:path) { 'ticket/create' }
|
|
||||||
let(:title) { 'preferences lang check #1' }
|
|
||||||
let(:customer) { 'nicole' }
|
|
||||||
let(:translated_content) { "Call Inbound: #{title}" }
|
|
||||||
|
|
||||||
translated_element = '.newTicket .ticket-create'
|
|
||||||
|
|
||||||
before do
|
|
||||||
fill_in 'title', with: title
|
|
||||||
fill_in 'customer_id_completion', with: customer
|
|
||||||
send_keys(:enter, :tab)
|
|
||||||
find('[data-name="body"]').set(title)
|
|
||||||
select 'Users', from: 'group_id'
|
|
||||||
end
|
|
||||||
|
|
||||||
include_examples 'have translations in ticket page', translated_element
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with ticket zoom page' do
|
|
||||||
let(:path) { "ticket/zoom/#{ticket.id}" }
|
|
||||||
let(:title) { 'preferences lang check #2' }
|
|
||||||
let(:translated_content) { title }
|
|
||||||
let(:user_group) { Group.lookup(name: 'Users') }
|
|
||||||
let(:ticket) { create(:ticket, group: user_group, title: title) }
|
|
||||||
|
|
||||||
translated_element = '.content.active .sidebar-content'
|
|
||||||
|
|
||||||
include_examples 'have translations in ticket page', translated_element
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when user locale is Deutsch', authenticated_as: :session_user do
|
|
||||||
let(:locale) { 'de-de' }
|
|
||||||
let(:translated_content) { 'Übersichten' }
|
|
||||||
let(:full_current_locale) { 'Deutsch' }
|
|
||||||
let(:priority) { 'PRIORITÄT' }
|
|
||||||
let(:owner) { 'BESITZER' }
|
|
||||||
|
|
||||||
before { visit path }
|
|
||||||
|
|
||||||
it_behaves_like 'displaying the current language'
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', '.js-menu'
|
|
||||||
|
|
||||||
context 'when profile language is changed' do
|
|
||||||
let(:new_locale) { 'en-gb' }
|
|
||||||
let(:full_current_locale) { 'English (Great Britain)' }
|
|
||||||
let(:translated_content) { 'Übersichten' }
|
|
||||||
|
|
||||||
before do
|
|
||||||
within :active_content do
|
|
||||||
within '.page-content' do
|
|
||||||
find('input.searchableSelect-main.js-input').click
|
|
||||||
find("[data-value=#{new_locale}].js-option").click
|
|
||||||
|
|
||||||
click_button
|
|
||||||
session_user.reload
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'changes the user preference language' do
|
|
||||||
expect(session_user.preferences[:locale]).to eq(new_locale)
|
|
||||||
end
|
|
||||||
|
|
||||||
it_behaves_like 'displaying the current language'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with language page visited' do
|
|
||||||
let(:translated_content) { 'Sprache' }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', '.page-header'
|
|
||||||
it_behaves_like 'having translated content in', '.sidebar.NavBarProfile'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with dashboard page visited' do
|
|
||||||
let(:path) { 'dashboard' }
|
|
||||||
let(:translated_content) { 'Meine Statistik' }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in', :active_content
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with overview page visited' do
|
|
||||||
let(:path) { 'ticket/view' }
|
|
||||||
let(:translated_content) { 'Meine zugewiesenen Tickets' }
|
|
||||||
|
|
||||||
it_behaves_like 'having translated content in the page title'
|
|
||||||
it_behaves_like 'having translated content in', :active_content
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with drafted ticket create' do
|
|
||||||
let(:path) { 'ticket/create' }
|
|
||||||
let(:title) { 'preferences lang check #1' }
|
|
||||||
let(:customer) { 'nicole' }
|
|
||||||
let(:translated_content) { "Anruf eingehend: #{title}" }
|
|
||||||
|
|
||||||
translated_element = '.newTicket .ticket-create'
|
|
||||||
|
|
||||||
before do
|
|
||||||
fill_in 'title', with: title
|
|
||||||
fill_in 'customer_id_completion', with: customer
|
|
||||||
send_keys(:enter, :tab)
|
|
||||||
find('[data-name="body"]').set(title)
|
|
||||||
select 'Users', from: 'group_id'
|
|
||||||
end
|
|
||||||
|
|
||||||
include_examples 'have translations in ticket page', translated_element
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with ticket zoom page' do
|
|
||||||
let(:path) { "ticket/zoom/#{ticket.id}" }
|
|
||||||
let(:title) { 'preferences lang check #2' }
|
|
||||||
let(:translated_content) { title }
|
|
||||||
let(:user_group) { Group.lookup(name: 'Users') }
|
|
||||||
let(:ticket) { create(:ticket, group: user_group, title: title) }
|
|
||||||
|
|
||||||
translated_element = '.content.active .sidebar-content'
|
|
||||||
|
|
||||||
include_examples 'have translations in ticket page', translated_element
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,86 +0,0 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe 'Caller log', type: :system, authenticated_as: :agent do
|
|
||||||
let(:agent_phone) { '0190111' }
|
|
||||||
let(:customer_phone) { '0190333' }
|
|
||||||
let(:agent) { create(:agent, phone: agent_phone) }
|
|
||||||
let(:customer) { create(:customer, phone: customer_phone) }
|
|
||||||
let(:sipgate_on) { true }
|
|
||||||
|
|
||||||
let(:params) do
|
|
||||||
{
|
|
||||||
direction: 'in',
|
|
||||||
from: customer.phone,
|
|
||||||
to: agent_phone,
|
|
||||||
callId: '111',
|
|
||||||
cause: 'busy',
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:first_params) { params.merge(event: 'newCall') }
|
|
||||||
let(:second_params) { params.merge(event: 'hangup') }
|
|
||||||
|
|
||||||
let(:place_call) do
|
|
||||||
post "#{Capybara.app_host}/api/v1/sipgate/in", params: first_params
|
|
||||||
post "#{Capybara.app_host}/api/v1/sipgate/in", params: second_params
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:prepare) do
|
|
||||||
Setting.set('sipgate_integration', sipgate_on)
|
|
||||||
end
|
|
||||||
|
|
||||||
before { prepare }
|
|
||||||
|
|
||||||
context 'when sipgate integration is on' do
|
|
||||||
it 'shows the phone menu in nav bar' do
|
|
||||||
|
|
||||||
within '#navigation .menu' do
|
|
||||||
expect(page).to have_link('Phone', href: '#cti')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when sipgate integration is not on' do
|
|
||||||
let(:sipgate_on) { false }
|
|
||||||
|
|
||||||
it 'does not show the phone menu in nav bar' do
|
|
||||||
|
|
||||||
within '#navigation .menu' do
|
|
||||||
expect(page).to have_no_link('Phone', href: '#cti')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with incoming call' do
|
|
||||||
before do
|
|
||||||
visit 'cti'
|
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'increments the call counter notification badge' do
|
|
||||||
within '[href="#cti"].js-phoneMenuItem' do
|
|
||||||
counter = find('.counter')
|
|
||||||
expect(counter).to have_content 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when incoming call is checked' do
|
|
||||||
before do
|
|
||||||
visit 'cti'
|
|
||||||
place_call
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'clears the call counter notification badge' do
|
|
||||||
within :active_content do
|
|
||||||
find('.table-checkbox input.js-check', visible: :all).check allow_label_click: true
|
|
||||||
end
|
|
||||||
|
|
||||||
within '[href="#cti"].js-phoneMenuItem' do
|
|
||||||
expect(page).to have_no_selector('.counter')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe 'System > Monitoring', type: :system do
|
|
||||||
|
|
||||||
context 'when showing the token' do
|
|
||||||
it 'works correctly' do
|
|
||||||
visit 'system/monitoring'
|
|
||||||
|
|
||||||
within :active_content do
|
|
||||||
token = find('.js-token').value
|
|
||||||
url = find('.js-url').value
|
|
||||||
expect(url).to include(token)
|
|
||||||
|
|
||||||
click '.js-resetToken'
|
|
||||||
new_token = find('.js-token').value
|
|
||||||
new_url = find('.js-url').value
|
|
||||||
expect(new_url).to include(new_token)
|
|
||||||
expect(token).not_to eq(new_token)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -535,7 +535,8 @@ RSpec.describe 'Ticket Create', type: :system do
|
||||||
let(:customer) { create(:customer, password: 'test') }
|
let(:customer) { create(:customer, password: 'test') }
|
||||||
|
|
||||||
it 'customer user should not have agent object attributes', authenticated_as: :agent do
|
it 'customer user should not have agent object attributes', authenticated_as: :agent do
|
||||||
# Log out again, so that we can execute the next login.
|
visit 'ticket/create'
|
||||||
|
|
||||||
logout
|
logout
|
||||||
|
|
||||||
# Re-create agent session and fetch object attributes.
|
# Re-create agent session and fetch object attributes.
|
||||||
|
@ -562,25 +563,6 @@ RSpec.describe 'Ticket Create', type: :system do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when state options have a special translation', authenticated_as: :authenticate do
|
|
||||||
let(:admin_de) { create(:admin, preferences: { locale: 'de-de' }) }
|
|
||||||
|
|
||||||
context 'when translated state option has a single quote' do
|
|
||||||
def authenticate
|
|
||||||
open_tranlation = Translation.where(locale: 'de-de', source: 'open')
|
|
||||||
open_tranlation.update(target: "off'en")
|
|
||||||
|
|
||||||
admin_de
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'shows the translated state options correctly' do
|
|
||||||
visit 'ticket/create'
|
|
||||||
|
|
||||||
expect(page).to have_select('state_id', with_options: ["off'en"])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'It should be possible to show attributes which are configured shown false #3726', authenticated_as: :authenticate, db_strategy: :reset do
|
describe 'It should be possible to show attributes which are configured shown false #3726', authenticated_as: :authenticate, db_strategy: :reset do
|
||||||
let(:field_name) { SecureRandom.uuid }
|
let(:field_name) { SecureRandom.uuid }
|
||||||
let(:field) do
|
let(:field) do
|
||||||
|
|
180
test/browser/admin_channel_email_test.rb
Normal file
180
test/browser/admin_channel_email_test.rb
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class AdminChannelEmailTest < TestCase
|
||||||
|
def test_account_add
|
||||||
|
|
||||||
|
if !ENV['MAILBOX_INIT']
|
||||||
|
# raise "Need MAILBOX_INIT as ENV variable like export MAILBOX_INIT='unittest01@znuny.com:somepass'"
|
||||||
|
puts "NOTICE: Need MAILBOX_INIT as ENV variable like export MAILBOX_INIT='unittest01@znuny.com:somepass'"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
mailbox_user = ENV['MAILBOX_INIT'].split(':')[0]
|
||||||
|
mailbox_password = ENV['MAILBOX_INIT'].split(':')[1]
|
||||||
|
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: '.content.active a[href="#channels/email"]')
|
||||||
|
|
||||||
|
# check if postmaster filter are shown
|
||||||
|
click(css: '.content.active a[href="#c-filter"]')
|
||||||
|
match(
|
||||||
|
css: '.content.active #c-filter .overview',
|
||||||
|
value: 'No Entries',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check if signatures are shown
|
||||||
|
click(css: '.content.active a[href="#c-signature"]')
|
||||||
|
match(
|
||||||
|
css: '.content.active #c-signature .overview',
|
||||||
|
value: 'default',
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: '.content.active a[href="#c-account"]')
|
||||||
|
click(css: '.content.active .js-channelNew')
|
||||||
|
|
||||||
|
modal_ready
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="realname"]',
|
||||||
|
value: 'My System',
|
||||||
|
)
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="email"]',
|
||||||
|
value: mailbox_user,
|
||||||
|
)
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="password"]',
|
||||||
|
value: mailbox_password,
|
||||||
|
)
|
||||||
|
select(
|
||||||
|
css: '.modal select[name="group_id"]',
|
||||||
|
value: 'Users',
|
||||||
|
)
|
||||||
|
click(css: '.modal button.js-submit')
|
||||||
|
sleep 4
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: '.modal',
|
||||||
|
value: '(already exists|unknown mailbox)',
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: '.modal .js-close')
|
||||||
|
|
||||||
|
# delete all channels
|
||||||
|
loop do
|
||||||
|
break if !@browser.find_elements(css: '.content.active .js-channelDelete')[0]
|
||||||
|
|
||||||
|
click(css: '.content.active .js-channelDelete')
|
||||||
|
sleep 2
|
||||||
|
# flanky
|
||||||
|
click(css: '.modal .js-submit')
|
||||||
|
sleep 2
|
||||||
|
end
|
||||||
|
|
||||||
|
# re-create
|
||||||
|
click(css: '.content.active .js-channelNew')
|
||||||
|
|
||||||
|
modal_ready
|
||||||
|
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="realname"]',
|
||||||
|
value: 'My System',
|
||||||
|
)
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="email"]',
|
||||||
|
value: mailbox_user,
|
||||||
|
)
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="password"]',
|
||||||
|
value: mailbox_password,
|
||||||
|
)
|
||||||
|
select(
|
||||||
|
css: '.modal select[name="group_id"]',
|
||||||
|
value: 'Users',
|
||||||
|
)
|
||||||
|
click(css: '.modal button.js-submit')
|
||||||
|
modal_disappear(timeout: 20)
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: mailbox_user,
|
||||||
|
)
|
||||||
|
|
||||||
|
# set invalid folder
|
||||||
|
click(css: '.content.active .js-editInbound')
|
||||||
|
|
||||||
|
modal_ready
|
||||||
|
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="options::folder"]',
|
||||||
|
value: 'not_existing_folder',
|
||||||
|
)
|
||||||
|
click(css: '.modal .js-inbound button.js-submit')
|
||||||
|
watch_for(
|
||||||
|
css: '.modal',
|
||||||
|
value: 'Mailbox doesn\'t exist',
|
||||||
|
)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
# test the creation and cloning of Postmaster filters
|
||||||
|
# confirm fix for issue #2170 - Cannot clone PostmasterFilter
|
||||||
|
def test_filter_clone
|
||||||
|
filter_name = "Test Filter #{SecureRandom.uuid}"
|
||||||
|
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: '.content.active a[href="#channels/email"]')
|
||||||
|
|
||||||
|
click(css: '.content.active a[href="#c-filter"]')
|
||||||
|
|
||||||
|
# create a new email filter
|
||||||
|
click(css: '.content.active a[data-type="new"]')
|
||||||
|
|
||||||
|
modal_ready
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="name"]',
|
||||||
|
value: filter_name,
|
||||||
|
)
|
||||||
|
set(
|
||||||
|
css: '.modal input[name="match::from::value"]',
|
||||||
|
value: 'target',
|
||||||
|
)
|
||||||
|
click(css: '.modal .js-submit')
|
||||||
|
modal_disappear
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active .table',
|
||||||
|
value: filter_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
# now clone filter that we just created
|
||||||
|
click(css: '.content.active .table .dropdown .btn--table')
|
||||||
|
click(css: '.content.active .table .dropdown .js-clone')
|
||||||
|
|
||||||
|
modal_ready
|
||||||
|
click(css: '.modal .js-submit')
|
||||||
|
modal_disappear
|
||||||
|
|
||||||
|
# confirm the clone exists in the table
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active .table',
|
||||||
|
value: "Clone: #{filter_name}",
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
68
test/browser/admin_permissions_granular_vs_full_test.rb
Normal file
68
test/browser/admin_permissions_granular_vs_full_test.rb
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class AdminPermissionsGranularVsFullTest < TestCase
|
||||||
|
def test_permissions_selecting
|
||||||
|
new_group_name = "permissions_test_group#{SecureRandom.uuid}"
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: '.content.active a[href="#manage/groups"]')
|
||||||
|
click(css: '.content.active a[data-type="new"]')
|
||||||
|
|
||||||
|
modal_ready
|
||||||
|
|
||||||
|
element = @browser.find_element(css: '.modal input[name=name]')
|
||||||
|
element.clear
|
||||||
|
element.send_keys(new_group_name)
|
||||||
|
click(css: '.modal button.js-submit')
|
||||||
|
modal_disappear
|
||||||
|
|
||||||
|
click(css: '.content.active a[href="#manage/users"]')
|
||||||
|
|
||||||
|
user_css = '.user-list .js-tableBody tr td'
|
||||||
|
watch_for(css: user_css)
|
||||||
|
@browser.find_elements(css: '.content.active .user-list td:first-child').each do |entry|
|
||||||
|
next if entry.text.strip != 'admin@example.com'
|
||||||
|
|
||||||
|
entry.click
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
modal_ready
|
||||||
|
|
||||||
|
scroll_script = "var el = document.getElementsByClassName('modal')[0];"
|
||||||
|
scroll_script += 'el.scrollTo(0, el.scrollHeight);'
|
||||||
|
@browser.execute_script scroll_script
|
||||||
|
|
||||||
|
group = @browser.find_elements(css: '.modal .settings-list tbody tr').find do |el|
|
||||||
|
el.find_element(css: 'td').text == new_group_name
|
||||||
|
end
|
||||||
|
|
||||||
|
if !group
|
||||||
|
screenshot(comment: 'group_not_found')
|
||||||
|
raise "Can't find group #{new_group_name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
toggle_checkbox(group, 'full')
|
||||||
|
sleep(1)
|
||||||
|
assert(checkbox_is_selected(group, 'full'))
|
||||||
|
|
||||||
|
toggle_checkbox(group, 'read')
|
||||||
|
sleep(1)
|
||||||
|
assert(!checkbox_is_selected(group, 'full'))
|
||||||
|
assert(checkbox_is_selected(group, 'read'))
|
||||||
|
|
||||||
|
toggle_checkbox(group, 'full')
|
||||||
|
sleep(1)
|
||||||
|
assert(checkbox_is_selected(group, 'full'))
|
||||||
|
assert(!checkbox_is_selected(group, 'read'))
|
||||||
|
end
|
||||||
|
end
|
89
test/browser/auth_test.rb
Normal file
89
test/browser/auth_test.rb
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class AuthTest < TestCase
|
||||||
|
def test_authentication
|
||||||
|
@browser = browser_instance
|
||||||
|
location(url: browser_url)
|
||||||
|
match(
|
||||||
|
css: '#login',
|
||||||
|
value: 'username',
|
||||||
|
)
|
||||||
|
click(css: '#login button')
|
||||||
|
|
||||||
|
sleep 4
|
||||||
|
match(
|
||||||
|
css: '#login',
|
||||||
|
value: 'username',
|
||||||
|
)
|
||||||
|
|
||||||
|
# login with username/password
|
||||||
|
login(
|
||||||
|
username: 'nicole.braun@zammad.org',
|
||||||
|
password: 'test',
|
||||||
|
)
|
||||||
|
tasks_close_all
|
||||||
|
|
||||||
|
# reload page
|
||||||
|
reload
|
||||||
|
|
||||||
|
# check if cookie is temporarily
|
||||||
|
watch_for(
|
||||||
|
css: 'body',
|
||||||
|
value: 'Overviews',
|
||||||
|
)
|
||||||
|
|
||||||
|
# verify session cookie
|
||||||
|
cookie(
|
||||||
|
name: '^_zammad.+?',
|
||||||
|
value: '.+?',
|
||||||
|
expires: '',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_authentication_new_browser_without_permanent_cookie_no_session_should_be
|
||||||
|
@browser = browser_instance
|
||||||
|
location(url: browser_url)
|
||||||
|
match(
|
||||||
|
css: '#login',
|
||||||
|
value: 'username',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_new_browser_with_permanent_cookie_login
|
||||||
|
@browser = browser_instance
|
||||||
|
location(url: browser_url)
|
||||||
|
|
||||||
|
# login with username/password
|
||||||
|
login(
|
||||||
|
username: 'nicole.braun@zammad.org',
|
||||||
|
password: 'test',
|
||||||
|
remember_me: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
# check if cookie is temporarily
|
||||||
|
watch_for(
|
||||||
|
css: 'body',
|
||||||
|
value: 'Overviews',
|
||||||
|
)
|
||||||
|
|
||||||
|
# verify session cookie
|
||||||
|
cookie(
|
||||||
|
name: '^_zammad.+?',
|
||||||
|
value: '.+?',
|
||||||
|
expires: '\d{4}-\d{1,2}-\d{1,2}.+?',
|
||||||
|
)
|
||||||
|
|
||||||
|
logout
|
||||||
|
|
||||||
|
# verify session cookie
|
||||||
|
sleep 2
|
||||||
|
cookie(
|
||||||
|
name: '^_zammad.+?',
|
||||||
|
value: '.+?',
|
||||||
|
expires: '',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
293
test/browser/integration_cti_test.rb
Normal file
293
test/browser/integration_cti_test.rb
Normal file
|
@ -0,0 +1,293 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class IntegrationCtiTest < TestCase
|
||||||
|
setup do
|
||||||
|
if !ENV['CTI_TOKEN']
|
||||||
|
raise "ERROR: Need CTI_TOKEN - hint CTI_TOKEN='some_token'"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
# Regression test for #2017
|
||||||
|
def test_nav_menu_notification_badge_clears
|
||||||
|
id = SecureRandom.uuid
|
||||||
|
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: 'a[href="#system/integration"]')
|
||||||
|
click(css: 'a[href="#system/integration/cti"]')
|
||||||
|
|
||||||
|
switch(
|
||||||
|
css: '.content.active .js-switch',
|
||||||
|
type: 'on'
|
||||||
|
)
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: 'a[href="#cti"]',
|
||||||
|
timeout: 4,
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#cti"]')
|
||||||
|
|
||||||
|
call_counter = @browser.find_elements(css: '.js-phoneMenuItem .counter')
|
||||||
|
.first&.text.to_i
|
||||||
|
|
||||||
|
# simulate cti callbacks
|
||||||
|
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
|
||||||
|
params = {
|
||||||
|
direction: 'in',
|
||||||
|
from: '491715000002',
|
||||||
|
to: '4930600000000',
|
||||||
|
callId: "4991155921769858278-#{id}",
|
||||||
|
cause: 'busy'
|
||||||
|
}
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
|
||||||
|
|
||||||
|
# flanky
|
||||||
|
watch_for(
|
||||||
|
css: '.js-phoneMenuItem .counter',
|
||||||
|
value: (call_counter + 1).to_s,
|
||||||
|
timeout: 4,
|
||||||
|
)
|
||||||
|
|
||||||
|
check(css: '.content.active .table-checkbox input')
|
||||||
|
|
||||||
|
watch_for_disappear(
|
||||||
|
css: '.js-phoneMenuItem .counter',
|
||||||
|
timeout: 15,
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: 'a[href="#system/integration"]')
|
||||||
|
click(css: 'a[href="#system/integration/cti"]')
|
||||||
|
|
||||||
|
switch(
|
||||||
|
css: '.content.active .js-switch',
|
||||||
|
type: 'off'
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Regression test for #2018
|
||||||
|
def test_e164_numbers_displayed_in_prettified_format
|
||||||
|
id = SecureRandom.uuid
|
||||||
|
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: 'a[href="#system/integration"]')
|
||||||
|
click(css: 'a[href="#system/integration/cti"]')
|
||||||
|
|
||||||
|
switch(
|
||||||
|
css: '.content.active .js-switch',
|
||||||
|
type: 'on'
|
||||||
|
)
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: 'a[href="#cti"]'
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#cti"]')
|
||||||
|
|
||||||
|
# simulate cti callbacks...
|
||||||
|
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
|
||||||
|
|
||||||
|
# ...for private network number
|
||||||
|
params = {
|
||||||
|
direction: 'in',
|
||||||
|
from: '007',
|
||||||
|
to: '008',
|
||||||
|
callId: "4991155921769858278-#{id}",
|
||||||
|
cause: 'busy'
|
||||||
|
}
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
|
||||||
|
|
||||||
|
# ...for e164 number
|
||||||
|
params = {
|
||||||
|
direction: 'in',
|
||||||
|
from: '4930609854180',
|
||||||
|
to: '4930609811111',
|
||||||
|
callId: "4991155921769858278-#{id.next}",
|
||||||
|
cause: 'busy'
|
||||||
|
}
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
|
||||||
|
|
||||||
|
# view caller log
|
||||||
|
click(css: 'a[href="#cti"]')
|
||||||
|
|
||||||
|
# assertion: private network numbers appear verbatim
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active .js-callerLog',
|
||||||
|
value: '007',
|
||||||
|
timeout: 3,
|
||||||
|
)
|
||||||
|
|
||||||
|
match(
|
||||||
|
css: '.content.active .js-callerLog',
|
||||||
|
value: '008',
|
||||||
|
)
|
||||||
|
|
||||||
|
# assertion: E164 numbers appear prettified
|
||||||
|
match(
|
||||||
|
css: '.content.active .js-callerLog',
|
||||||
|
value: '+49 30 609854180',
|
||||||
|
)
|
||||||
|
|
||||||
|
match(
|
||||||
|
css: '.content.active .js-callerLog',
|
||||||
|
value: '+49 30 609811111',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Regression test for #2096
|
||||||
|
def test_inactive_users_displayed_inactive_in_caller_log
|
||||||
|
id = SecureRandom.uuid
|
||||||
|
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
# create inactive user with phone number (via API)
|
||||||
|
user_create(
|
||||||
|
data: {
|
||||||
|
login: 'test_user',
|
||||||
|
firstname: 'John',
|
||||||
|
lastname: 'Doe',
|
||||||
|
phone: '1234567890',
|
||||||
|
active: false,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
# enable CTI
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: 'a[href="#system/integration"]')
|
||||||
|
click(css: 'a[href="#system/integration/cti"]')
|
||||||
|
|
||||||
|
switch(
|
||||||
|
css: '.content.active .js-switch',
|
||||||
|
type: 'on'
|
||||||
|
)
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: 'a[href="#cti"]'
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#cti"]')
|
||||||
|
|
||||||
|
# simulate CTI callback to/from inactive user
|
||||||
|
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
|
||||||
|
params = {
|
||||||
|
direction: 'in',
|
||||||
|
from: '1234567890',
|
||||||
|
to: '1234567890',
|
||||||
|
callId: "4991155921769858278-#{id}",
|
||||||
|
cause: 'busy'
|
||||||
|
}
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
|
||||||
|
|
||||||
|
# view caller log
|
||||||
|
click(css: 'a[href="#cti"]')
|
||||||
|
|
||||||
|
# assertion: names appear in inactive
|
||||||
|
match(
|
||||||
|
css: 'span.avatar--inactive',
|
||||||
|
value: 'JD',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Regression test for #2075
|
||||||
|
def test_caller_ids_include_organization_names
|
||||||
|
id = SecureRandom.uuid
|
||||||
|
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
# create user with organization (via API)
|
||||||
|
user_create(
|
||||||
|
data: {
|
||||||
|
login: 'test_user',
|
||||||
|
firstname: 'John',
|
||||||
|
lastname: 'Doe',
|
||||||
|
phone: '1234567890',
|
||||||
|
organization: 'Zammad Foundation'
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
# enable CTI
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: 'a[href="#system/integration"]')
|
||||||
|
click(css: 'a[href="#system/integration/cti"]')
|
||||||
|
|
||||||
|
switch(
|
||||||
|
css: '.content.active .js-switch',
|
||||||
|
type: 'on'
|
||||||
|
)
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: 'a[href="#cti"]'
|
||||||
|
)
|
||||||
|
|
||||||
|
# view caller log
|
||||||
|
click(css: 'a[href="#cti"]')
|
||||||
|
|
||||||
|
# simulate CTI callbacks to/from target user
|
||||||
|
url = URI.join(browser_url, "api/v1/cti/#{ENV['CTI_TOKEN']}")
|
||||||
|
params = {
|
||||||
|
direction: 'out',
|
||||||
|
from: '1234567890',
|
||||||
|
to: '1234567890',
|
||||||
|
callId: "4991155921769858278-#{id}",
|
||||||
|
cause: 'busy'
|
||||||
|
}
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
|
||||||
|
|
||||||
|
params = {
|
||||||
|
direction: 'in',
|
||||||
|
from: '1234567890',
|
||||||
|
to: '1234567890',
|
||||||
|
callId: "4991155921769858278-#{id.next}",
|
||||||
|
cause: 'busy'
|
||||||
|
}
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: '.js-callerLog tr:nth-of-type(2)'
|
||||||
|
)
|
||||||
|
|
||||||
|
# assertions: Caller ID includes user organization
|
||||||
|
match(
|
||||||
|
css: '.js-callerLog tr:first-of-type div.user-popover',
|
||||||
|
value: 'John Doe (Zammad Foundation)',
|
||||||
|
)
|
||||||
|
|
||||||
|
match(
|
||||||
|
css: '.js-callerLog tr:last-of-type div.user-popover',
|
||||||
|
value: 'John Doe (Zammad Foundation)',
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
71
test/browser/integration_sipgate_test.rb
Normal file
71
test/browser/integration_sipgate_test.rb
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class IntegrationSipgateTest < TestCase
|
||||||
|
# Regression test for #2017
|
||||||
|
def test_nav_menu_notification_badge_clears
|
||||||
|
id = SecureRandom.uuid
|
||||||
|
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: 'a[href="#system/integration"]')
|
||||||
|
click(css: 'a[href="#system/integration/sipgate"]')
|
||||||
|
|
||||||
|
switch(
|
||||||
|
css: '.content.active .js-switch',
|
||||||
|
type: 'on'
|
||||||
|
)
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: 'a[href="#cti"]',
|
||||||
|
timeout: 4,
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#cti"]')
|
||||||
|
|
||||||
|
call_counter = @browser.find_elements(css: '.js-phoneMenuItem .counter')
|
||||||
|
.first&.text.to_i
|
||||||
|
|
||||||
|
# simulate cti callbacks
|
||||||
|
url = URI.join(browser_url, 'api/v1/sipgate/in')
|
||||||
|
params = {
|
||||||
|
direction: 'in',
|
||||||
|
from: '491715000003',
|
||||||
|
to: '4930600000004',
|
||||||
|
callId: "4991155921769858279-#{id}",
|
||||||
|
cause: 'busy'
|
||||||
|
}
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'newCall'))
|
||||||
|
Net::HTTP.post_form(url, params.merge(event: 'hangup'))
|
||||||
|
|
||||||
|
# flanky
|
||||||
|
watch_for(
|
||||||
|
css: '.js-phoneMenuItem .counter',
|
||||||
|
value: (call_counter + 1).to_s,
|
||||||
|
timeout: 4,
|
||||||
|
)
|
||||||
|
|
||||||
|
check(css: '.content.active .table-checkbox input')
|
||||||
|
|
||||||
|
watch_for_disappear(
|
||||||
|
css: '.js-phoneMenuItem .counter',
|
||||||
|
timeout: 6,
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: 'a[href="#system/integration"]')
|
||||||
|
click(css: 'a[href="#system/integration/sipgate"]')
|
||||||
|
|
||||||
|
switch(
|
||||||
|
css: '.content.active .js-switch',
|
||||||
|
type: 'off'
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
|
@ -221,9 +221,10 @@ class KeyboardShortcutsTest < TestCase
|
||||||
|
|
||||||
shortcut(key: 'e')
|
shortcut(key: 'e')
|
||||||
watch_for(
|
watch_for(
|
||||||
css: '#login',
|
css: 'body',
|
||||||
value: 'username',
|
value: 'login',
|
||||||
timeout: 4,
|
timeout: 4,
|
||||||
)
|
)
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
44
test/browser/monitoring_test.rb
Normal file
44
test/browser/monitoring_test.rb
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class MonitoringTest < TestCase
|
||||||
|
|
||||||
|
def test_mode
|
||||||
|
browser1 = browser_instance
|
||||||
|
login(
|
||||||
|
browser: browser1,
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
click(
|
||||||
|
browser: browser1,
|
||||||
|
css: 'a[href="#manage"]',
|
||||||
|
)
|
||||||
|
click(
|
||||||
|
browser: browser1,
|
||||||
|
css: 'a[href="#system/monitoring"]',
|
||||||
|
)
|
||||||
|
|
||||||
|
token = browser1.find_elements(css: '.active.content .js-token')[0].attribute('value')
|
||||||
|
url = browser1.find_elements(css: '.active.content .js-url')[0].attribute('value')
|
||||||
|
|
||||||
|
assert_match(token.to_s, url)
|
||||||
|
|
||||||
|
click(
|
||||||
|
browser: browser1,
|
||||||
|
css: '.active.content .js-resetToken',
|
||||||
|
)
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
token_new = browser1.find_elements(css: '.active.content .js-token')[0].attribute('value')
|
||||||
|
url_new = browser1.find_elements(css: '.active.content .js-url')[0].attribute('value')
|
||||||
|
|
||||||
|
assert_not_equal(token, token_new)
|
||||||
|
assert_not_equal(url, url_new)
|
||||||
|
assert_match(token_new.to_s, url_new)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
337
test/browser/preferences_language_test.rb
Normal file
337
test/browser/preferences_language_test.rb
Normal file
|
@ -0,0 +1,337 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class PreferencesLanguageTest < TestCase
|
||||||
|
|
||||||
|
def test_lang_change
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all
|
||||||
|
|
||||||
|
# start ticket create
|
||||||
|
ticket_create(
|
||||||
|
data: {
|
||||||
|
customer: 'nicole',
|
||||||
|
group: 'Users',
|
||||||
|
title: 'preferences lang check #1',
|
||||||
|
body: 'preferences lang check #1',
|
||||||
|
},
|
||||||
|
do_not_submit: true,
|
||||||
|
)
|
||||||
|
|
||||||
|
# start ticket zoom
|
||||||
|
ticket_create(
|
||||||
|
data: {
|
||||||
|
customer: 'nicole',
|
||||||
|
group: 'Users',
|
||||||
|
title: 'preferences lang check #2',
|
||||||
|
body: 'preferences lang check #2',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
# start user profile
|
||||||
|
user_open_by_search(
|
||||||
|
value: 'Nicole',
|
||||||
|
)
|
||||||
|
|
||||||
|
# start organization profile
|
||||||
|
organization_open_by_search(
|
||||||
|
value: 'Zammad Foundation',
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#current_user"]')
|
||||||
|
click(css: 'a[href="#profile"]')
|
||||||
|
click(css: 'a[href="#profile/language"]')
|
||||||
|
select(
|
||||||
|
css: '.js-language [name="locale"]',
|
||||||
|
value: 'Deutsch',
|
||||||
|
)
|
||||||
|
click(css: '.content.active button[type="submit"]')
|
||||||
|
watch_for(
|
||||||
|
css: 'body',
|
||||||
|
value: 'Sprache',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in navbar
|
||||||
|
watch_for(
|
||||||
|
css: '.js-menu',
|
||||||
|
value: 'Übersicht'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in dashboard
|
||||||
|
click(css: '.js-menu a[href="#dashboard"]')
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'Meine Statistik'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in overview
|
||||||
|
click(css: '.js-menu a[href="#ticket/view"]')
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'Meine'
|
||||||
|
)
|
||||||
|
verify_title(
|
||||||
|
value: 'Meine zugewiesenen',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in ticket create
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'Anruf',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
verify_task(
|
||||||
|
data: {
|
||||||
|
title: 'Anruf',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'preferences lang check #1',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'kunde'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'priorität'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active [data-name="body"]',
|
||||||
|
value: 'preferences lang check #1'
|
||||||
|
)
|
||||||
|
verify_title(
|
||||||
|
value: 'anruf',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in ticket zoom
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'preferences lang check #2',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'erstellt'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'priorität'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in user profile
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'Nicole',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'notiz'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'e-mail'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'aktion'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in organization profile
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'Zammad',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'notiz'
|
||||||
|
)
|
||||||
|
|
||||||
|
click(css: 'a[href="#current_user"]')
|
||||||
|
click(css: 'a[href="#profile"]')
|
||||||
|
click(css: 'a[href="#profile/language"]')
|
||||||
|
select(
|
||||||
|
css: '.js-language [name="locale"]',
|
||||||
|
value: 'English (United States)',
|
||||||
|
)
|
||||||
|
click(css: '.content.active button[type="submit"]')
|
||||||
|
sleep 2
|
||||||
|
watch_for(
|
||||||
|
css: 'body',
|
||||||
|
value: 'Language',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in navbar
|
||||||
|
watch_for(
|
||||||
|
css: '.js-menu',
|
||||||
|
value: 'Overview'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in dashboard
|
||||||
|
click(css: '.js-menu a[href="#dashboard"]')
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'My Stats'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in overview
|
||||||
|
click(css: '.js-menu a[href="#ticket/view"]')
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'My'
|
||||||
|
)
|
||||||
|
verify_title(
|
||||||
|
value: 'My assig',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in ticket create
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'Call',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
verify_task(
|
||||||
|
data: {
|
||||||
|
title: 'Call',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'preferences lang check #1',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'customer'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'priority'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active [data-name="body"]',
|
||||||
|
value: 'preferences lang check #1'
|
||||||
|
)
|
||||||
|
verify_title(
|
||||||
|
value: 'call',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in ticket zoom
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'preferences lang check #2',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'create'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'priority'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in user profile
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'Nicole',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'note'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'email'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in organization profile
|
||||||
|
open_task(
|
||||||
|
data: {
|
||||||
|
title: 'Zammad',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'note'
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'action'
|
||||||
|
)
|
||||||
|
|
||||||
|
# switch to de again
|
||||||
|
click(css: 'a[href="#current_user"]')
|
||||||
|
click(css: 'a[href="#profile"]')
|
||||||
|
click(css: 'a[href="#profile/language"]')
|
||||||
|
sleep 4
|
||||||
|
select(
|
||||||
|
css: '.js-language [name="locale"]',
|
||||||
|
value: 'Deutsch',
|
||||||
|
)
|
||||||
|
click(css: '.content.active button[type="submit"]')
|
||||||
|
sleep 4
|
||||||
|
watch_for(
|
||||||
|
css: 'body',
|
||||||
|
value: 'Sprache',
|
||||||
|
)
|
||||||
|
sleep 6
|
||||||
|
|
||||||
|
# check if language is still used after reload
|
||||||
|
reload
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: 'body',
|
||||||
|
value: 'Sprache',
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in navbar
|
||||||
|
watch_for(
|
||||||
|
css: '.js-menu',
|
||||||
|
value: 'Übersicht'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in dashboard
|
||||||
|
click(css: '.js-menu a[href="#dashboard"]')
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'Meine Statistik'
|
||||||
|
)
|
||||||
|
|
||||||
|
# check language in overview
|
||||||
|
click(css: '.js-menu a[href="#ticket/view"]')
|
||||||
|
watch_for(
|
||||||
|
css: '.content.active',
|
||||||
|
value: 'Meine'
|
||||||
|
)
|
||||||
|
|
||||||
|
# switch to en again
|
||||||
|
click(css: 'a[href="#current_user"]')
|
||||||
|
click(css: 'a[href="#profile"]')
|
||||||
|
click(css: 'a[href="#profile/language"]')
|
||||||
|
select(
|
||||||
|
css: '.js-language [name="locale"]',
|
||||||
|
value: 'English (United States)',
|
||||||
|
)
|
||||||
|
click(css: '.content.active button[type="submit"]')
|
||||||
|
sleep 2
|
||||||
|
watch_for(
|
||||||
|
css: 'body',
|
||||||
|
value: 'Language',
|
||||||
|
)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
53
test/browser/switch_to_user_test.rb
Normal file
53
test/browser/switch_to_user_test.rb
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'browser_test_helper'
|
||||||
|
|
||||||
|
class SwitchToUserTest < TestCase
|
||||||
|
def test_agent_user
|
||||||
|
@browser = browser_instance
|
||||||
|
login(
|
||||||
|
username: 'admin@example.com',
|
||||||
|
password: 'test',
|
||||||
|
url: browser_url,
|
||||||
|
)
|
||||||
|
tasks_close_all
|
||||||
|
|
||||||
|
click(css: 'a[href="#manage"]')
|
||||||
|
click(css: '.content.active a[href="#manage/users"]')
|
||||||
|
|
||||||
|
set(
|
||||||
|
css: '.content.active .js-search',
|
||||||
|
value: 'nicole',
|
||||||
|
)
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
@browser.action.move_to(@browser.find_elements({ css: '.content.active .table-overview tbody tr:first-child' })[0]).release.perform
|
||||||
|
|
||||||
|
sleep 0.5
|
||||||
|
click(
|
||||||
|
css: '.content.active .dropdown--actions',
|
||||||
|
)
|
||||||
|
click(
|
||||||
|
css: '.content.active .icon-switchView',
|
||||||
|
ajax: false
|
||||||
|
)
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
watch_for(
|
||||||
|
css: '.switchBackToUser',
|
||||||
|
value: 'zammad looks like',
|
||||||
|
)
|
||||||
|
watch_for(
|
||||||
|
css: '.switchBackToUser',
|
||||||
|
value: 'Nicole',
|
||||||
|
)
|
||||||
|
login = @browser.find_elements({ css: '.user-menu .user a' })[0].attribute('title')
|
||||||
|
assert_equal(login, 'nicole.braun@zammad.org')
|
||||||
|
click(css: '.switchBackToUser .js-close', ajax: false)
|
||||||
|
|
||||||
|
sleep 5
|
||||||
|
login = @browser.find_elements({ css: '.user-menu .user a' })[0].attribute('title')
|
||||||
|
assert_equal(login, 'admin@example.com')
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -104,7 +104,9 @@ Oversized Email Message Body #{'#' * 120_000}
|
||||||
# 1. verify that the oversized email has been saved locally to:
|
# 1. verify that the oversized email has been saved locally to:
|
||||||
# /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml
|
# /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml
|
||||||
path = Rails.root.join('tmp/oversized_mail')
|
path = Rails.root.join('tmp/oversized_mail')
|
||||||
target_files = Dir.entries(path).grep(%r{^#{large_message_md5}\.eml$})
|
target_files = Dir.entries(path).select do |filename|
|
||||||
|
filename =~ %r{^#{large_message_md5}\.eml$}
|
||||||
|
end
|
||||||
assert(target_files.present?, 'Large message .eml log file must be present.')
|
assert(target_files.present?, 'Large message .eml log file must be present.')
|
||||||
|
|
||||||
# pick the latest file that matches the criteria
|
# pick the latest file that matches the criteria
|
||||||
|
@ -191,7 +193,9 @@ Oversized Email Message Body #{'#' * 120_000}
|
||||||
# 1. verify that the oversized email has been saved locally to:
|
# 1. verify that the oversized email has been saved locally to:
|
||||||
# /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml
|
# /tmp/oversized_mail/yyyy-mm-ddThh:mm:ss-:md5.eml
|
||||||
path = Rails.root.join('tmp/oversized_mail')
|
path = Rails.root.join('tmp/oversized_mail')
|
||||||
target_files = Dir.entries(path).grep(%r{^.+?\.eml$})
|
target_files = Dir.entries(path).select do |filename|
|
||||||
|
filename =~ %r{^.+?\.eml$}
|
||||||
|
end
|
||||||
assert_not(target_files.blank?, 'Large message .eml log file must be blank.')
|
assert_not(target_files.blank?, 'Large message .eml log file must be blank.')
|
||||||
|
|
||||||
# 2. verify that a postmaster response email has been sent to the sender
|
# 2. verify that a postmaster response email has been sent to the sender
|
||||||
|
|
|
@ -55,8 +55,8 @@ class OtrsImportBrowserTest < TestCase
|
||||||
click(css: '.js-migration-start')
|
click(css: '.js-migration-start')
|
||||||
|
|
||||||
watch_for(
|
watch_for(
|
||||||
css: '#login',
|
css: 'body',
|
||||||
value: 'username',
|
value: 'login',
|
||||||
timeout: 600,
|
timeout: 600,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ class ActiveSupport::TestCase
|
||||||
# read config file and count type & recipients
|
# read config file and count type & recipients
|
||||||
file = Rails.root.join('log', "#{Rails.env}.log")
|
file = Rails.root.join('log', "#{Rails.env}.log")
|
||||||
lines = []
|
lines = []
|
||||||
File.foreach(file) do |line|
|
IO.foreach(file) do |line|
|
||||||
lines.push line
|
lines.push line
|
||||||
end
|
end
|
||||||
count = 0
|
count = 0
|
||||||
|
|
Loading…
Reference in a new issue