|
44 | 44 | )
|
45 | 45 | from enterprise_catalog.apps.catalog.utils import (
|
46 | 46 | enterprise_proxy_login_url,
|
| 47 | + get_content_filter_hash, |
47 | 48 | get_content_key,
|
48 | 49 | get_parent_content_key,
|
49 | 50 | localized_utcnow,
|
@@ -2499,3 +2500,140 @@ def test_filter_list_by_uuid(self):
|
2499 | 2500 | assert len(response_json.get('results')) == 1
|
2500 | 2501 | assert response_json.get('results')[0].get("key") == self.content_metadata_object.content_key
|
2501 | 2502 | assert response_json.get('results')[0].get("course_runs")[0].get('start') == '2024-02-12T11:00:00Z'
|
| 2503 | + |
| 2504 | + |
| 2505 | +@ddt.ddt |
| 2506 | +class CatalogQueryViewTests(APITestMixin): |
| 2507 | + """ |
| 2508 | + Tests for the readonly ContentMetadata viewset. |
| 2509 | + """ |
| 2510 | + def setUp(self): |
| 2511 | + super().setUp() |
| 2512 | + self.set_up_catalog_learner() |
| 2513 | + self.catalog_query_object = CatalogQueryFactory() |
| 2514 | + self.catalog_object = EnterpriseCatalogFactory(catalog_query=self.catalog_query_object) |
| 2515 | + self.assign_catalog_admin_feature_role(enterprise_uuids=[self.catalog_object.enterprise_uuid]) |
| 2516 | + # Factory doesn't set up a hash, so do it manually |
| 2517 | + self.catalog_query_object.content_filter_hash = get_content_filter_hash( |
| 2518 | + self.catalog_query_object.content_filter |
| 2519 | + ) |
| 2520 | + self.catalog_query_object.save() |
| 2521 | + |
| 2522 | + def test_get_query_by_hash(self): |
| 2523 | + """ |
| 2524 | + Test that the list content_identifiers query param accepts uuids |
| 2525 | + """ |
| 2526 | + query_param_string = f"?hash={self.catalog_query_object.content_filter_hash}" |
| 2527 | + url = reverse('api:v1:get-query-by-hash') + query_param_string |
| 2528 | + response = self.client.get(url) |
| 2529 | + response_json = response.json() |
| 2530 | + # The user is a part of the enterprise that has a catalog that contains this query |
| 2531 | + # so they can view the data |
| 2532 | + assert response_json.get('uuid') == str(self.catalog_query_object.uuid) |
| 2533 | + assert str(response_json.get('content_filter')) == str(self.catalog_query_object.content_filter) |
| 2534 | + |
| 2535 | + # Permissions verification while looking up by hash |
| 2536 | + different_catalog = EnterpriseCatalogFactory() |
| 2537 | + # Factory doesn't set up a hash, so do it manually |
| 2538 | + different_catalog.catalog_query.content_filter_hash = get_content_filter_hash( |
| 2539 | + different_catalog.catalog_query.content_filter |
| 2540 | + ) |
| 2541 | + different_catalog.save() |
| 2542 | + query_param_string = f"?hash={different_catalog.catalog_query.content_filter_hash}" |
| 2543 | + url = reverse('api:v1:get-query-by-hash') + query_param_string |
| 2544 | + response = self.client.get(url) |
| 2545 | + response_json = response.json() |
| 2546 | + assert response_json == {'detail': 'Catalog query not found.'} |
| 2547 | + |
| 2548 | + # If the user is staff, they get access to everything |
| 2549 | + self.set_up_staff() |
| 2550 | + response = self.client.get(url) |
| 2551 | + response_json = response.json() |
| 2552 | + assert response_json.get('uuid') == str(different_catalog.catalog_query.uuid) |
| 2553 | + |
| 2554 | + self.set_up_invalid_jwt_role() |
| 2555 | + self.remove_role_assignments() |
| 2556 | + response = self.client.get(url) |
| 2557 | + assert response.status_code == 404 |
| 2558 | + |
| 2559 | + def test_get_query_by_hash_not_found(self): |
| 2560 | + """ |
| 2561 | + Test that the get query by hash endpoint returns expected not found |
| 2562 | + """ |
| 2563 | + query_param_string = f"?hash={self.catalog_query_object.content_filter_hash[:-6]}aaaaaa" |
| 2564 | + url = reverse('api:v1:get-query-by-hash') + query_param_string |
| 2565 | + response = self.client.get(url) |
| 2566 | + response_json = response.json() |
| 2567 | + assert response_json == {'detail': 'Catalog query not found.'} |
| 2568 | + |
| 2569 | + def test_get_query_by_illegal_hash(self): |
| 2570 | + """ |
| 2571 | + Test that the get query by hash endpoint validates filter hashes |
| 2572 | + """ |
| 2573 | + query_param_string = "?hash=foobar" |
| 2574 | + url = reverse('api:v1:get-query-by-hash') + query_param_string |
| 2575 | + response = self.client.get(url) |
| 2576 | + response_json = response.json() |
| 2577 | + assert response_json == {'hash': ['Invalid filter hash.']} |
| 2578 | + |
| 2579 | + def test_get_query_by_hash_requires_hash(self): |
| 2580 | + """ |
| 2581 | + Test that the get query by hash requires a hash query param |
| 2582 | + """ |
| 2583 | + url = reverse('api:v1:get-query-by-hash') |
| 2584 | + response = self.client.get(url) |
| 2585 | + response_json = response.json() |
| 2586 | + assert response_json == ['You must provide at least one of the following query parameters: hash.'] |
| 2587 | + |
| 2588 | + def test_catalog_query_retrieve(self): |
| 2589 | + """ |
| 2590 | + Test that the Catalog Query viewset supports retrieving individual queries |
| 2591 | + """ |
| 2592 | + self.assign_catalog_admin_jwt_role( |
| 2593 | + self.enterprise_uuid, |
| 2594 | + self.catalog_query_object.enterprise_catalogs.first().enterprise_uuid, |
| 2595 | + ) |
| 2596 | + url = reverse('api:v1:catalog-queries-detail', kwargs={'pk': self.catalog_query_object.pk}) |
| 2597 | + response = self.client.get(url) |
| 2598 | + response_json = response.json() |
| 2599 | + assert response_json.get('uuid') == str(self.catalog_query_object.uuid) |
| 2600 | + |
| 2601 | + different_customer_catalog = EnterpriseCatalogFactory() |
| 2602 | + # We don't have a jwt token that includes an admin role for the new enterprise so it is |
| 2603 | + # essentially hidden to the requester |
| 2604 | + url = reverse('api:v1:catalog-queries-detail', kwargs={'pk': different_customer_catalog.catalog_query.pk}) |
| 2605 | + response = self.client.get(url) |
| 2606 | + assert response.status_code == 404 |
| 2607 | + |
| 2608 | + # If the user is staff, they get access to everything |
| 2609 | + self.set_up_staff() |
| 2610 | + response = self.client.get(url) |
| 2611 | + response_json = response.json() |
| 2612 | + assert response_json.get('uuid') == str(different_customer_catalog.catalog_query.uuid) |
| 2613 | + |
| 2614 | + def test_catalog_query_list(self): |
| 2615 | + """ |
| 2616 | + Test that the Catalog Query viewset supports listing queries |
| 2617 | + """ |
| 2618 | + # Create another catalog associated with another enterprise and therefore hidden to the requesting user |
| 2619 | + EnterpriseCatalogFactory() |
| 2620 | + self.assign_catalog_admin_jwt_role( |
| 2621 | + self.enterprise_uuid, |
| 2622 | + self.catalog_query_object.enterprise_catalogs.first().enterprise_uuid, |
| 2623 | + ) |
| 2624 | + url = reverse('api:v1:catalog-queries-list') |
| 2625 | + response = self.client.get(url) |
| 2626 | + response_json = response.json() |
| 2627 | + assert response_json.get('count') == 1 |
| 2628 | + assert response_json.get('results')[0].get('uuid') == str(self.catalog_query_object.uuid) |
| 2629 | + |
| 2630 | + # If the user is staff, they get access to everything |
| 2631 | + self.set_up_staff() |
| 2632 | + response = self.client.get(url) |
| 2633 | + response_json = response.json() |
| 2634 | + assert response_json.get('count') == 2 |
| 2635 | + |
| 2636 | + self.set_up_invalid_jwt_role() |
| 2637 | + self.remove_role_assignments() |
| 2638 | + response = self.client.get(url) |
| 2639 | + assert response.data == {'count': 0, 'next': None, 'previous': None, 'results': []} |
0 commit comments