Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds m365 spo tenant homesite add. Closes #6488 #6533

Closed
wants to merge 42 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
633959a
add new cmdlet to add home site
reshmee011 Dec 23, 2024
7d2a270
update to add additional parameters
reshmee011 Jan 5, 2025
f79efd4
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Jan 20, 2025
a5d46e7
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Jan 20, 2025
8f7a2d4
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Jan 20, 2025
4a6dd5b
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Jan 20, 2025
19ea2ae
Update src/m365/spo/commands/tenant/tenant-homesite-add.ts
reshmee011 Jan 20, 2025
0fe6459
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Jan 20, 2025
de55555
Update src/m365/spo/commands/tenant/tenant-homesite-add.ts
reshmee011 Jan 20, 2025
69fb83b
updates based on comments
reshmee011 Jan 20, 2025
ba56f92
Merge branch 'pnp:main' into addhomesite
reshmee011 Jan 20, 2025
b63164c
updates based on Milan's comments
reshmee011 Jan 20, 2025
582d528
Add validation for integers and guids
reshmee011 Jan 20, 2025
2d67b4d
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Feb 28, 2025
e35c835
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Feb 28, 2025
09445cf
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Feb 28, 2025
c7765e1
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Feb 28, 2025
cb3a024
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Feb 28, 2025
708a14a
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Feb 28, 2025
74404fa
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Feb 28, 2025
2937f55
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Feb 28, 2025
72023e1
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Feb 28, 2025
40214d4
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Feb 28, 2025
3e95a3d
Update src/m365/spo/commands/tenant/tenant-homesite-add.ts
reshmee011 Feb 28, 2025
b3fe02d
Update src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
reshmee011 Feb 28, 2025
eb14f25
Update docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
reshmee011 Feb 28, 2025
312962a
Merge branch 'main' into addhomesite
reshmee011 Mar 1, 2025
bbfe113
rename home site add to remove reference to tenant
reshmee011 Mar 1, 2025
6e2ae30
amend to zod
reshmee011 Mar 1, 2025
90fb463
updated test
reshmee011 Mar 1, 2025
8c3b8fc
update test
reshmee011 Mar 1, 2025
b2c2e95
change to zod schema
reshmee011 Mar 1, 2025
d1ffd0a
updates
reshmee011 Mar 1, 2025
5cd799f
update test script
reshmee011 Mar 1, 2025
9d43564
updates
reshmee011 Mar 1, 2025
972779f
Update src/m365/spo/commands/homesite/homesite-add.ts
reshmee011 Mar 12, 2025
dbaafc9
Update src/m365/spo/commands/homesite/homesite-add.ts
reshmee011 Mar 12, 2025
0d8321b
Update docs/docs/cmd/spo/homesite/homesite-add.mdx
reshmee011 Mar 12, 2025
130c439
Update docs/docs/cmd/spo/homesite/homesite-add.mdx
reshmee011 Mar 12, 2025
81c6411
Merge branch 'pnp:main' into addhomesite
reshmee011 Mar 12, 2025
5fdfc4d
update based on feedback
reshmee011 Mar 12, 2025
b9d86b0
update test
reshmee011 Mar 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions docs/docs/cmd/spo/tenant/tenant-homesite-add.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import Global from '/docs/cmd/_global.mdx';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# spo tenant homesite add
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's rename everything from spo tenant homesite add to spo homesite add.


Add a Home Site.

## Usage

```sh
m365 spo tenant homesite add [options]
```

## Options

```md definition-list
`-u, --url <url>`
: URL of the site to set as the home site.

`--isInDraftMode [isInDraftMode]`
: Specifies whether the home site is in draft mode. Accepts `true` or `false`.

`--vivaConnectionsDefaultStart [vivaConnectionsDefaultStart]`
: Specifies whether the home site is the default start for Viva Connections. Accepts `true` or `false`.

`--audiences [audiences]`
: Comma-separated list of audience GUIDs.

`--order [order]`
: Order of the home site. Must be an integer.
```

## Examples

Add a Home Site

```sh
m365 spo tenant homesite add --url "https://contoso.sharepoint.com/sites/testcomms"
```

Add a Home Site with optional parameters

```sh
m365 spo tenant homesite add --url "https://contoso.sharepoint.com/sites/testcomms" --isInDraftMode true --vivaConnectionsDefaultStart false --audiences "af8c0bc8-7b1b-44b4-b087-ffcc8df70d16,754ff15c-76b1-44cb-88c7-0065a4d3cfb7" --order 2
```
## Response

<Tabs>
<TabItem value="JSON">

```json
{
"Audiences": [],
"IsInDraftMode": true,
"IsVivaBackendSite": false,
"SiteId": "ca49054c-85f3-41eb-a290-46ffda8f219c",
"TargetedLicenseType": 0,
"Title": "testcommsite",
"Url": "https://contoso.sharepoint.com/sites/testcomms",
"VivaConnectionsDefaultStart": false,
"WebId": "256c4f0f-e372-47b4-a891-b4888e829e20"
}
```

</TabItem>
<TabItem value="Text">

```text
Audiences : []
IsInDraftMode : true
IsVivaBackendSite : false
SiteId : ca49054c-85f3-41eb-a290-46ffda8f219c
TargetedLicenseType : 0
Title : testcommsite
Url : https://contoso.sharepoint.com/sites/testcomms
VivaConnectionsDefaultStart: false
WebId : 256c4f0f-e372-47b4-a891-b4888e829e20
```

</TabItem>
<TabItem value="CSV">

```csv
IsInDraftMode,IsVivaBackendSite,SiteId,TargetedLicenseType,Title,Url,VivaConnectionsDefaultStart,WebId
1,0,ca49054c-85f3-41eb-a290-46ffda8f219c,0,testcommsite,https://contoso.sharepoint.com/sites/testcomms,0,256c4f0f-e372-47b4-a891-b4888e829e20
```

</TabItem>
<TabItem value="Markdown">

```md
# spo tenant homesite add --url "https://contoso.sharepoint.com/sites/testcomms"

Date: 12/23/2024

## testcommsite (https://contoso.sharepoint.com/sites/testcomms)

Property | Value
---------|-------
IsInDraftMode | true
IsVivaBackendSite | false
SiteId | ca49054c-85f3-41eb-a290-46ffda8f219c
TargetedLicenseType | 0
Title | testcommsite
Url | https://contoso.sharepoint.com/sites/testcomms
VivaConnectionsDefaultStart | false
WebId | 256c4f0f-e372-47b4-a891-b4888e829e20
```
</TabItem>
</Tabs>

## More information

- SharePoint home sites [Viva Connections set up](https://learn.microsoft.com/en-us/viva/connections/set-up-admin-center)

5 changes: 5 additions & 0 deletions docs/src/config/sidebars.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3766,6 +3766,11 @@ const sidebars: SidebarsConfig = {
label: 'tenant commandset set',
id: 'cmd/spo/tenant/tenant-commandset-set'
},
{
type: 'doc',
label: 'tenant homesite add',
id: 'cmd/spo/tenant/tenant-homesite-add'
},
{
type: 'doc',
label: 'tenant homesite list',
Expand Down
1 change: 1 addition & 0 deletions src/m365/spo/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,7 @@ export default {
TENANT_COMMANDSET_LIST: `${prefix} tenant commandset list`,
TENANT_COMMANDSET_REMOVE: `${prefix} tenant commandset remove`,
TENANT_COMMANDSET_SET: `${prefix} tenant commandset set`,
TENANT_HOMESITE_ADD: `${prefix} tenant homesite add`,
TENANT_HOMESITE_LIST: `${prefix} tenant homesite list`,
TENANT_RECYCLEBINITEM_LIST: `${prefix} tenant recyclebinitem list`,
TENANT_RECYCLEBINITEM_REMOVE: `${prefix} tenant recyclebinitem remove`,
Expand Down
175 changes: 175 additions & 0 deletions src/m365/spo/commands/tenant/tenant-homesite-add.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
import assert from 'assert';
import sinon from 'sinon';
import auth from '../../../../Auth.js';
import { cli } from '../../../../cli/cli.js';
import { Logger } from '../../../../cli/Logger.js';
import { CommandError } from '../../../../Command.js';
import { CommandInfo } from '../../../../cli/CommandInfo.js';
import request from '../../../../request.js';
import { telemetry } from '../../../../telemetry.js';
import { pid } from '../../../../utils/pid.js';
import { session } from '../../../../utils/session.js';
import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './tenant-homesite-add.js';

describe(commands.TENANT_HOMESITE_ADD, () => {
let log: string[];
let logger: Logger;
let loggerLogSpy: sinon.SinonSpy;
let commandInfo: CommandInfo;
const homeSite = "https://contoso.sharepoint.com/sites/testcomms";
const homeSites = {
"Audiences": [],
"IsInDraftMode": true,
"IsVivaBackendSite": false,
"SiteId": "ca49054c-85f3-41eb-a290-46ffda8f219c",
"TargetedLicenseType": 0,
"Title": "testcommsite",
"Url": homeSite,
"VivaConnectionsDefaultStart": false,
"WebId": "256c4f0f-e372-47b4-a891-b4888e829e20"
};

const homeSiteConfig = {
"Audiences": [
{
"Email": "[email protected]",
"Id": "af8c0bc8-7b1b-44b4-b087-ffcc8df70d16",
"Title": "SharingTest Members"
}
],
"IsInDraftMode": true,
"IsVivaBackendSite": false,
"SiteId": "ca49054c-85f3-41eb-a290-46ffda8f219c",
"TargetedLicenseType": 0,
"Title": "testcommsite",
"Url": "https://contoso.sharepoint.com/sites/testcomms",
"VivaConnectionsDefaultStart": false,
"WebId": "256c4f0f-e372-47b4-a891-b4888e829e20"
};

before(() => {
sinon.stub(auth, 'restoreAuth').resolves();
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
auth.connection.active = true;
auth.connection.spoUrl = 'https://contoso.sharepoint.com';
});

beforeEach(() => {
log = [];
logger = {
log: async (msg: string) => {
log.push(msg);
},
logRaw: async (msg: string) => {
log.push(msg);
},
logToStderr: async (msg: string) => {
log.push(msg);
}
};
loggerLogSpy = sinon.spy(logger, 'log');
commandInfo = cli.getCommandInfo(command);
});

afterEach(() => {
sinonUtil.restore([
request.post
]);
});

after(() => {
sinon.restore();
auth.connection.active = false;
auth.connection.spoUrl = undefined;
});

it('has correct name', () => {
assert.strictEqual(command.name, commands.TENANT_HOMESITE_ADD);
});

it('has a description', () => {
assert.notStrictEqual(command.description, null);
});

it('adds available home sites', async () => {
sinon.stub(request, 'post').callsFake(async (opts) => {
if (opts.url === `https://contoso-admin.sharepoint.com/_api/SPHSite/AddHomeSite`) {
return homeSites;
}

throw opts.url;
});

await command.action(logger, { options: { url: homeSite, verbose: true } });
assert(loggerLogSpy.calledWith(homeSites));
});

it('adds a home site with the specified URL, isInDraftMode, vivaConnectionsDefaultStart, and audiences', async () => {
sinon.stub(request, 'post').callsFake(async (opts) => {
if (opts.url === `https://contoso-admin.sharepoint.com/_api/SPHSite/AddHomeSite`) {
return homeSiteConfig;
}

throw 'Invalid request';
});

await command.action(logger, {
options: {
url: homeSite,
isInDraftMode: 'true',
vivaConnectionsDefaultStart: 'false',
audiences: 'af8c0bc8-7b1b-44b4-b087-ffcc8df70d16,754ff15c-76b1-44cb-88c7-0065a4d3cfb7',
order: 2
}
});
assert(loggerLogSpy.calledWith(homeSiteConfig));
});

it('correctly handles invalid GUID in audiences', async () => {
const result = await command.validate({
options: {
url: homeSite,
audiences: "invalidGuid,af8c0bc8-7b1b-44b4-b087-ffcc8df70d16"
}
}, commandInfo);
assert.strictEqual(result, `invalidGuid is not a valid GUID`);
});

it('correctly handles non-integer order', async () => {
const result = await command.validate({
options: {
url: homeSite,
order: 'invalid-order'
}
}, commandInfo);
assert.strictEqual(result, 'Order must be an integer');
});

it('fails validation if the url is not a valid SharePoint url', async () => {
const actual = await command.validate({
options: {
url: "test"
}
}, commandInfo);
assert.notStrictEqual(actual, true);
});

it('passes validation', async () => {
const actual = await command.validate({
options: {
url: homeSite
}
}, commandInfo);
assert.strictEqual(actual, true);
});

it('correctly handles OData error when adding a home site', async () => {
sinon.stub(request, 'post').rejects({ error: { 'odata.error': { message: { value: 'An error has occurred' } } } });

await assert.rejects(command.action(logger, { options: {} } as any), new CommandError('An error has occurred'));
});
});
Loading
Loading