diff --git a/CHANGELOG.md b/CHANGELOG.md
index 968076d..fe65c86 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
 
 ## [Unreleased]
 
+### New Endpoint Coverage
+
+- Quiz Submission Events (Thanks, [@Goff-Davis](https://github.com/Goff-Davis))
+- Rubric Associations (Thanks, [@weining-li](https://github.com/weining-li))
+
 ### General
 
 - Throw `IndexError` when using negative indexes on `PaginatedList` objects (Thanks, [@UniversalSuperBox](https://github.com/UniversalSuperBox))
diff --git a/canvasapi/course.py b/canvasapi/course.py
index e42cd7a..d5ef716 100644
--- a/canvasapi/course.py
+++ b/canvasapi/course.py
@@ -467,6 +467,29 @@ class Course(CanvasObject):
 
         return rubric_dict
 
+    def create_rubric_association(self, **kwargs):
+        """
+        Create a new RubricAssociation.
+
+        :calls: `POST /api/v1/courses/:course_id/rubric_associations \
+        <https://canvas.instructure.com/doc/api/rubrics.html#method.rubric_associations.create>`_
+
+        :returns: Returns a RubricAssociation.
+        :rtype: :class:`canvasapi.rubric.RubricAssociation`
+        """
+        from canvasapi.rubric import RubricAssociation
+
+        response = self._requester.request(
+            "POST",
+            "courses/{}/rubric_associations".format(self.id),
+            _kwargs=combine_kwargs(**kwargs),
+        )
+
+        quiz_json = response.json()
+        quiz_json.update({"course_id": self.id})
+
+        return RubricAssociation(self._requester, quiz_json)
+
     def delete(self):
         """
         Permanently delete this course.
diff --git a/canvasapi/rubric.py b/canvasapi/rubric.py
index 4b58436..b323483 100644
--- a/canvasapi/rubric.py
+++ b/canvasapi/rubric.py
@@ -3,6 +3,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera
 from six import python_2_unicode_compatible
 
 from canvasapi.canvas_object import CanvasObject
+from canvasapi.util import combine_kwargs
 
 
 @python_2_unicode_compatible
@@ -15,3 +16,47 @@ class Rubric(CanvasObject):
 class RubricAssociation(CanvasObject):
     def __str__(self):
         return "{}, {}".format(self.id, self.association_type)
+
+    def delete(self, **kwargs):
+        """
+        Delete a RubricAssociation.
+
+        :calls: `DELETE /api/v1/courses/:course_id/rubric_associations/:id \
+        <https://canvas.instructure.com/doc/api/rubrics.html#method.rubric_associations.destroy>`_
+
+        :rtype: :class:`canvasapi.rubric.RubricAssociation`
+        """
+        from canvasapi.rubric import RubricAssociation
+
+        response = self._requester.request(
+            "DELETE",
+            "courses/{}/rubric_associations/{}".format(self.course_id, self.id),
+            _kwargs=combine_kwargs(**kwargs),
+        )
+
+        return RubricAssociation(self._requester, response.json())
+
+    def update(self, **kwargs):
+        """
+        Update a RubricAssociation.
+
+        :calls: `PUT /api/v1/courses/:course_id/rubric_associations/:id \
+        <https://canvas.instructure.com/doc/api/rubrics.html#method.rubric_associations.update>`_
+
+        :returns: Returns a RubricAssociation.
+        :rtype: :class:`canvasapi.rubric.RubricAssociation`
+        """
+        from canvasapi.rubric import RubricAssociation
+
+        response = self._requester.request(
+            "PUT",
+            "courses/{}/rubric_associations/{}".format(self.course_id, self.id),
+            _kwargs=combine_kwargs(**kwargs),
+        )
+
+        response_json = response.json()
+        response_json.update({"course_id": self.course_id})
+        if "association_type" in response_json:
+            super(RubricAssociation, self).set_attributes(response_json)
+
+        return self

Rubric Associations
**What resource needs additional coverage?**
Rubric Associations

**What endpoints need to be covered?**
https://canvas.instructure.com/doc/api/rubrics.html

- [ ] Create a Rubric Association
- [ ] Update a Rubric Association
- [ ] Delete a Rubric Association

diff --git a/tests/fixtures/course.json b/tests/fixtures/course.json
index 53b5e70..c65a1de 100644
--- a/tests/fixtures/course.json
+++ b/tests/fixtures/course.json
@@ -1910,5 +1910,14 @@
 			}
 		},
 		"status_code": 200
+	},
+	"create_rubric_association": {
+		"method": "POST",
+		"endpoint": "courses/1/rubric_associations",
+		"data": {
+			"id": 4,
+			"association_type": "Course"
+		},
+		"status_code": 200
 	}
 }
diff --git a/tests/fixtures/rubric.json b/tests/fixtures/rubric.json
new file mode 100644
index 0000000..78f8fcd
--- /dev/null
+++ b/tests/fixtures/rubric.json
@@ -0,0 +1,20 @@
+{
+	"update_rubric_association": {
+		"method": "PUT",
+		"endpoint": "courses/1/rubric_associations/4",
+		"data": {
+			"id": 5,
+			"association_type": "Assignment"
+		},
+		"status_code": 200
+	},
+	"delete_rubric_association": {
+		"method": "DELETE",
+		"endpoint": "courses/1/rubric_associations/4",
+		"data": {
+			"id": 4,
+			"association_type": "Assignment"
+		},
+		"status_code": 200
+	}
+}
diff --git a/tests/test_course.py b/tests/test_course.py
index 5080088..55cdc87 100644
--- a/tests/test_course.py
+++ b/tests/test_course.py
@@ -31,7 +31,7 @@ from canvasapi.outcome_import import OutcomeImport
 from canvasapi.paginated_list import PaginatedList
 from canvasapi.progress import Progress
 from canvasapi.quiz import Quiz, QuizExtension
-from canvasapi.rubric import Rubric
+from canvasapi.rubric import Rubric, RubricAssociation
 from canvasapi.section import Section
 from canvasapi.submission import GroupedSubmission, Submission
 from canvasapi.tab import Tab
@@ -1769,6 +1769,16 @@ class TestCourse(unittest.TestCase):
         self.assertEqual(rubric["rubric_association"].rubric_id, 1)
         self.assertEqual(rubric["rubric_association"].association_type, "Course")
 
+    # create_rubric_association()
+    def test_create_rubric_association(self, m):
+        register_uris({"course": ["create_rubric_association"]}, m)
+
+        rubric_association = self.course.create_rubric_association()
+
+        self.assertIsInstance(rubric_association, RubricAssociation)
+        self.assertEqual(rubric_association.id, 4)
+        self.assertEqual(rubric_association.association_type, "Course")
+
 
 @requests_mock.Mocker()
 class TestCourseNickname(unittest.TestCase):
diff --git a/tests/test_rubric.py b/tests/test_rubric.py
index c1e4959..d6bdae6 100644
--- a/tests/test_rubric.py
+++ b/tests/test_rubric.py
@@ -4,6 +4,7 @@ import unittest
 import requests_mock
 
 from canvasapi import Canvas
+from canvasapi.rubric import RubricAssociation
 from tests import settings
 from tests.util import register_uris
 
@@ -32,13 +33,44 @@ class TestRubricAssociation(unittest.TestCase):
 
         with requests_mock.Mocker() as m:
             register_uris(
-                {"course": ["get_by_id", "create_rubric_with_association"]}, m
+                {
+                    "course": [
+                        "get_by_id",
+                        "create_rubric_with_association",
+                        "create_rubric_association",
+                    ]
+                },
+                m,
             )
 
             self.course = self.canvas.get_course(1)
             self.rubric = self.course.create_rubric()
+            self.association = self.course.create_rubric_association()
 
     # __str__()
     def test__str__(self, m):
         string = str(self.rubric["rubric_association"])
         self.assertIsInstance(string, str)
+
+    # update
+    def test_update(self, m):
+        register_uris({"rubric": ["update_rubric_association"]}, m)
+
+        self.assertEqual(self.association.id, 4)
+
+        rubric_association = self.association.update()
+
+        self.assertEqual(rubric_association, self.association)
+        self.assertEqual(rubric_association.id, 5)
+        self.assertIsInstance(rubric_association, RubricAssociation)
+        self.assertEqual(rubric_association.association_type, "Assignment")
+
+    # delete
+    def test_delete(self, m):
+        register_uris({"rubric": ["delete_rubric_association"]}, m)
+
+        rubric_association = self.association.delete()
+
+        self.assertIsInstance(rubric_association, RubricAssociation)
+        self.assertEqual(rubric_association.id, 4)
+        self.assertEqual(rubric_association.association_type, "Assignment")

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-mock pytest-xdist pytest-asyncio
3.7
requirements.txt dev_requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
Babel==2.14.0
black==23.3.0
-e git+https://github.com/ucfopen/canvasapi.git@132c854524fd7ec24ee040dde5f03e17ef70e9c7#egg=canvasapi
certifi @ file:///croot/certifi_1671487769961/work/certifi
cfgv==3.3.1
charset-normalizer==3.4.1
click==8.1.8
coverage==7.2.7
distlib==0.3.9
docutils==0.15.2
exceptiongroup==1.2.2
execnet==2.0.2
filelock==3.12.2
flake8==5.0.4
identify==2.5.24
idna==3.10
imagesize==1.4.1
importlib-metadata==4.2.0
iniconfig==2.0.0
Jinja2==3.1.6
MarkupSafe==2.1.5
mccabe==0.7.0
mypy-extensions==1.0.0
nodeenv==1.9.1
packaging==24.0
pathspec==0.11.2
platformdirs==2.6.2
pluggy==1.2.0
pre-commit==2.21.0
pycodestyle==2.9.1
pyflakes==2.5.0
Pygments==2.17.2
pytest==7.4.4
pytest-asyncio==0.21.2
pytest-cov==4.1.0
pytest-mock==3.11.1
pytest-xdist==3.5.0
pytz==2025.2
PyYAML==6.0.1
requests==2.31.0
requests-mock==1.12.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==4.3.2
sphinx-rtd-theme==1.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
tomli==2.0.1
typed-ast==1.5.5
typing_extensions==4.7.1
urllib3==2.0.7
virtualenv==20.16.2
zipp==3.15.0

name: canvasapi
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - babel==2.14.0
      - black==23.3.0
      - cfgv==3.3.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - coverage==7.2.7
      - distlib==0.3.9
      - docutils==0.15.2
      - exceptiongroup==1.2.2
      - execnet==2.0.2
      - filelock==3.12.2
      - flake8==5.0.4
      - identify==2.5.24
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.2.0
      - iniconfig==2.0.0
      - jinja2==3.1.6
      - markupsafe==2.1.5
      - mccabe==0.7.0
      - mypy-extensions==1.0.0
      - nodeenv==1.9.1
      - packaging==24.0
      - pathspec==0.11.2
      - platformdirs==2.6.2
      - pluggy==1.2.0
      - pre-commit==2.21.0
      - pycodestyle==2.9.1
      - pyflakes==2.5.0
      - pygments==2.17.2
      - pytest==7.4.4
      - pytest-asyncio==0.21.2
      - pytest-cov==4.1.0
      - pytest-mock==3.11.1
      - pytest-xdist==3.5.0
      - pytz==2025.2
      - pyyaml==6.0.1
      - requests==2.31.0
      - requests-mock==1.12.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==4.3.2
      - sphinx-rtd-theme==1.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jquery==4.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - tomli==2.0.1
      - typed-ast==1.5.5
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - virtualenv==20.16.2
      - zipp==3.15.0
prefix: /opt/conda/envs/canvasapi

tests/test_course.py::TestCourse::test_create_rubric_association tests/test_rubric.py::TestRubricAssociation::test__str__ tests/test_rubric.py::TestRubricAssociation::test_delete tests/test_rubric.py::TestRubricAssociation::test_update
tests/test_course.py::TestCourse::test__str__ tests/test_course.py::TestCourse::test_add_grading_standards tests/test_course.py::TestCourse::test_add_grading_standards_empty_list tests/test_course.py::TestCourse::test_add_grading_standards_missing_name_key tests/test_course.py::TestCourse::test_add_grading_standards_missing_value_key tests/test_course.py::TestCourse::test_add_grading_standards_non_dict_list tests/test_course.py::TestCourse::test_conclude tests/test_course.py::TestCourse::test_create_assignment tests/test_course.py::TestCourse::test_create_assignment_fail tests/test_course.py::TestCourse::test_create_assignment_group tests/test_course.py::TestCourse::test_create_assignment_overrides tests/test_course.py::TestCourse::test_create_content_migration tests/test_course.py::TestCourse::test_create_content_migration_bad_migration_type tests/test_course.py::TestCourse::test_create_content_migration_migrator tests/test_course.py::TestCourse::test_create_course_section tests/test_course.py::TestCourse::test_create_discussion_topic tests/test_course.py::TestCourse::test_create_epub_export tests/test_course.py::TestCourse::test_create_external_feed tests/test_course.py::TestCourse::test_create_external_tool tests/test_course.py::TestCourse::test_create_folder tests/test_course.py::TestCourse::test_create_group_category tests/test_course.py::TestCourse::test_create_module tests/test_course.py::TestCourse::test_create_module_fail tests/test_course.py::TestCourse::test_create_page tests/test_course.py::TestCourse::test_create_page_fail tests/test_course.py::TestCourse::test_create_quiz tests/test_course.py::TestCourse::test_create_quiz_fail tests/test_course.py::TestCourse::test_create_rubric_no_association tests/test_course.py::TestCourse::test_create_rubric_with_association tests/test_course.py::TestCourse::test_delete tests/test_course.py::TestCourse::test_delete_external_feed tests/test_course.py::TestCourse::test_edit_front_page tests/test_course.py::TestCourse::test_enroll_user tests/test_course.py::TestCourse::test_export_content tests/test_course.py::TestCourse::test_get__enabled_features tests/test_course.py::TestCourse::test_get_assignment tests/test_course.py::TestCourse::test_get_assignment_group tests/test_course.py::TestCourse::test_get_assignment_groups tests/test_course.py::TestCourse::test_get_assignment_overrides tests/test_course.py::TestCourse::test_get_assignments tests/test_course.py::TestCourse::test_get_blueprint tests/test_course.py::TestCourse::test_get_blueprint_default tests/test_course.py::TestCourse::test_get_collaborations tests/test_course.py::TestCourse::test_get_content_migration tests/test_course.py::TestCourse::test_get_content_migrations tests/test_course.py::TestCourse::test_get_course_level_assignment_data tests/test_course.py::TestCourse::test_get_course_level_participation_data tests/test_course.py::TestCourse::test_get_course_level_student_summary_data tests/test_course.py::TestCourse::test_get_discussion_topic tests/test_course.py::TestCourse::test_get_discussion_topics tests/test_course.py::TestCourse::test_get_enrollments tests/test_course.py::TestCourse::test_get_epub_export tests/test_course.py::TestCourse::test_get_external_feeds tests/test_course.py::TestCourse::test_get_external_tool tests/test_course.py::TestCourse::test_get_external_tools tests/test_course.py::TestCourse::test_get_feature_flag tests/test_course.py::TestCourse::test_get_features tests/test_course.py::TestCourse::test_get_file tests/test_course.py::TestCourse::test_get_files tests/test_course.py::TestCourse::test_get_folder tests/test_course.py::TestCourse::test_get_folders tests/test_course.py::TestCourse::test_get_full_discussion_topic tests/test_course.py::TestCourse::test_get_grading_period tests/test_course.py::TestCourse::test_get_grading_periods tests/test_course.py::TestCourse::test_get_grading_standards tests/test_course.py::TestCourse::test_get_group_categories tests/test_course.py::TestCourse::test_get_groups tests/test_course.py::TestCourse::test_get_migration_systems tests/test_course.py::TestCourse::test_get_module tests/test_course.py::TestCourse::test_get_modules tests/test_course.py::TestCourse::test_get_multiple_submissions tests/test_course.py::TestCourse::test_get_multiple_submissions_grouped_false tests/test_course.py::TestCourse::test_get_multiple_submissions_grouped_invalid tests/test_course.py::TestCourse::test_get_multiple_submissions_grouped_true tests/test_course.py::TestCourse::test_get_outcome_group tests/test_course.py::TestCourse::test_get_outcome_groups_in_context tests/test_course.py::TestCourse::test_get_outcome_import_status tests/test_course.py::TestCourse::test_get_outcome_import_status_latest tests/test_course.py::TestCourse::test_get_outcome_links_in_context tests/test_course.py::TestCourse::test_get_outcome_result_rollups tests/test_course.py::TestCourse::test_get_outcome_results tests/test_course.py::TestCourse::test_get_page tests/test_course.py::TestCourse::test_get_pages tests/test_course.py::TestCourse::test_get_quiz tests/test_course.py::TestCourse::test_get_quiz_fail tests/test_course.py::TestCourse::test_get_quizzes tests/test_course.py::TestCourse::test_get_recent_students tests/test_course.py::TestCourse::test_get_root_outcome_group tests/test_course.py::TestCourse::test_get_rubric tests/test_course.py::TestCourse::test_get_rubrics tests/test_course.py::TestCourse::test_get_section tests/test_course.py::TestCourse::test_get_sections tests/test_course.py::TestCourse::test_get_settings tests/test_course.py::TestCourse::test_get_single_grading_standard tests/test_course.py::TestCourse::test_get_submission tests/test_course.py::TestCourse::test_get_tabs tests/test_course.py::TestCourse::test_get_user tests/test_course.py::TestCourse::test_get_user_id_type tests/test_course.py::TestCourse::test_get_user_in_a_course_level_assignment_data tests/test_course.py::TestCourse::test_get_user_in_a_course_level_messaging_data tests/test_course.py::TestCourse::test_get_user_in_a_course_level_participation_data tests/test_course.py::TestCourse::test_get_users tests/test_course.py::TestCourse::test_import_outcome_binary tests/test_course.py::TestCourse::test_import_outcome_filepath tests/test_course.py::TestCourse::test_import_outcome_id tests/test_course.py::TestCourse::test_import_outcome_ioerror tests/test_course.py::TestCourse::test_list_assignment_groups tests/test_course.py::TestCourse::test_list_blueprint_subscriptions tests/test_course.py::TestCourse::test_list_content_exports tests/test_course.py::TestCourse::test_list_external_feeds tests/test_course.py::TestCourse::test_list_files tests/test_course.py::TestCourse::test_list_folders tests/test_course.py::TestCourse::test_list_gradeable_students tests/test_course.py::TestCourse::test_list_group_categories tests/test_course.py::TestCourse::test_list_groups tests/test_course.py::TestCourse::test_list_multiple_submissions tests/test_course.py::TestCourse::test_list_rubrics tests/test_course.py::TestCourse::test_list_sections tests/test_course.py::TestCourse::test_list_submissions tests/test_course.py::TestCourse::test_list_tabs tests/test_course.py::TestCourse::test_mark_submission_as_read tests/test_course.py::TestCourse::test_mark_submission_as_unread tests/test_course.py::TestCourse::test_preview_html tests/test_course.py::TestCourse::test_reorder_pinned_topics tests/test_course.py::TestCourse::test_reorder_pinned_topics_comma_separated_string tests/test_course.py::TestCourse::test_reorder_pinned_topics_invalid_input tests/test_course.py::TestCourse::test_reorder_pinned_topics_tuple tests/test_course.py::TestCourse::test_reset tests/test_course.py::TestCourse::test_set_extensions_empty_list tests/test_course.py::TestCourse::test_set_extensions_missing_key tests/test_course.py::TestCourse::test_set_extensions_non_dicts tests/test_course.py::TestCourse::test_set_extensions_not_list tests/test_course.py::TestCourse::test_set_quiz_extensions tests/test_course.py::TestCourse::test_show_content_export tests/test_course.py::TestCourse::test_show_front_page tests/test_course.py::TestCourse::test_submissions_bulk_update tests/test_course.py::TestCourse::test_submit_assignment tests/test_course.py::TestCourse::test_submit_assignment_fail tests/test_course.py::TestCourse::test_update tests/test_course.py::TestCourse::test_update_assignment_overrides tests/test_course.py::TestCourse::test_update_settings tests/test_course.py::TestCourse::test_update_submission tests/test_course.py::TestCourse::test_update_tab tests/test_course.py::TestCourse::test_upload tests/test_course.py::TestCourseNickname::test__str__ tests/test_course.py::TestCourseNickname::test_remove tests/test_rubric.py::TestGradingStandard::test__str__
canvasapi/course.py canvasapi/rubric.py CHANGELOG.md
canvasapi/course.py canvasapi/rubric.py CHANGELOG.md