Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
04bb86c
feat(arch001): add FilterOrderItems to IAdminDataScope<TEntity>
KrzysztofPajak Aug 25, 2026
e0294d1
feat(arch001): add AdminOrderDataScope (Sales-Manager-aware, not gene…
KrzysztofPajak Aug 25, 2026
54edd23
feat(arch001): add StoreOrderDataScope
KrzysztofPajak Aug 25, 2026
ebc43ef
feat(arch001): add VendorOrderDataScope with FilterOrderItems
KrzysztofPajak Aug 25, 2026
2e1d72e
feat(arch001): add RoutedOrderDataScope and register IAdminDataScope<…
KrzysztofPajak Aug 25, 2026
8456834
feat(arch001): add BaseOrderController skeleton with List region and …
KrzysztofPajak Aug 25, 2026
248d14d
feat(arch001): add Edit/PDF/search regions to BaseOrderController; wi…
KrzysztofPajak Aug 25, 2026
d35d4e2
refactor(arch001): remove Grand.Web.Vendor's duplicate IOrderViewMode…
KrzysztofPajak Aug 25, 2026
bf57ada
feat(arch001): add BaseOrderManagementController skeleton with Paymen…
KrzysztofPajak Aug 25, 2026
1c6b79d
feat(arch001): add Delete action to BaseOrderManagementController
KrzysztofPajak Aug 25, 2026
5fc265a
feat(arch001): add order totals/shipping method/user fields region
KrzysztofPajak Aug 25, 2026
d95c194
feat(arch001): add order item actions region (Save/Delete/Cancel/Rese…
KrzysztofPajak Aug 25, 2026
369cf90
feat(arch001): add license popup region
KrzysztofPajak Aug 25, 2026
90f90fd
feat(arch001): add AddProductToOrder region
KrzysztofPajak Aug 25, 2026
e614197
feat(arch001): add Addresses region
KrzysztofPajak Aug 25, 2026
ec95bf2
feat(arch001): add order notes region, preserving Admin-throws vs Sto…
KrzysztofPajak Aug 25, 2026
809385a
feat(arch001): cut Admin/Store/Vendor OrderController over to thin su…
KrzysztofPajak Aug 25, 2026
2379479
refactor(arch001): migrate Order views to Grand.Web.AdminShared, add …
KrzysztofPajak Aug 25, 2026
2fa96a2
fix(arch001): address final review findings (C1 Vendor Order view mod…
KrzysztofPajak Aug 25, 2026
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
using Grand.Business.Core.Interfaces.Common.Directory;
using Grand.Domain.Customers;
using Grand.Domain.Orders;
using Grand.Infrastructure;
using Grand.Web.AdminShared.Services;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace Grand.Web.Admin.Tests.Controllers;

[TestClass]
public class AdminOrderDataScopeTests
{
private static AdminOrderDataScope Build(bool isSalesManager, string currentCustomerSeId)
{
var customer = new Customer { SeId = currentCustomerSeId };
var workContextMock = new Mock<IWorkContext>();
workContextMock.Setup(w => w.CurrentCustomer).Returns(customer);
var contextAccessorMock = new Mock<IContextAccessor>();
contextAccessorMock.Setup(c => c.WorkContext).Returns(workContextMock.Object);

var groupServiceMock = new Mock<IGroupService>();
groupServiceMock.Setup(g => g.IsSalesManager(customer)).ReturnsAsync(isSalesManager);

return new AdminOrderDataScope(contextAccessorMock.Object, groupServiceMock.Object);
}

[TestMethod]
public async Task HasAccess_NotSalesManager_TrueRegardlessOfSeId()
{
var scope = Build(isSalesManager: false, currentCustomerSeId: "se-1");
var order = new Order { SeId = "se-2" };

Assert.IsTrue(await scope.HasAccess(order));
}

[TestMethod]
public async Task HasAccess_SalesManager_MatchingSeId_True()
{
var scope = Build(isSalesManager: true, currentCustomerSeId: "se-1");
var order = new Order { SeId = "se-1" };

Assert.IsTrue(await scope.HasAccess(order));
}

[TestMethod]
public async Task HasAccess_SalesManager_MismatchedSeId_False()
{
var scope = Build(isSalesManager: true, currentCustomerSeId: "se-1");
var order = new Order { SeId = "se-2" };

Assert.IsFalse(await scope.HasAccess(order));
}

[TestMethod]
public async Task HasAccess_NullEntity_False()
{
var scope = Build(isSalesManager: false, currentCustomerSeId: "se-1");

Assert.IsFalse(await scope.HasAccess(null));
}

[TestMethod]
public void ScopeDefaults_MatchGlobalAdminSemantics()
{
var scope = Build(isSalesManager: false, currentCustomerSeId: null);

Assert.IsNull(scope.DefaultStoreId);
Assert.IsNull(scope.DefaultVendorId);
Assert.AreEqual("Admin", scope.ResourceKeyPrefix);
Assert.IsTrue(scope.ShowStoreSelector);
}
}
Loading
Loading