diff --git a/.changeset/breezy-beers-know.md b/.changeset/breezy-beers-know.md
new file mode 100644
index 00000000000..3c242bc2e94
--- /dev/null
+++ b/.changeset/breezy-beers-know.md
@@ -0,0 +1,5 @@
+---
+'@shopify/polaris': patch
+---
+
+Added tests for `buttonFrom` and `buttonsFrom` utility functions
diff --git a/polaris-react/src/components/Button/tests/utils.test.tsx b/polaris-react/src/components/Button/tests/utils.test.tsx
new file mode 100644
index 00000000000..81a5b88199d
--- /dev/null
+++ b/polaris-react/src/components/Button/tests/utils.test.tsx
@@ -0,0 +1,89 @@
+import React from 'react';
+import {mountWithApp} from 'tests/utilities';
+
+import type {ComplexAction} from '../../../types';
+import {buttonFrom, buttonsFrom} from '../utils';
+import {Button} from '../Button';
+import type {ButtonProps} from '../Button';
+
+describe('buttonFrom', () => {
+ it('sets `tone` to "critical" if action `destructive` is true', () => {
+ const button = mountWithApp(buttonFrom({destructive: true}));
+ expect(button).toHaveReactProps({tone: 'critical'});
+ });
+
+ it('sets `variant` to "plain" if action `plain` is true', () => {
+ const button = mountWithApp(buttonFrom({plain: true}));
+ expect(button).toHaveReactProps({variant: 'plain'});
+ });
+
+ it('sets `tone` to "critical" if action `destructive` is true and overrides `tone` is undefined', () => {
+ const button = mountWithApp(
+ buttonFrom({destructive: true}, {variant: 'primary'}),
+ );
+ expect(button).toHaveReactProps({tone: 'critical'});
+ });
+
+ it('sets `variant` to "plain" if action `plain` is true and overrides `variant` is undefined', () => {
+ const button = mountWithApp(buttonFrom({plain: true}, {tone: 'success'}));
+ expect(button).toHaveReactProps({variant: 'plain'});
+ });
+
+ it('sets `tone` to "success" if action `destructive` is undefined and overrides `tone` is "success"', () => {
+ const button = mountWithApp(
+ buttonFrom({destructive: true}, {tone: 'success'}),
+ );
+ expect(button).toHaveReactProps({tone: 'success'});
+ });
+
+ it('sets `variant` to "primary" if action `plain` is undefined and overrides `variant` is "primary"', () => {
+ const button = mountWithApp(
+ buttonFrom({plain: true}, {variant: 'primary'}),
+ );
+ expect(button).toHaveReactProps({variant: 'primary'});
+ });
+
+ it('sets `tone` to "success" if action `destructive` is true and overrides `tone` is "success"', () => {
+ const button = mountWithApp(
+ buttonFrom({destructive: true}, {tone: 'success'}),
+ );
+ expect(button).toHaveReactProps({tone: 'success'});
+ });
+
+ it('sets `variant` to "primary" if action `plain` is true and overrides `variant` is "primary"', () => {
+ const button = mountWithApp(
+ buttonFrom({plain: true}, {variant: 'primary'}),
+ );
+ expect(button).toHaveReactProps({variant: 'primary'});
+ });
+
+ it('does not set `tone` if action `destructive` is undefined and overrides `tone` is undefined', () => {
+ const button = mountWithApp(buttonFrom({}));
+ expect(button).toHaveReactProps({tone: undefined});
+ });
+
+ it('does not set `variant` if action `plain` is undefined and overrides `variant` is undefined', () => {
+ const button = mountWithApp(buttonFrom({}));
+ expect(button).toHaveReactProps({variant: undefined});
+ });
+});
+
+describe('buttonsFrom', () => {
+ it('returns a single if called with a ComplexAction', () => {
+ const button = mountWithApp(buttonsFrom({destructive: true}));
+ expect(button).toHaveReactProps({tone: 'critical'});
+ });
+
+ it('returns array if called with a ComplexAction array', () => {
+ const actions: ComplexAction[] = [
+ {content: 'Delete', destructive: true},
+ {content: 'Edit', plain: true},
+ {content: 'Save'},
+ ];
+
+ const buttons = mountWithApp(
+ {buttonsFrom(actions)}
,
+ );
+ expect(buttons).toContainReactComponentTimes(Button, 3);
+ });
+});