예제 #1
0
        public async Task UpsertFilterExecutor_Transient_Existing_NoFilterUidProvided()
        {
            var        custUid           = Guid.NewGuid();
            var        userId            = UIDs.JWT_USER_ID;
            var        projectUid        = UIDs.MOCK_WEB_API_DIMENSIONS_PROJECT_UID;
            var        filterUid         = Guid.NewGuid();
            string     name              = string.Empty;
            FilterType filterType        = FilterType.Transient;
            string     filterJson        = "{\"designUid\":\"c2e5940c-4370-4d23-a930-b5b74a9fc22b\",\"contributingMachines\":[{\"assetID\":\"123456789\",\"machineName\":\"TheMachineName\",\"isJohnDoe\":false,\"assetUid\":null}]}";
            string     filterJsonUpdated = "{\"designUid\":\"c2e5940c-4370-4d23-a930-b5b74a9fc22b\",\"onMachineDesignID\":null,\"elevationType\":3,\"vibeStateOn\":true}";

            WriteEventToDb(new CreateFilterEvent
            {
                CustomerUID = custUid,
                UserID      = userId,
                ProjectUID  = projectUid,
                FilterUID   = filterUid,
                Name        = name,
                FilterType  = filterType,
                FilterJson  = filterJson,
                ActionUTC   = DateTime.UtcNow
            });

            var request = FilterRequestFull.Create(new HeaderDictionary(), custUid.ToString(), false, userId, new ProjectData {
                ProjectUID = projectUid.ToString()
            }, new FilterRequest {
                Name = name, FilterJson = filterJsonUpdated, FilterType = filterType
            });
            var result = await executor.ProcessAsync(request) as FilterDescriptorSingleResult;

            Assert.IsNotNull(result, "executor should always return a result");
            Assert.AreNotEqual(filterUid, result.FilterDescriptor.FilterUid, "executor returned incorrect FilterUid");
            Assert.AreEqual(name, result.FilterDescriptor.Name, "executor returned incorrect filter Name");
            Assert.AreEqual("{\"designUid\":\"c2e5940c-4370-4d23-a930-b5b74a9fc22b\",\"elevationType\":3,\"vibeStateOn\":true}", result.FilterDescriptor.FilterJson, "executor returned incorrect FilterJson");
        }
예제 #2
0
        public async Task HydrateJsonWithBoundary_InvalidBoundary2(FilterType filterType)
        {
            var log          = serviceProvider.GetRequiredService <ILoggerFactory>().CreateLogger <ValidationTests>();
            var geofenceRepo = new Mock <IGeofenceRepository>();
            var geofence     = new Geofence
            {
                GeofenceType = GeofenceType.Filter,
                GeometryWKT  =
                    "POLYGON((-115.0200886019198 36.20745605916501,-115.02005976817289 36.20734622441246,-115.01992699882665 36.2073559634608,-115.0198176988093 36.207342978062755,-115.01973320922532 36.20734027277125,-115.01974729082266 36.20738950906242,-115.01975466689743 36.2074300884,-115.01996052643932 36.20746201079744))"
            };

            // var geofence = new Geofence { GeometryWKT = "POLYGON((-115.02022874734084 36.20751287018342,-115.02025556943099 36.207300775504265,-115.02001953503766 36.20729428280093,-115.01966816565673 36.20726506562927,-115.01945493004004 36.20714170411769,-115.0192846097676 36.20734189594616,-115.01962927362601 36.20748581732266,-115.02022874734084 36.20751287018342))" };
            geofenceRepo.Setup(g => g.GetGeofence(It.IsAny <string>())).ReturnsAsync(geofence);
            //var geofenceProxy = new Mock<IGeofenceProxy>();
            //var geofenceData = new GeofenceData { GeofenceType = GeofenceType.Generic.ToString(), GeometryWKT = geofence.GeometryWKT };
            //geofenceProxy.Setup(g => g.GetGeofenceForCustomer(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<HeaderDictionary>())).ReturnsAsync(geofenceData);

            var request = FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                                   new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = "a filter",
                FilterType = filterType,
                FilterJson = "{\"designUID\": \"id\", \"vibeStateOn\": true, \"polygonUID\": \"" + boundaryUid + "\"}"
            });

            var ex = await Assert.ThrowsAsync <ServiceException>(async() => await ValidationUtil
                                                                 .HydrateJsonWithBoundary(/*geofenceProxy.Object,*/ geofenceRepo.Object, log, serviceExceptionHandler, request).ConfigureAwait(false));

            Assert.Contains("2045", ex.GetContent);
            Assert.Contains("Invalid spatial filter boundary. One or more polygon components are missing.", ex.GetContent);
        }
예제 #3
0
        public async Task HydrateJsonWithBoundary_NoGeofence(FilterType filterType)
        {
            var log          = serviceProvider.GetRequiredService <ILoggerFactory>().CreateLogger <ValidationTests>();
            var geofenceRepo = new Mock <IGeofenceRepository>();

            geofenceRepo.Setup(g => g.GetGeofence(It.IsAny <string>())).ReturnsAsync((Geofence)null);
            //var geofenceProxy = new Mock<IGeofenceProxy>();
            //geofenceProxy.Setup(g => g.GetGeofenceForCustomer(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<HeaderDictionary>())).ReturnsAsync(
            //  (GeofenceData)null);

            var request = FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                                   new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = "a filter",
                FilterType = filterType,
                FilterJson = "{\"designUID\": \"id\", \"vibeStateOn\": true, \"polygonUID\": \"" + boundaryUid + "\"}"
            });

            var ex = await Assert.ThrowsAsync <ServiceException>(async() => await ValidationUtil
                                                                 .HydrateJsonWithBoundary(/*geofenceProxy.Object,*/ geofenceRepo.Object, log, serviceExceptionHandler, request).ConfigureAwait(false));

            Assert.Contains("2040", ex.GetContent);
            Assert.Contains("Validation of Project/Boundary failed. Not allowed.", ex.GetContent);
        }
예제 #4
0
        public async Task HydrateJsonWithBoundary_InvalidBoundary(FilterType filterType)
        {
            var log          = serviceProvider.GetRequiredService <ILoggerFactory>().CreateLogger <ValidationTests>();
            var geofenceRepo = new Mock <IGeofenceRepository>();
            var geofence     = new Geofence {
                GeometryWKT = "This is not a valid polygon WKT", GeofenceType = GeofenceType.Filter
            };

            geofenceRepo.Setup(g => g.GetGeofence(It.IsAny <string>())).ReturnsAsync(geofence);
            //var geofenceProxy = new Mock<IGeofenceProxy>();
            var geofenceData = new GeofenceData {
                GeometryWKT = geofence.GeometryWKT, GeofenceType = GeofenceType.Generic.ToString()
            };
            //geofenceProxy.Setup(g => g.GetGeofenceForCustomer(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<HeaderDictionary>())).ReturnsAsync(geofenceData);

            var request = FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                                   new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = "a filter",
                FilterType = filterType,
                FilterJson = "{\"designUID\": \"id\", \"vibeStateOn\": true, \"polygonUID\": \"" + boundaryUid + "\"}"
            });

            var ex = await Assert.ThrowsAsync <ServiceException>(async() => await ValidationUtil
                                                                 .HydrateJsonWithBoundary(/*geofenceProxy.Object,*/ geofenceRepo.Object, log, serviceExceptionHandler, request).ConfigureAwait(false));

            Assert.Contains("2045", ex.GetContent);
            Assert.Contains("Invalid spatial filter boundary. One or more polygon components are missing.", ex.GetContent);
        }
예제 #5
0
        public async Task UpsertFilterExecutor_Transient_Existing_FilterUidNotSupported()
        {
            var        custUid           = Guid.NewGuid();
            var        userId            = Guid.NewGuid();
            var        projectUid        = Guid.NewGuid();
            var        filterUid         = Guid.NewGuid();
            string     name              = string.Empty;
            FilterType filterType        = FilterType.Transient;
            string     filterJson        = "{\"designUID\":\"c2e5940c-4370-4d23-a930-b5b74a9fc22b\",\"contributingMachines\":[{\"assetID\":\"123456789\",\"machineName\":\"TheMachineName\",\"isJohnDoe\":false,\"assetUid\":null}]}";
            string     filterJsonUpdated = "{\"designUID\":\"c2e5940c-4370-4d23-a930-b5b74a9fc22b\",\"onMachineDesignID\":null,\"elevationType\":3,\"vibeStateOn\":true}";

            WriteEventToDb(new CreateFilterEvent
            {
                CustomerUID = custUid,
                UserID      = userId.ToString(),
                ProjectUID  = projectUid,
                FilterUID   = filterUid,
                Name        = name,
                FilterType  = filterType,
                FilterJson  = filterJson,
                ActionUTC   = DateTime.UtcNow
            });

            var request = FilterRequestFull.Create(new HeaderDictionary(), custUid.ToString(), false, userId.ToString(), new ProjectData {
                ProjectUID = projectUid.ToString()
            }, new FilterRequest {
                FilterUid = filterUid.ToString(), Name = name, FilterJson = filterJsonUpdated, FilterType = filterType
            });
            var ex = await Assert.ThrowsExceptionAsync <ServiceException>(async() => await executor.ProcessAsync(request)).ConfigureAwait(false);

            Assert.AreNotEqual(-1, ex.GetContent.IndexOf("2016", StringComparison.Ordinal), "executor threw exception but incorrect code");
            Assert.AreNotEqual(-1, ex.GetContent.IndexOf("UpsertFilter failed. Transient filter not updateable, should not have filterUid provided.", StringComparison.Ordinal), "executor threw exception but incorrect messaage");
        }
예제 #6
0
        /// <summary>
        /// Store the filter in the database and notify Raptor of a filter change
        /// </summary>
        protected async Task <T> StoreFilterAndNotifyRaptor <T>(FilterRequestFull filterRequest, int[] errorCodes) where T : IFilterEvent
        {
            var filterEvent = default(T);

            try
            {
                filterEvent           = AutoMapperUtility.Automapper.Map <T>(filterRequest);
                filterEvent.ActionUTC = DateTime.UtcNow;

                var count = await((IFilterRepository)Repository).StoreEvent(filterEvent);
                if (count == 0)
                {
                    serviceExceptionHandler.ThrowServiceException(HttpStatusCode.InternalServerError, errorCodes[0]);
                }
                else
                {
                    // It's not necessary to invalidate the Raptor services proxy filter cache when a filter is created, or if it's transient.
                    if (filterRequest.FilterType == FilterType.Transient || filterEvent is CreateFilterEvent)
                    {
                        return(filterEvent);
                    }

                    _ = Task.Run(() => NotifyProductivity3D(filterRequest));
                }
            }
            catch (Exception e)
            {
                serviceExceptionHandler.ThrowServiceException(HttpStatusCode.InternalServerError, errorCodes[1], e.Message);
            }

            return(filterEvent);
        }
예제 #7
0
        public async Task HydrateJsonWithBoundary_HappyPath_Custom(FilterType filterType)
        {
            var log          = serviceProvider.GetRequiredService <ILoggerFactory>().CreateLogger <ValidationTests>();
            var geofenceRepo = new Mock <IGeofenceRepository>();
            var geofence     = new Geofence {
                GeofenceUID = boundaryUid, Name = Name, GeometryWKT = GeometryWKT, GeofenceType = GeofenceType.Filter
            };

            geofenceRepo.Setup(g => g.GetGeofence(It.IsAny <string>())).ReturnsAsync(geofence);
            //var geofenceProxy = new Mock<IGeofenceProxy>();
            var request = FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                                   new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = "a filter",
                FilterType = filterType,
                FilterJson = "{\"designUid\": \"id\", \"vibeStateOn\": true, \"polygonUid\": \"" + geofence.GeofenceUID +
                             "\"}"
            });

            var result = await ValidationUtil
                         .HydrateJsonWithBoundary(/*geofenceProxy.Object,*/ geofenceRepo.Object, log, serviceExceptionHandler, request).ConfigureAwait(false);

            var expectedResult =
                "{\"designUid\":\"id\",\"vibeStateOn\":true,\"polygonUid\":\"" + geofence.GeofenceUID +
                "\",\"polygonName\":\"" + geofence.Name +
                "\",\"polygonLL\":[{\"Lat\":12.677856,\"Lon\":80.257874},{\"Lat\":13.039345,\"Lon\":79.856873},{\"Lat\":13.443052,\"Lon\":80.375977}]," +
                "\"polygonType\":" + (int)geofence.GeofenceType + "}";

            Assert.Equal(expectedResult, result);
        }
예제 #8
0
        public void MapFilterRequestToCreateFilterEvent_UserContext_NoFilterUID(FilterType filterType)
        {
            var filterRequest = FilterRequestFull.Create
                                (
                null,
                Guid.NewGuid().ToString(),
                false,
                Guid.NewGuid().ToString(),
                new ProjectData {
                ProjectUID = Guid.NewGuid().ToString()
            },
                new FilterRequest {
                FilterUid = Guid.NewGuid().ToString(), Name = "the name", FilterJson = "the Json", FilterType = filterType
            }
                                );

            filterRequest.FilterUid = Guid.NewGuid().ToString();

            var result = AutoMapperUtility.Automapper.Map <CreateFilterEvent>(filterRequest);

            Assert.Equal(filterRequest.CustomerUid, result.CustomerUID.ToString());
            Assert.Equal(filterRequest.UserId, result.UserID);
            Assert.Equal(filterRequest.ProjectUid, result.ProjectUID.ToString());
            Assert.Equal(filterRequest.FilterUid, result.FilterUID.ToString());
            Assert.Equal(filterRequest.Name, result.Name);
            Assert.Equal(filterRequest.FilterJson, result.FilterJson);
            Assert.Equal(filterRequest.FilterType, result.FilterType);
        }
예제 #9
0
        public void FilterRequestValidation_InvalidAlignment(FilterType filterType)
        {
            var alignmentUid = Guid.NewGuid().ToString();
            var startStation = 100.456;
            var leftOffset   = 4.5;
            var rightOffset  = 2.5;

            var request = FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                                   new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = "a filter",
                FilterType = filterType,
                FilterJson = "{\"vibeStateOn\": true, \"alignmentUid\": \"" + alignmentUid + "\", \"startStation\":" +
                             startStation + ", \"endStation\": null, \"leftOffset\":" + leftOffset + ", \"rightOffset\":" +
                             rightOffset + "}"
            });

            var ex = Assert.Throws <ServiceException>(() => request.Validate(serviceExceptionHandler));

            Assert.Contains("2065", ex.GetContent);
            Assert.Contains("Invalid alignment filter. Start or end station are invalid.", ex.GetContent);
        }
예제 #10
0
        protected FilterRequestFull CreateAndValidateRequest(
            ProjectData projectData,
            bool isApplicationContext = false,
            string userId             = null,
            string filterUid          = null,
            string name           = null,
            string filterJson     = "",
            string boundaryUid    = null,
            string customerUid    = null,
            FilterType filterType = FilterType.Transient,
            bool onlyFilterUid    = false)
        {
            var request = FilterRequestFull.Create(
                new HeaderDictionary(),
                customerUid ?? Guid.NewGuid().ToString(),
                isApplicationContext,
                userId ?? Guid.NewGuid().ToString(),
                projectData ?? new ProjectData()
            {
                ProjectUID = Guid.NewGuid().ToString()
            },
                new FilterRequest
            {
                FilterUid  = filterUid ?? Guid.NewGuid().ToString(),
                Name       = name,
                FilterType = filterType,
                FilterJson = filterJson
            });

            request.Validate(ServiceExceptionHandler, onlyFilterUid);

            return(request);
        }
예제 #11
0
        /// <summary>
        /// Notify 3dpm service that a filter has been added/updated/deleted.
        /// </summary>
        private async Task NotifyProductivity3D(FilterRequestFull filterRequest)
        {
            BaseMasterDataResult notificationResult = null;

            try
            {
                notificationResult = await Productivity3dV2ProxyNotification.NotifyFilterChange(new Guid(filterRequest.FilterUid),
                                                                                                new Guid(filterRequest.ProjectUid), filterRequest.CustomHeaders);
            }
            catch (ServiceException se)
            {
                log.LogError(se, $"FilterExecutorBase: RaptorServices failed with service exception. FilterUid:{filterRequest.FilterUid}.");
                //rethrow this to surface it
                throw;
            }
            catch (Exception e)
            {
                log.LogError(e, $"FilterExecutorBase: RaptorServices failed with exception. FilterUid:{filterRequest.FilterUid}.");
                serviceExceptionHandler.ThrowServiceException(HttpStatusCode.InternalServerError, 30, "Productivity3dV2ProxyNotification.NotifyFilterChange", e.Message);
            }

            log.LogDebug(
                $"FilterExecutorBase: NotifyFilterChange in RaptorServices returned code: {notificationResult?.Code ?? -1} Message {notificationResult?.Message ?? "notificationResult == null"}.");

            if (notificationResult != null && notificationResult.Code != 0)
            {
                serviceExceptionHandler.ThrowServiceException(HttpStatusCode.InternalServerError, 29, notificationResult.Code.ToString(), notificationResult.Message);
            }
        }
예제 #12
0
        public async Task HydrateJsonWithBoundary_IncludeAlignment(FilterType filterType)
        {
            var log          = serviceProvider.GetRequiredService <ILoggerFactory>().CreateLogger <ValidationTests>();
            var geofenceRepo = new Mock <IGeofenceRepository>();
            //var geofenceProxy = new Mock<IGeofenceProxy>();
            var alignmentUid = Guid.NewGuid().ToString();
            var startStation = 100.456;
            var endStation   = 200.5;
            var leftOffset   = 4.5;
            var rightOffset  = 2.5;

            var request = FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                                   new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = "a filter",
                FilterType = filterType,
                FilterJson = "{\"designUID\": \"id\", \"vibeStateOn\": true, \"alignmentUid\": \"" + alignmentUid +
                             "\", \"startStation\":" + startStation + ", \"endStation\":" + endStation + ", \"leftOffset\":" +
                             leftOffset + ", \"rightOffset\":" + rightOffset + "}"
            });

            var result = await ValidationUtil
                         .HydrateJsonWithBoundary(/*geofenceProxy.Object,*/ geofenceRepo.Object, log, serviceExceptionHandler, request).ConfigureAwait(false);

            Assert.Equal(request.FilterJson, result);
        }
예제 #13
0
        /// <summary>
        /// Creates the requested filter
        /// </summary>
        private async Task <FilterDescriptorSingleResult> CreateFilter(FilterRequestFull filterRequest)
        {
            var isTransient = filterRequest.FilterType == FilterType.Transient;

            filterRequest.FilterUid = Guid.NewGuid().ToString();
            var createFilterEvent = await StoreFilterAndNotifyRaptor <CreateFilterEvent>(filterRequest, isTransient?new[] { 19, 20 } : new[] { 24, 25 });

            return(RetrieveFilter(createFilterEvent));
        }
예제 #14
0
        private Task <string> CombineFilters(FilterRequestFull request)
        {
            if (request.HierarchicFilterUids == null || request.HierarchicFilterUids.Count == 0)
            {
                return(Task.FromResult(request.FilterJson));
            }

            return(FilterCombiner.Combine(request, (IFilterRepository)Repository, serviceExceptionHandler, log));
        }
예제 #15
0
        public async Task GetFiltersExecutor()
        {
            string custUid    = Guid.NewGuid().ToString();
            string userUid    = Guid.NewGuid().ToString();
            string projectUid = Guid.NewGuid().ToString();
            string filterUid  = Guid.NewGuid().ToString();
            string name       = "blah";

            var configStore = serviceProvider.GetRequiredService <IConfigurationStore>();
            var logger      = serviceProvider.GetRequiredService <ILoggerFactory>();

            var filterRepo = new Mock <FilterRepository>(configStore, logger);
            var filters    = new List <MasterData.Repositories.DBModels.Filter>
            {
                new MasterData.Repositories.DBModels.Filter
                {
                    CustomerUid     = custUid,
                    UserId          = userUid,
                    ProjectUid      = projectUid,
                    FilterUid       = filterUid,
                    Name            = name,
                    FilterJson      = "{\"dateRangeType\":\"0\",\"elevationType\":null}",
                    FilterType      = FilterType.Persistent,
                    LastActionedUtc = DateTime.UtcNow
                }
            };

            filterRepo.As <IFilterRepository>().Setup(ps => ps.GetFiltersForProjectUser(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), false)).ReturnsAsync(filters);

            var filterListToTest = new FilterDescriptorListResult
            {
                FilterDescriptors = filters
                                    .Select(filter => AutoMapperUtility.Automapper.Map <FilterDescriptor>(filter))
                                    .ToImmutableList()
            };

            var request = FilterRequestFull.Create
                          (
                null,
                custUid,
                false,
                userUid,
                new ProjectData {
                ProjectUID = projectUid
            });

            var executor =
                RequestExecutorContainer.Build <GetFiltersExecutor>(configStore, logger, serviceExceptionHandler,
                                                                    filterRepo.Object, null);
            var filterListResult = await executor.ProcessAsync(request) as FilterDescriptorListResult;

            Assert.NotNull(filterListResult);
            Assert.Equal(filterListToTest.FilterDescriptors[0].FilterUid, filterListResult.FilterDescriptors[0].FilterUid);
            Assert.Equal(filterListToTest.FilterDescriptors[0].Name, filterListResult.FilterDescriptors[0].Name);
            Assert.Equal("{\"dateRangeType\":0,\"dateRangeName\":\"Today\"}", filterListResult.FilterDescriptors[0].FilterJson);
            Assert.Equal(filterListToTest.FilterDescriptors[0].FilterType, filterListResult.FilterDescriptors[0].FilterType);
        }
예제 #16
0
        public void FilterRequestValidation_PartialFill()
        {
            var requestFull =
                FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            });

            requestFull.Validate(serviceExceptionHandler);
        }
예제 #17
0
        private Task <FilterDescriptorSingleResult> ProcessTransient(FilterRequestFull filterRequest)
        {
            // if filterUid supplied, then exception as cannot update a transient filter
            // else create new one Note that can have duplicate transient name (i.e. "") per cust/prj/user
            if (!string.IsNullOrEmpty(filterRequest.FilterUid))
            {
                serviceExceptionHandler.ThrowServiceException(HttpStatusCode.BadRequest, 16);
            }

            return(CreateFilter(filterRequest));
        }
예제 #18
0
        public void FilterRequestValidation_MissingProjectUid()
        {
            var requestFull =
                FilterRequestFull.Create(null, custUid, false, userUid, null,
                                         new FilterRequest {
                FilterUid = filterUid, Name = Name, FilterJson = FilterJson, FilterType = filterType
            });
            var ex = Assert.Throws <ServiceException>(() => requestFull.Validate(serviceExceptionHandler));

            Assert.Contains("2001", ex.GetContent);
            Assert.Contains("Invalid projectUid.", ex.GetContent);
        }
예제 #19
0
        public void FilterRequestValidation_InvalidFilterJson()
        {
            var requestFull =
                FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                         new FilterRequest {
                FilterUid = filterUid, Name = Name, FilterJson = null, FilterType = filterType
            });

            requestFull.Validate(serviceExceptionHandler);
        }
예제 #20
0
        public async Task GetFilterExecutor_ExistingFilter(FilterType filterType)
        {
            var    custUid    = Guid.NewGuid();
            var    userId     = Guid.NewGuid();
            var    projectUid = Guid.NewGuid();
            var    filterUid  = Guid.NewGuid();
            string name       = "blah";
            string filterJson = "{\"dateRangeType\":1,\"elevationType\":null}";

            WriteEventToDb(new CreateFilterEvent
            {
                CustomerUID = custUid,
                UserID      = userId.ToString(),
                ProjectUID  = projectUid,
                FilterUID   = filterUid,
                Name        = name,
                FilterType  = filterType,
                FilterJson  = filterJson,
                ActionUTC   = DateTime.UtcNow
            });

            var request = FilterRequestFull.Create(null, custUid.ToString(), false, userId.ToString(), new ProjectData()
            {
                ProjectUID = projectUid.ToString()
            }, new FilterRequest {
                FilterUid = filterUid.ToString(), FilterType = filterType
            });

            var executor =
                RequestExecutorContainer.Build <GetFilterExecutor>(ConfigStore, Logger, ServiceExceptionHandler, FilterRepo, null);
            var result = await executor.ProcessAsync(request).ConfigureAwait(false) as FilterDescriptorSingleResult;

            var filterToTest = new FilterDescriptorSingleResult(
                new FilterDescriptor
            {
                FilterUid  = filterUid.ToString(),
                Name       = name,
                FilterType = filterType,
                FilterJson = filterJson
            }
                );

            Assert.IsNotNull(result, Responses.ShouldReturnResult);
            Assert.AreEqual(filterToTest.FilterDescriptor.FilterUid, result.FilterDescriptor.FilterUid,
                            Responses.IncorrectFilterDescriptorFilterUid);
            Assert.AreEqual(filterToTest.FilterDescriptor.Name, result.FilterDescriptor.Name,
                            Responses.IncorrectFilterDescriptorName);
            Assert.AreEqual("{\"dateRangeType\":1,\"dateRangeName\":\"Yesterday\"}", result.FilterDescriptor.FilterJson,
                            Responses.IncorrectFilterDescriptorFilterJson);
            Assert.AreEqual(filterToTest.FilterDescriptor.FilterType, result.FilterDescriptor.FilterType,
                            Responses.IncorrectFilterDescriptorFilterType);
        }
예제 #21
0
        public async Task DeleteFilterExecutor(FilterType filterType)
        {
            string custUid    = Guid.NewGuid().ToString();
            string userUid    = Guid.NewGuid().ToString();
            string projectUid = Guid.NewGuid().ToString();
            string filterUid  = Guid.NewGuid().ToString();
            string name       = "not entry";
            string filterJson = "theJsonString";

            var configStore = serviceProvider.GetRequiredService <IConfigurationStore>();
            var logger      = serviceProvider.GetRequiredService <ILoggerFactory>();

            var projectProxy = new Mock <IProjectProxy>();
            var productivity3dV2ProxyNotification = new Mock <IProductivity3dV2ProxyNotification>();

            productivity3dV2ProxyNotification.Setup(ps => ps.NotifyFilterChange(It.IsAny <Guid>(), It.IsAny <Guid>(), null)).ReturnsAsync(new BaseMasterDataResult());

            var filterRepo = new Mock <FilterRepository>(configStore, logger);
            var filters    = new List <MasterData.Repositories.DBModels.Filter>
            {
                new MasterData.Repositories.DBModels.Filter
                {
                    CustomerUid     = custUid,
                    UserId          = userUid,
                    ProjectUid      = projectUid,
                    FilterUid       = filterUid,
                    Name            = name,
                    FilterJson      = filterJson,
                    FilterType      = filterType,
                    LastActionedUtc = DateTime.UtcNow
                }
            };

            filterRepo.As <IFilterRepository>().Setup(ps => ps.GetFiltersForProjectUser(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), true)).ReturnsAsync(filters);
            filterRepo.As <IFilterRepository>().Setup(ps => ps.StoreEvent(It.IsAny <DeleteFilterEvent>())).ReturnsAsync(1);

            var request =
                FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            }, new FilterRequest {
                FilterUid = filterUid, Name = name, FilterJson = filterJson, FilterType = filterType
            });
            var executor = RequestExecutorContainer.Build <DeleteFilterExecutor>(configStore, logger, serviceExceptionHandler,
                                                                                 filterRepo.Object, null, projectProxy.Object,
                                                                                 productivity3dV2ProxyNotification: productivity3dV2ProxyNotification.Object);
            var result = await executor.ProcessAsync(request);

            Assert.NotNull(result);
            Assert.Equal(0, result.Code);
        }
예제 #22
0
        public void FilterRequestValidation_Should_fail_When_supplied_string_is_invalid_json()
        {
            var requestFull = FilterRequestFull.Create(null, custUid, false, userUid,
                                                       new ProjectData {
                ProjectUID = projectUid
            },
                                                       new FilterRequest {
                FilterUid = filterUid, Name = Name, FilterJson = "de blah", FilterType = filterType
            });
            var ex = Assert.Throws <ServiceException>(() => requestFull.Validate(serviceExceptionHandler));

            Assert.Contains("2042", ex.GetContent);
            Assert.Contains("Invalid filterJson. Exception: ", ex.GetContent);
        }
예제 #23
0
        /// <summary>
        /// Validates and saves a single filter. Also creates the project-geofence association if the filter contains a polygon boundary.
        /// </summary>
        private async Task <FilterDescriptorSingleResult> UpsertFilter(UpsertFilterExecutor filterExecutor, ProjectData project, FilterRequest filterRequest)
        {
            var requestFull = FilterRequestFull.Create(
                Request.Headers.GetCustomHeaders(),
                CustomerUid,
                IsApplication,
                GetUserId,
                project,
                filterRequest);

            requestFull.Validate(ServiceExceptionHandler);

            return(await filterExecutor.ProcessAsync(requestFull) as FilterDescriptorSingleResult);
        }
예제 #24
0
        public async Task GetFilterExecutor_DoesntBelongToUser(FilterType filterType)
        {
            string custUid           = Guid.NewGuid().ToString();
            string requestingUserUid = Guid.NewGuid().ToString();
            string filterUserUid     = Guid.NewGuid().ToString();
            string projectUid        = Guid.NewGuid().ToString();
            string filterUid         = Guid.NewGuid().ToString();
            string name       = "blah";
            string filterJson = "{{\"dateRangeType\":\"0\",\"elevationType\":null}}";

            var configStore = serviceProvider.GetRequiredService <IConfigurationStore>();
            var logger      = serviceProvider.GetRequiredService <ILoggerFactory>();

            var filterRepo = new Mock <FilterRepository>(configStore, logger);
            var filter     = new MasterData.Repositories.DBModels.Filter
            {
                CustomerUid     = custUid,
                UserId          = filterUserUid,
                ProjectUid      = projectUid,
                FilterUid       = filterUid,
                Name            = name,
                FilterJson      = filterJson,
                FilterType      = filterType,
                LastActionedUtc = DateTime.UtcNow
            };

            filterRepo.As <IFilterRepository>().Setup(ps => ps.GetFilter(It.IsAny <string>())).ReturnsAsync(filter);

            var request = FilterRequestFull.Create
                          (
                null,
                custUid,
                false,
                requestingUserUid,
                new ProjectData {
                ProjectUID = projectUid
            },
                new FilterRequest {
                FilterUid = filterUid
            }
                          );
            var executor =
                RequestExecutorContainer.Build <GetFilterExecutor>(configStore, logger, serviceExceptionHandler,
                                                                   filterRepo.Object, null);
            var ex = await Assert.ThrowsAsync <ServiceException>(async() => await executor.ProcessAsync(request));

            Assert.Contains("2036", ex.GetContent);
            Assert.Contains("GetFilter By filterUid. The requested filter does not exist, or does not belong to the requesting customer; project or user.", ex.GetContent);
        }
예제 #25
0
        public void FilterRequestValidation_MissingName()
        {
            var requestFull =
                FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                         new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = string.Empty,
                FilterJson = string.Empty,
                FilterType = filterType
            });

            Assert.Throws <ServiceException>(() => requestFull.Validate(serviceExceptionHandler));
        }
예제 #26
0
        public void FilterRequestValidation_InvalidName()
        {
            var requestFull =
                FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                         new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = null,
                FilterJson = string.Empty,
                FilterType = FilterType.Transient
            });

            requestFull.Validate(serviceExceptionHandler);
        }
예제 #27
0
        public void FilterRequestValidation_Should_succeed_When_supplied_json_is_valid(string filterJson)
        {
            var requestFull =
                FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                         new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = string.Empty,
                FilterJson = filterJson,
                FilterType = FilterType.Transient
            });

            requestFull.Validate(serviceExceptionHandler);
        }
예제 #28
0
        public async Task UpsertFilterExecutor_Persistent_ExistingName_FilterUidProvided_ChangeJson()
        {
            //Note: this test only applies to persistent filters not report filters.
            //Report filters are allowed duplicate names.

            var    custUid           = Guid.NewGuid();
            var    userId            = Guid.NewGuid();
            var    projectUid        = Guid.NewGuid();
            var    filterUid1        = Guid.NewGuid();
            var    filterUid2        = Guid.NewGuid();
            string name              = "theName";
            string filterJson        = "{\"designUID\":\"c2e5940c-4370-4d23-a930-b5b74a9fc22b\",\"contributingMachines\":[{\"assetID\":\"123456789\",\"machineName\":\"TheMachineName\",\"isJohnDoe\":false,\"assetUid\":null}]}";
            string filterJsonUpdated = "{\"designUID\":\"c2e5940c-4370-4d23-a930-b5b74a9fc22b\",\"onMachineDesignID\":null,\"elevationType\":3,\"vibeStateOn\":true}";
            var    filterType        = FilterType.Persistent;

            var filterEvent = new CreateFilterEvent
            {
                CustomerUID = custUid,
                UserID      = userId.ToString(),
                ProjectUID  = projectUid,
                FilterUID   = filterUid1,
                Name        = name,
                FilterType  = filterType,
                FilterJson  = filterJson,
                ActionUTC   = DateTime.UtcNow
            };

            WriteEventToDb(filterEvent);

            filterEvent.FilterUID = filterUid2;
            filterEvent.Name      = "something else";

            WriteEventToDb(filterEvent);

            // now try to change the 2nd filter to the name of the first
            var request = FilterRequestFull.Create(new HeaderDictionary(), custUid.ToString(), false, userId.ToString(), new ProjectData {
                ProjectUID = projectUid.ToString()
            }, new FilterRequest {
                FilterUid = filterUid2.ToString(), Name = name, FilterJson = filterJsonUpdated, FilterType = filterType
            });
            var ex = await Assert.ThrowsExceptionAsync <ServiceException>(async() => await executor.ProcessAsync(request)).ConfigureAwait(false);

            var content = ex.GetContent;

            Assert.AreNotEqual(-1, content.IndexOf("2039", StringComparison.Ordinal), "executor threw exception but incorrect code");
            Assert.AreNotEqual(-1, content.IndexOf("UpsertFilter failed. Unable to add persistent filter as Name already exists.", StringComparison.Ordinal), "executor threw exception but incorrect messaage");
        }
예제 #29
0
        /// <summary>
        /// Takes a set of filters expressed as filter UIDs and combination roles and produces a JSON encoded filter
        /// representing the combined filters
        /// </summary>
        /// <param name="request"></param>
        /// <param name="repository"></param>
        /// <param name="serviceExceptionHandler"></param>
        /// <param name="log"></param>
        /// <returns></returns>
        public static async Task <string> Combine(FilterRequestFull request, IFilterRepository repository, IServiceExceptionHandler serviceExceptionHandler, ILogger log)
        {
            var filters =
                (await repository.GetFiltersForProjectUser(request.CustomerUid, request.ProjectUid, request.UserId, true).ConfigureAwait(false))
                .Where(x => request.HierarchicFilterUids.Any(f => string.Equals(f.FilterUid, x.FilterUid, StringComparison.OrdinalIgnoreCase)))
                .ToList();

            if (filters.Count != request.HierarchicFilterUids.Count)
            {
                serviceExceptionHandler.ThrowServiceException(HttpStatusCode.BadRequest, 11);
            }

            log.LogDebug($"CombineFilters retrieved {request.HierarchicFilterUids.Count} requested filters to combine");

            // Perform the operations to combine the selected filters
            return(JsonConvert.SerializeObject(CombineFilters(request, filters)));
        }
예제 #30
0
        public void FilterRequestValidation_ValidPassCountRange(FilterType filterType)
        {
            var minPassCount = 5;
            var maxPassCount = 8;

            var request = FilterRequestFull.Create(null, custUid, false, userUid, new ProjectData {
                ProjectUID = projectUid
            },
                                                   new FilterRequest
            {
                FilterUid  = filterUid,
                Name       = "a filter",
                FilterType = filterType,
                FilterJson = "{\"vibeStateOn\": true, \"passCountRangeMin\": \"" + minPassCount + "\", \"passCountRangeMax\": \"" + maxPassCount + "\" }"
            });

            request.Validate(serviceExceptionHandler);
        }