示例#1
0
        private IMember GetMember(ParsedResume parsedResume)
        {
            var country = _locationQuery.GetCountry(Country);

            return(new Member
            {
                Address = new Address {
                    Location = _locationQuery.ResolveLocation(country, parsedResume.Address.Location)
                },
                AffiliateId = null,
                DateOfBirth = parsedResume.DateOfBirth,
                EthnicStatus = Defaults.EthnicStatus,
                FirstName = parsedResume.FirstName,
                Gender = Defaults.Gender,
                LastName = parsedResume.LastName,
                EmailAddresses = parsedResume.EmailAddresses == null || parsedResume.EmailAddresses.Count == 0
                    ? null
                    : (from e in parsedResume.EmailAddresses select new EmailAddress {
                    Address = e.Address, IsVerified = e.IsVerified
                }).ToList(),
                PhoneNumbers = parsedResume.PhoneNumbers == null || parsedResume.PhoneNumbers.Count == 0
                    ? null
                    : (from p in parsedResume.PhoneNumbers select new PhoneNumber {
                    Number = p.Number, Type = p.Type
                }).ToList(),
                PhotoId = null,
                VisibilitySettings = new VisibilitySettings(),
            });
        }
示例#2
0
        static TestBase()
        {
            Credentials data = JsonSerializer.Deserialize <Credentials>(File.ReadAllText("credentials.json"));

            GeocodeCredentials = new GeocodeCredentials()
            {
                Provider    = GeocodeProvider.Google,
                ProviderKey = data.GeocodeProviderKey
            };

            Client = new SovrenClient(data.AccountId, data.ServiceKey, new DataCenter("https://rest-local.sovren.com", "v10", true));

            ParseResumeResponseValue parseResumeResponseValue = Client.ParseResume(new ParseRequest(TestData.Resume)).Result.Value;

            TestParsedResume = parseResumeResponseValue.ResumeData;

            parseResumeResponseValue    = Client.ParseResume(new ParseRequest(TestData.ResumeWithAddress)).Result.Value;
            TestParsedResumeWithAddress = parseResumeResponseValue.ResumeData;

            ParseJobResponseValue parseJobResponseValue = Client.ParseJob(new ParseRequest(TestData.JobOrder)).Result.Value;

            TestParsedJob = parseJobResponseValue.JobData;

            parseJobResponseValue    = Client.ParseJob(new ParseRequest(TestData.JobOrderWithAddress)).Result.Value;
            TestParsedJobWithAddress = parseJobResponseValue.JobData;

            parseJobResponseValue = Client.ParseJob(new ParseRequest(TestData.JobOrderTech)).Result.Value;
            TestParsedJobTech     = parseJobResponseValue.JobData;
        }
示例#3
0
 void IResumesRepository.CreateParsedResume(ParsedResume parsedResume)
 {
     using (var dc = CreateContext())
     {
         dc.ParsedResumeEntities.InsertOnSubmit(parsedResume.Map());
         dc.SubmitChanges();
     }
 }
示例#4
0
        public void TestEmptyResume()
        {
            var parsedResume = new ParsedResume {
                Id = Guid.NewGuid(), Resume = new Resume()
            };

            _parsedResumesCommand.CreateParsedResume(parsedResume);
            AssertParsedResume(parsedResume, _resumesQuery.GetParsedResume(parsedResume.Id));
        }
示例#5
0
 private static void AssertParsedResume(ParsedResume expectedParsedResume, ParsedResume parsedResume)
 {
     Assert.AreEqual(expectedParsedResume.FirstName, parsedResume.FirstName);
     Assert.AreEqual(expectedParsedResume.LastName, parsedResume.LastName);
     Assert.AreEqual(expectedParsedResume.Address, parsedResume.Address);
     Assert.AreEqual(expectedParsedResume.DateOfBirth, parsedResume.DateOfBirth);
     Assert.IsTrue(expectedParsedResume.PhoneNumbers.NullableCollectionEqual(parsedResume.PhoneNumbers));
     Assert.IsTrue(expectedParsedResume.EmailAddresses.NullableCollectionEqual(parsedResume.EmailAddresses));
     AssertResume(expectedParsedResume.Resume, parsedResume.Resume);
 }
示例#6
0
        public void TestDeleteNoResume()
        {
            var parsedResume = new ParsedResume {
                Id = Guid.NewGuid()
            };

            _parsedResumesCommand.CreateParsedResume(parsedResume);
            AssertParsedResume(parsedResume, _resumesQuery.GetParsedResume(parsedResume.Id));

            _parsedResumesCommand.DeleteParsedResume(parsedResume.Id);
            Assert.IsNull(_resumesQuery.GetParsedResume(parsedResume.Id));
        }
示例#7
0
 private static void Prepare(ParsedResume parsedResume)
 {
     if (parsedResume.Resume != null)
     {
         var now = DateTime.Now;
         parsedResume.Resume.CreatedTime     = now;
         parsedResume.Resume.LastUpdatedTime = now;
     }
     if (parsedResume.Resume != null && parsedResume.Resume.IsEmpty)
     {
         parsedResume.Resume = null;
     }
     parsedResume.Prepare();
 }
示例#8
0
        public void TestResume()
        {
            var other        = string.Format(OtherFormat, 1);
            var parsedResume = new ParsedResume {
                Id = Guid.NewGuid(), Resume = new Resume {
                    Other = other
                }
            };

            _parsedResumesCommand.CreateParsedResume(parsedResume);

            AssertParsedResume(parsedResume, _resumesQuery.GetParsedResume(parsedResume.Id));
            AssertResume(parsedResume.Resume, _resumesQuery.GetResume(parsedResume.Resume.Id));
        }
示例#9
0
        /// <summary>
        /// Create a Matching UI session to find matches for a non-indexed resume
        /// </summary>
        /// <param name="sovClient">The SovrenClient</param>
        /// <param name="resume">The resume (generated by the Sovren Resume Parser) to use as the source for a match query</param>
        /// <param name="indexesToQuery">The indexes to find results in. These must all be of the same type (resumes or jobs)</param>
        /// <param name="preferredWeights">
        /// The preferred category weights for scoring the results. If none are provided,
        /// Sovren will determine the best values based on the source resume
        /// </param>
        /// <param name="filters">Any filters to apply prior to the match (a result must satisfy all the filters)</param>
        /// <param name="settings">Settings for this match</param>
        /// <param name="numResults">The number of results to show. If not specified, the default will be used.</param>
        /// <exception cref="SovrenException">Thrown when an API error occurs</exception>
        public static async Task <GenerateUIResponse> Match(
            this SovrenClientWithUI sovClient,
            ParsedResume resume,
            IEnumerable <string> indexesToQuery,
            CategoryWeights preferredWeights = null,
            FilterCriteria filters           = null,
            SearchMatchSettings settings     = null,
            int numResults = 0)
        {
            MatchResumeRequest   request   = sovClient.InternalClient.CreateRequest(resume, indexesToQuery, preferredWeights, filters, settings, numResults);
            UIMatchResumeRequest uiRequest = new UIMatchResumeRequest(request, sovClient.UISessionOptions);

            return(await sovClient.InternalClient.UIMatch(uiRequest));
        }
示例#10
0
        public static ParsedResumeEntity Map(this ParsedResume parsedResume)
        {
            var entity = new ParsedResumeEntity
            {
                id           = parsedResume.Id,
                firstName    = parsedResume.FirstName,
                lastName     = parsedResume.LastName,
                street       = parsedResume.Address == null ? null : parsedResume.Address.Street,
                location     = parsedResume.Address == null ? null : parsedResume.Address.Location,
                ResumeEntity = parsedResume.Resume == null ? null : parsedResume.Resume.Map()
            };

            parsedResume.MapTo((IHavePhoneNumbersEntity)entity);
            parsedResume.MapTo((IHaveEmailAddressesEntity)entity);
            parsedResume.DateOfBirth.MapTo(entity);
            return(entity);
        }
示例#11
0
 private Member CreateMember(string firstName, string lastName, ParsedResume parsedResume)
 {
     return(new Member
     {
         FirstName = firstName,
         LastName = lastName,
         IsEnabled = true,
         VisibilitySettings = new VisibilitySettings(),
         Address = new Address
         {
             Location = _locationQuery.ResolveLocation(_locationQuery.GetCountry("Australia"), parsedResume.Address.Location),
         },
         EmailAddresses = (from e in parsedResume.EmailAddresses select new EmailAddress {
             Address = e.Address, IsVerified = e.IsVerified
         }).ToList(),
         PhoneNumbers = (from p in parsedResume.PhoneNumbers select new PhoneNumber {
             Number = p.Number, Type = p.Type
         }).ToList(),
     });
 }
示例#12
0
        public static ParsedResume Map(this ParsedResumeEntity entity)
        {
            var parsedResume = new ParsedResume
            {
                Id        = entity.id,
                FirstName = entity.firstName,
                LastName  = entity.lastName,
                Address   = string.IsNullOrEmpty(entity.street) && string.IsNullOrEmpty(entity.location)
                    ? null
                    : new ParsedAddress {
                    Street = entity.street, Location = entity.location
                },
                DateOfBirth = ((IHavePartialDateEntity)entity).Map(),
                Resume      = entity.ResumeEntity == null ? null : entity.ResumeEntity.Map()
            };

            entity.MapTo((IHavePhoneNumbers)parsedResume);
            entity.MapTo((IHaveEmailAddresses)parsedResume);
            return(parsedResume);
        }
示例#13
0
 void IParsedResumesCommand.CreateParsedResume(ParsedResume parsedResume)
 {
     Prepare(parsedResume);
     parsedResume.Validate();
     _repository.CreateParsedResume(parsedResume);
 }
示例#14
0
        private static void AssertParsedResume(ParsedResume expectedParsedResume, ParsedResume parsedResume)
        {
            Assert.AreEqual(expectedParsedResume.FirstName, parsedResume.FirstName);
            Assert.AreEqual(expectedParsedResume.LastName, parsedResume.LastName);
            Assert.AreEqual(expectedParsedResume.Address, parsedResume.Address);
            Assert.AreEqual(expectedParsedResume.DateOfBirth, parsedResume.DateOfBirth);

            Assert.AreEqual(expectedParsedResume.Resume.Skills, parsedResume.Resume.Skills);
            Assert.AreEqual(expectedParsedResume.Resume.Objective, parsedResume.Resume.Objective);
            Assert.AreEqual(expectedParsedResume.Resume.Summary, parsedResume.Resume.Summary);
            Assert.AreEqual(expectedParsedResume.Resume.Other, parsedResume.Resume.Other);
            Assert.AreEqual(expectedParsedResume.Resume.Citizenship, parsedResume.Resume.Citizenship);
            Assert.AreEqual(expectedParsedResume.Resume.Affiliations, parsedResume.Resume.Affiliations);
            Assert.AreEqual(expectedParsedResume.Resume.Professional, parsedResume.Resume.Professional);
            Assert.AreEqual(expectedParsedResume.Resume.Interests, parsedResume.Resume.Interests);
            Assert.AreEqual(expectedParsedResume.Resume.Referees, parsedResume.Resume.Referees);

            Assert.IsTrue(expectedParsedResume.EmailAddresses.NullableCollectionEqual(parsedResume.EmailAddresses));
            Assert.IsTrue(expectedParsedResume.PhoneNumbers.NullableCollectionEqual(parsedResume.PhoneNumbers));

            if (expectedParsedResume.Resume.Courses == null)
            {
                Assert.IsNull(parsedResume.Resume.Courses);
            }
            else
            {
                Assert.AreEqual(expectedParsedResume.Resume.Courses.Count, parsedResume.Resume.Courses.Count);
                for (var index = 0; index < expectedParsedResume.Resume.Courses.Count; ++index)
                {
                    Assert.AreEqual(expectedParsedResume.Resume.Courses[index], parsedResume.Resume.Courses[index]);
                }
            }

            if (expectedParsedResume.Resume.Awards == null)
            {
                Assert.IsNull(parsedResume.Resume.Awards);
            }
            else
            {
                Assert.AreEqual(expectedParsedResume.Resume.Awards.Count, parsedResume.Resume.Awards.Count);
                for (var index = 0; index < expectedParsedResume.Resume.Awards.Count; ++index)
                {
                    Assert.AreEqual(expectedParsedResume.Resume.Awards[index], parsedResume.Resume.Awards[index]);
                }
            }

            if (expectedParsedResume.Resume.Schools == null)
            {
                Assert.IsNull(parsedResume.Resume.Schools);
            }
            else
            {
                Assert.AreEqual(expectedParsedResume.Resume.Schools.Count, parsedResume.Resume.Schools.Count);
                for (var index = 0; index < expectedParsedResume.Resume.Schools.Count; ++index)
                {
                    AssertSchool(expectedParsedResume.Resume.Schools[index], parsedResume.Resume.Schools[index]);
                }
            }

            if (expectedParsedResume.Resume.Jobs == null)
            {
                Assert.IsNull(parsedResume.Resume.Jobs);
            }
            else
            {
                Assert.AreEqual(expectedParsedResume.Resume.Jobs.Count, parsedResume.Resume.Jobs.Count);
                for (var index = 0; index < expectedParsedResume.Resume.Jobs.Count; ++index)
                {
                    AssertJob(expectedParsedResume.Resume.Jobs[index], parsedResume.Resume.Jobs[index]);
                }
            }
        }
示例#15
0
        /// <summary>
        /// Save the resume to disk using UTF-8 encoding
        /// </summary>
        /// <param name="exts"></param>
        /// <param name="piiRedacted"><see langword="true"/> to save the redacted version of the resume, otherwise <see langword="false"/></param>
        /// <param name="filePath">The file to save to</param>
        /// <param name="formatted"><see langword="true"/> for pretty-printing</param>
        public static void SaveResumeJsonToFile(this ParseResumeResponseExtensions exts, string filePath, bool formatted, bool piiRedacted)
        {
            ParsedResume resume = piiRedacted ? exts.Response?.Value?.RedactedResumeData : exts.Response?.Value?.ResumeData;

            resume?.ToFile(filePath, formatted);
        }
示例#16
0
        /// <summary>
        /// Use this to get the resume as a JSON string (to save to disk or other data storage).
        /// <br/>NOTE: be sure to save with UTF-8 encoding!
        /// </summary>
        /// <param name="exts"></param>
        /// <param name="piiRedacted"><see langword="true"/> for the redacted version of the resume, otherwise <see langword="false"/></param>
        /// <param name="formatted"><see langword="true"/> for pretty-printing</param>
        public static string GetResumeAsJsonString(this ParseResumeResponseExtensions exts, bool formatted, bool piiRedacted)
        {
            ParsedResume resume = piiRedacted ? exts.Response?.Value?.RedactedResumeData : exts.Response?.Value?.ResumeData;

            return(resume?.ToJson(formatted));
        }
示例#17
0
        public async Task TestResumeLifeCycle()
        {
            const string documentId = "1";

            try
            {
                // verify can't retrieve a document that doesn't exist
                SovrenException sovrenException = Assert.ThrowsAsync <SovrenException>(async() => {
                    await Client.GetResume(resumeIndexId, documentId);
                });
                Assert.AreEqual(SovrenErrorCodes.DataNotFound, sovrenException.SovrenErrorCode);

                // verify can't add document to an index that doesn't exist
                sovrenException = Assert.ThrowsAsync <SovrenException>(async() => {
                    await Client.IndexDocument(TestParsedResume, resumeIndexId, documentId);
                });
                Assert.AreEqual(SovrenErrorCodes.DataNotFound, sovrenException.SovrenErrorCode);

                // create the index
                await Client.CreateIndex(IndexType.Resume, resumeIndexId);
                await DelayForIndexSync();

                // verify document still doesn't exist
                sovrenException = Assert.ThrowsAsync <SovrenException>(async() => {
                    await Client.GetResume(resumeIndexId, documentId);
                });
                Assert.AreEqual(SovrenErrorCodes.DataNotFound, sovrenException.SovrenErrorCode);

                // add resume to index
                await Client.IndexDocument(TestParsedResume, resumeIndexId, documentId);
                await DelayForIndexSync();

                // confirm you can now retrieve the resume
                await Client.GetResume(resumeIndexId, documentId);

                // confirm the resume shows up in searches
                List <string> indexesToQuery = new List <string>()
                {
                    resumeIndexId
                };
                FilterCriteria filterCriteria = new FilterCriteria()
                {
                    DocumentIds = new List <string>()
                    {
                        documentId
                    }
                };

                SearchResponseValue searchResponse = Client.Search(indexesToQuery, filterCriteria).Result.Value;
                Assert.AreEqual(1, searchResponse.TotalCount);
                Assert.AreEqual(1, searchResponse.CurrentCount);
                Assert.AreEqual(documentId, searchResponse.Matches[0].Id);

                // update the resume
                List <string> userDefinedTags = new List <string> {
                    "userDefinedTag1"
                };
                await Client.UpdateResumeUserDefinedTags(resumeIndexId, documentId,
                                                         userDefinedTags, UserDefinedTagsMethod.Overwrite);

                await DelayForIndexSync();

                // verify those updates have taken effect
                filterCriteria.UserDefinedTags = userDefinedTags;
                searchResponse = Client.Search(indexesToQuery, filterCriteria).Result.Value;
                Assert.AreEqual(1, searchResponse.TotalCount);
                Assert.AreEqual(1, searchResponse.CurrentCount);
                Assert.AreEqual(documentId, searchResponse.Matches[0].Id);

                // confirm you can retrieve the tags
                ParsedResume resume = Client.GetResume(resumeIndexId, documentId).Result.Value;
                Assert.AreEqual(1, resume.UserDefinedTags.Count);
                Assert.AreEqual(userDefinedTags[0], resume.UserDefinedTags[0]);

                // delete the document
                await Client.DeleteDocument(resumeIndexId, documentId);
                await DelayForIndexSync();

                // verify can't retrieve a document that doesn't exist
                sovrenException = Assert.ThrowsAsync <SovrenException>(async() => {
                    await Client.GetResume(resumeIndexId, documentId);
                });
                Assert.AreEqual(SovrenErrorCodes.DataNotFound, sovrenException.SovrenErrorCode);

                sovrenException = Assert.ThrowsAsync <SovrenException>(async() => {
                    await Client.DeleteDocument(resumeIndexId, documentId);
                });
                Assert.AreEqual(SovrenErrorCodes.DataNotFound, sovrenException.SovrenErrorCode);

                await Client.DeleteIndex(resumeIndexId);
                await DelayForIndexSync();

                sovrenException = Assert.ThrowsAsync <SovrenException>(async() => {
                    await Client.DeleteDocument(resumeIndexId, documentId);
                });
                Assert.AreEqual(SovrenErrorCodes.DataNotFound, sovrenException.SovrenErrorCode);
            }
            catch (Exception) { throw; }
            finally
            {
                await CleanUpIndex(resumeIndexId);
            }
        }
示例#18
0
 /// <summary>
 /// Creates a request to call the Resume Formatter endpoint.
 /// </summary>
 /// <param name="resume">
 /// Either<see cref="ParseResumeResponseValue.ResumeData"/> to include the candidate's personal information or
 /// <see cref="ParseResumeResponseValue.RedactedResumeData"/> to exclude it.
 /// <param name="docType">The output document type</param>
 /// </param>
 public FormatResumeRequest(ParsedResume resume, ResumeType docType)
 {
     ResumeData         = resume;
     Options.OutputType = docType;
 }