Compare commits
					merge into: warricksothr:master
					
				
				warricksothr:development
						
							warricksothr:framework
						
							warricksothr:master
						
						
						
						
					
					pull from: warricksothr:framework
					
				
				warricksothr:development
						
							warricksothr:framework
						
							warricksothr:master
						
						
						
						
					
	
		
			15 Commits 
		
	
	
    
				 45 changed files with 9263 additions and 64 deletions
			
			
		- 
					4.gitignore
- 
					13.gitlab-ci.yml
- 
					4TODO
- 
					21administration_client/.gitignore
- 
					26administration_client/README.md
- 
					5administration_client/babel.config.js
- 
					13administration_client/create_config_files.sh
- 
					81administration_client/package.json
- 
					BINadministration_client/public/favicon.ico
- 
					17administration_client/public/index.html
- 
					29administration_client/src/App.vue
- 
					BINadministration_client/src/assets/logo.png
- 
					59administration_client/src/components/HelloWorld.vue
- 
					12administration_client/src/main.ts
- 
					23administration_client/src/router.ts
- 
					13administration_client/src/shims-tsx.d.ts
- 
					4administration_client/src/shims-vue.d.ts
- 
					16administration_client/src/store.ts
- 
					5administration_client/src/views/About.vue
- 
					18administration_client/src/views/Home.vue
- 
					12administration_client/tests/unit/HelloWorld.spec.ts
- 
					40administration_client/tsconfig.json
- 
					19administration_client/tslint.json
- 
					8317administration_client/yarn.lock
- 
					15server/atheneum/api/authentication_api.py
- 
					8server/atheneum/middleware/authentication_middleware.py
- 
					16server/atheneum/service/transformation_service.py
- 
					45server/documentation/api/authentication.rst
- 
					4server/documentation/api/index.rst
- 
					24server/documentation/api/user.rst
- 
					2server/documentation/apidoc-gen.sh
- 
					9server/documentation/conf.py
- 
					1server/documentation/index.rst
- 
					46server/documentation/server/atheneum.api.rst
- 
					22server/documentation/server/atheneum.middleware.rst
- 
					22server/documentation/server/atheneum.model.rst
- 
					49server/documentation/server/atheneum.rst
- 
					70server/documentation/server/atheneum.service.rst
- 
					46server/documentation/server/atheneum.utility.rst
- 
					7server/documentation/server/modules.rst
- 
					15server/tests/api/test_authentication_api.py
- 
					22server/tests/api/test_user_api.py
- 
					46server/tests/conftest.py
- 
					92server/tests/service/test_authentication_service.py
- 
					1server/tests/service/test_transformation_service.py
| @ -0,0 +1,4 @@ | |||
| Items are ranked from top to bottom for priority | |||
| 
 | |||
| * Administration Web Interface | |||
| * Docker Compose | |||
| @ -0,0 +1,21 @@ | |||
| .DS_Store | |||
| node_modules | |||
| /dist | |||
| 
 | |||
| # local env files | |||
| .env.local | |||
| .env.*.local | |||
| 
 | |||
| # Log files | |||
| npm-debug.log* | |||
| yarn-debug.log* | |||
| yarn-error.log* | |||
| 
 | |||
| # Editor directories and files | |||
| .idea | |||
| .vscode | |||
| *.suo | |||
| *.ntvs* | |||
| *.njsproj | |||
| *.sln | |||
| *.sw* | |||
| @ -0,0 +1,26 @@ | |||
| # administration_client | |||
| 
 | |||
| ## Project setup | |||
| ``` | |||
| yarn install | |||
| ``` | |||
| 
 | |||
| ### Compiles and hot-reloads for development | |||
| ``` | |||
| yarn run serve | |||
| ``` | |||
| 
 | |||
| ### Compiles and minifies for production | |||
| ``` | |||
| yarn run build | |||
| ``` | |||
| 
 | |||
| ### Lints and fixes files | |||
| ``` | |||
| yarn run lint | |||
| ``` | |||
| 
 | |||
| ### Run your unit tests | |||
| ``` | |||
| yarn run test:unit | |||
| ``` | |||
| @ -0,0 +1,5 @@ | |||
| module.exports = { | |||
|   presets: [ | |||
|     '@vue/app' | |||
|   ] | |||
| } | |||
| @ -0,0 +1,13 @@ | |||
| #!/usr/bin/env bash | |||
| 
 | |||
| if [ -z "$NPM_CONFIG_REGISTRY" ] | |||
| then | |||
|     echo "No custom registry defined..." | |||
| else | |||
|     echo "Creating custom registry configurations..." | |||
|     echo "registry \"$NPM_CONFIG_REGISTRY\"" | |||
|     echo "registry \"$NPM_CONFIG_REGISTRY\"" >> .npmrc | |||
|     echo "registry \"$NPM_CONFIG_REGISTRY\"" >> .yarnrc | |||
|     echo "Replacing static yarn registry references in yarn.lock... BUGFIX... revisit with yarn 2+... https://github.com/yarnpkg/yarn/issues/3330" | |||
|     find . -name yarn.lock -exec sed -i "s#https://registry.yarnpkg.com#`awk '$1 == "registry" { gsub(/"/,""); print $NF}' .yarnrc`#g" {} \; | |||
| fi | |||
| @ -0,0 +1,81 @@ | |||
| { | |||
|   "name": "atheneum_administration_client", | |||
|   "version": "0.1.0", | |||
|   "private": true, | |||
|   "scripts": { | |||
|     "serve": "vue-cli-service serve", | |||
|     "build": "vue-cli-service build", | |||
|     "lint": "vue-cli-service lint", | |||
|     "test:unit": "vue-cli-service test:unit" | |||
|   }, | |||
|   "dependencies": { | |||
|     "vue": "^2.5.17", | |||
|     "vue-class-component": "^6.0.0", | |||
|     "vue-property-decorator": "^7.0.0", | |||
|     "vue-router": "^3.0.1", | |||
|     "vuex": "^3.0.1" | |||
|   }, | |||
|   "devDependencies": { | |||
|     "@types/jest": "^23.1.4", | |||
|     "@vue/cli-plugin-babel": "^3.0.1", | |||
|     "@vue/cli-plugin-typescript": "^3.0.1", | |||
|     "@vue/cli-plugin-unit-jest": "^3.0.1", | |||
|     "@vue/cli-service": "^3.0.1", | |||
|     "@vue/test-utils": "^1.0.0-beta.20", | |||
|     "babel-core": "7.0.0-bridge.0", | |||
|     "lint-staged": "^7.2.2", | |||
|     "node-sass": "^4.9.0", | |||
|     "sass-loader": "^7.0.1", | |||
|     "ts-jest": "^23.0.0", | |||
|     "typescript": "^3.0.0", | |||
|     "vue-template-compiler": "^2.5.17" | |||
|   }, | |||
|   "postcss": { | |||
|     "plugins": { | |||
|       "autoprefixer": {} | |||
|     } | |||
|   }, | |||
|   "browserslist": [ | |||
|     "> 1%", | |||
|     "last 2 versions", | |||
|     "not ie <= 8" | |||
|   ], | |||
|   "jest": { | |||
|     "moduleFileExtensions": [ | |||
|       "js", | |||
|       "jsx", | |||
|       "json", | |||
|       "vue", | |||
|       "ts", | |||
|       "tsx" | |||
|     ], | |||
|     "transform": { | |||
|       "^.+\\.vue$": "vue-jest", | |||
|       ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub", | |||
|       "^.+\\.tsx?$": "ts-jest" | |||
|     }, | |||
|     "moduleNameMapper": { | |||
|       "^@/(.*)$": "<rootDir>/src/$1" | |||
|     }, | |||
|     "snapshotSerializers": [ | |||
|       "jest-serializer-vue" | |||
|     ], | |||
|     "testMatch": [ | |||
|       "**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)" | |||
|     ], | |||
|     "testURL": "http://localhost/" | |||
|   }, | |||
|   "gitHooks": { | |||
|     "pre-commit": "lint-staged" | |||
|   }, | |||
|   "lint-staged": { | |||
|     "*.ts": [ | |||
|       "vue-cli-service lint", | |||
|       "git add" | |||
|     ], | |||
|     "*.vue": [ | |||
|       "vue-cli-service lint", | |||
|       "git add" | |||
|     ] | |||
|   } | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
|   <head> | |||
|     <meta charset="utf-8"> | |||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |||
|     <meta name="viewport" content="width=device-width,initial-scale=1.0"> | |||
|     <link rel="icon" href="<%= BASE_URL %>favicon.ico"> | |||
|     <title>administration_client</title> | |||
|   </head> | |||
|   <body> | |||
|     <noscript> | |||
|       <strong>We're sorry but Atheneum Administration Client doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> | |||
|     </noscript> | |||
|     <div id="app"></div> | |||
|     <!-- built files will be auto injected --> | |||
|   </body> | |||
| </html> | |||
| @ -0,0 +1,29 @@ | |||
| <template> | |||
|   <div id="app"> | |||
|     <div id="nav"> | |||
|       <router-link to="/">Home</router-link> | | |||
|       <router-link to="/about">About</router-link> | |||
|     </div> | |||
|     <router-view/> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <style lang="scss"> | |||
| #app { | |||
|   font-family: 'Avenir', Helvetica, Arial, sans-serif; | |||
|   -webkit-font-smoothing: antialiased; | |||
|   -moz-osx-font-smoothing: grayscale; | |||
|   text-align: center; | |||
|   color: #2c3e50; | |||
| } | |||
| #nav { | |||
|   padding: 30px; | |||
|   a { | |||
|     font-weight: bold; | |||
|     color: #2c3e50; | |||
|     &.router-link-exact-active { | |||
|       color: #42b983; | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| After Width: 200 | Height: 200 | Size: 6.7 KiB | 
| @ -0,0 +1,59 @@ | |||
| <template> | |||
|   <div class="hello"> | |||
|     <h1>{{ msg }}</h1> | |||
|     <p> | |||
|       For guide and recipes on how to configure / customize this project,<br> | |||
|       check out the | |||
|       <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>. | |||
|     </p> | |||
|     <h3>Installed CLI Plugins</h3> | |||
|     <ul> | |||
|       <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li> | |||
|       <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-typescript" target="_blank" rel="noopener">typescript</a></li> | |||
|       <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-unit-jest" target="_blank" rel="noopener">unit-jest</a></li> | |||
|     </ul> | |||
|     <h3>Essential Links</h3> | |||
|     <ul> | |||
|       <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li> | |||
|       <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li> | |||
|       <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li> | |||
|       <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li> | |||
|       <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li> | |||
|     </ul> | |||
|     <h3>Ecosystem</h3> | |||
|     <ul> | |||
|       <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li> | |||
|       <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li> | |||
|       <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li> | |||
|       <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li> | |||
|       <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li> | |||
|     </ul> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script lang="ts"> | |||
| import { Component, Prop, Vue } from 'vue-property-decorator'; | |||
| 
 | |||
| @Component | |||
| export default class HelloWorld extends Vue { | |||
|   @Prop() private msg!: string; | |||
| } | |||
| </script> | |||
| 
 | |||
| <!-- Add "scoped" attribute to limit CSS to this component only --> | |||
| <style scoped lang="scss"> | |||
| h3 { | |||
|   margin: 40px 0 0; | |||
| } | |||
| ul { | |||
|   list-style-type: none; | |||
|   padding: 0; | |||
| } | |||
| li { | |||
|   display: inline-block; | |||
|   margin: 0 10px; | |||
| } | |||
| a { | |||
|   color: #42b983; | |||
| } | |||
| </style> | |||
| @ -0,0 +1,12 @@ | |||
| import Vue from 'vue'; | |||
| import App from './App.vue'; | |||
| import router from './router'; | |||
| import store from './store'; | |||
| 
 | |||
| Vue.config.productionTip = false; | |||
| 
 | |||
| new Vue({ | |||
|   router, | |||
|   store, | |||
|   render: (h) => h(App), | |||
| }).$mount('#app'); | |||
| @ -0,0 +1,23 @@ | |||
| import Vue from 'vue'; | |||
| import Router from 'vue-router'; | |||
| import Home from './views/Home.vue'; | |||
| 
 | |||
| Vue.use(Router); | |||
| 
 | |||
| export default new Router({ | |||
|   routes: [ | |||
|     { | |||
|       path: '/', | |||
|       name: 'home', | |||
|       component: Home, | |||
|     }, | |||
|     { | |||
|       path: '/about', | |||
|       name: 'about', | |||
|       // route level code-splitting
 | |||
|       // this generates a separate chunk (about.[hash].js) for this route
 | |||
|       // which is lazy-loaded when the route is visited.
 | |||
|       component: () => import(/* webpackChunkName: "about" */ './views/About.vue'), | |||
|     }, | |||
|   ], | |||
| }); | |||
| @ -0,0 +1,13 @@ | |||
| import Vue, { VNode } from 'vue'; | |||
| 
 | |||
| declare global { | |||
|   namespace JSX { | |||
|     // tslint:disable no-empty-interface
 | |||
|     interface Element extends VNode {} | |||
|     // tslint:disable no-empty-interface
 | |||
|     interface ElementClass extends Vue {} | |||
|     interface IntrinsicElements { | |||
|       [elem: string]: any; | |||
|     } | |||
|   } | |||
| } | |||
| @ -0,0 +1,4 @@ | |||
| declare module '*.vue' { | |||
|   import Vue from 'vue'; | |||
|   export default Vue; | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| import Vue from 'vue'; | |||
| import Vuex from 'vuex'; | |||
| 
 | |||
| Vue.use(Vuex); | |||
| 
 | |||
| export default new Vuex.Store({ | |||
|   state: { | |||
| 
 | |||
|   }, | |||
|   mutations: { | |||
| 
 | |||
|   }, | |||
|   actions: { | |||
| 
 | |||
|   }, | |||
| }); | |||
| @ -0,0 +1,5 @@ | |||
| <template> | |||
|   <div class="about"> | |||
|     <h1>This is an about page</h1> | |||
|   </div> | |||
| </template> | |||
| @ -0,0 +1,18 @@ | |||
| <template> | |||
|   <div class="home"> | |||
|     <img alt="Vue logo" src="../assets/logo.png"> | |||
|     <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script lang="ts"> | |||
| import { Component, Vue } from 'vue-property-decorator'; | |||
| import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src | |||
| 
 | |||
| @Component({ | |||
|   components: { | |||
|     HelloWorld, | |||
|   }, | |||
| }) | |||
| export default class Home extends Vue {} | |||
| </script> | |||
| @ -0,0 +1,12 @@ | |||
| import { shallowMount } from '@vue/test-utils'; | |||
| import HelloWorld from '@/components/HelloWorld.vue'; | |||
| 
 | |||
| describe('HelloWorld.vue', () => { | |||
|   it('renders props.msg when passed', () => { | |||
|     const msg = 'new message'; | |||
|     const wrapper = shallowMount(HelloWorld, { | |||
|       propsData: { msg }, | |||
|     }); | |||
|     expect(wrapper.text()).toMatch(msg); | |||
|   }); | |||
| }); | |||
| @ -0,0 +1,40 @@ | |||
| { | |||
|   "compilerOptions": { | |||
|     "target": "esnext", | |||
|     "module": "esnext", | |||
|     "strict": true, | |||
|     "jsx": "preserve", | |||
|     "importHelpers": true, | |||
|     "moduleResolution": "node", | |||
|     "experimentalDecorators": true, | |||
|     "esModuleInterop": true, | |||
|     "allowSyntheticDefaultImports": true, | |||
|     "sourceMap": true, | |||
|     "baseUrl": ".", | |||
|     "types": [ | |||
|       "node", | |||
|       "jest" | |||
|     ], | |||
|     "paths": { | |||
|       "@/*": [ | |||
|         "src/*" | |||
|       ] | |||
|     }, | |||
|     "lib": [ | |||
|       "esnext", | |||
|       "dom", | |||
|       "dom.iterable", | |||
|       "scripthost" | |||
|     ] | |||
|   }, | |||
|   "include": [ | |||
|     "src/**/*.ts", | |||
|     "src/**/*.tsx", | |||
|     "src/**/*.vue", | |||
|     "tests/**/*.ts", | |||
|     "tests/**/*.tsx" | |||
|   ], | |||
|   "exclude": [ | |||
|     "node_modules" | |||
|   ] | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| { | |||
|   "defaultSeverity": "warning", | |||
|   "extends": [ | |||
|     "tslint:recommended" | |||
|   ], | |||
|   "linterOptions": { | |||
|     "exclude": [ | |||
|       "node_modules/**" | |||
|     ] | |||
|   }, | |||
|   "rules": { | |||
|     "quotemark": [true, "single"], | |||
|     "indent": [true, "spaces", 2], | |||
|     "interface-name": false, | |||
|     "ordered-imports": false, | |||
|     "object-literal-sort-keys": false, | |||
|     "no-consecutive-blank-lines": false | |||
|   } | |||
| } | |||
						
							
						
						
							8317
	
						
						administration_client/yarn.lock
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				File diff suppressed because it is too large
							
							
								
									View File
								
							
						| @ -0,0 +1,2 @@ | |||
| #!/usr/bin/env bash | |||
| noglob sphinx-apidoc -o server ../atheneum/ tests/* | |||
| @ -0,0 +1,46 @@ | |||
| atheneum.api package | |||
| ==================== | |||
| 
 | |||
| Submodules | |||
| ---------- | |||
| 
 | |||
| atheneum.api.authentication\_api module | |||
| --------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.api.authentication_api | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.api.decorators module | |||
| ------------------------------ | |||
| 
 | |||
| .. automodule:: atheneum.api.decorators | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.api.model module | |||
| ------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.api.model | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.api.user\_api module | |||
| ----------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.api.user_api | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| 
 | |||
| Module contents | |||
| --------------- | |||
| 
 | |||
| .. automodule:: atheneum.api | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| @ -0,0 +1,22 @@ | |||
| atheneum.middleware package | |||
| =========================== | |||
| 
 | |||
| Submodules | |||
| ---------- | |||
| 
 | |||
| atheneum.middleware.authentication\_middleware module | |||
| ----------------------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.middleware.authentication_middleware | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| 
 | |||
| Module contents | |||
| --------------- | |||
| 
 | |||
| .. automodule:: atheneum.middleware | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| @ -0,0 +1,22 @@ | |||
| atheneum.model package | |||
| ====================== | |||
| 
 | |||
| Submodules | |||
| ---------- | |||
| 
 | |||
| atheneum.model.user\_model module | |||
| --------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.model.user_model | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| 
 | |||
| Module contents | |||
| --------------- | |||
| 
 | |||
| .. automodule:: atheneum.model | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| @ -0,0 +1,49 @@ | |||
| atheneum package | |||
| ================ | |||
| 
 | |||
| Subpackages | |||
| ----------- | |||
| 
 | |||
| .. toctree:: | |||
| 
 | |||
|     atheneum.api | |||
|     atheneum.middleware | |||
|     atheneum.model | |||
|     atheneum.service | |||
|     atheneum.utility | |||
| 
 | |||
| Submodules | |||
| ---------- | |||
| 
 | |||
| atheneum.db module | |||
| ------------------ | |||
| 
 | |||
| .. automodule:: atheneum.db | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.default\_settings module | |||
| --------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.default_settings | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.errors module | |||
| ---------------------- | |||
| 
 | |||
| .. automodule:: atheneum.errors | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| 
 | |||
| Module contents | |||
| --------------- | |||
| 
 | |||
| .. automodule:: atheneum | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| @ -0,0 +1,70 @@ | |||
| atheneum.service package | |||
| ======================== | |||
| 
 | |||
| Submodules | |||
| ---------- | |||
| 
 | |||
| atheneum.service.authentication\_service module | |||
| ----------------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.service.authentication_service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.service.patch\_service module | |||
| -------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.service.patch_service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.service.role\_service module | |||
| ------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.service.role_service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.service.transformation\_service module | |||
| ----------------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.service.transformation_service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.service.user\_service module | |||
| ------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.service.user_service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.service.user\_token\_service module | |||
| -------------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.service.user_token_service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.service.validation\_service module | |||
| ------------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.service.validation_service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| 
 | |||
| Module contents | |||
| --------------- | |||
| 
 | |||
| .. automodule:: atheneum.service | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| @ -0,0 +1,46 @@ | |||
| atheneum.utility package | |||
| ======================== | |||
| 
 | |||
| Submodules | |||
| ---------- | |||
| 
 | |||
| atheneum.utility.authentication\_utility module | |||
| ----------------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.utility.authentication_utility | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.utility.json\_utility module | |||
| ------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.utility.json_utility | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.utility.pagination\_utility module | |||
| ------------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.utility.pagination_utility | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| atheneum.utility.session\_utility module | |||
| ---------------------------------------- | |||
| 
 | |||
| .. automodule:: atheneum.utility.session_utility | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| 
 | |||
| 
 | |||
| Module contents | |||
| --------------- | |||
| 
 | |||
| .. automodule:: atheneum.utility | |||
|     :members: | |||
|     :undoc-members: | |||
|     :show-inheritance: | |||
| @ -0,0 +1,7 @@ | |||
| Atheneum Server API | |||
| =================== | |||
| 
 | |||
| .. toctree:: | |||
|    :maxdepth: 4 | |||
| 
 | |||
|    atheneum | |||
| @ -0,0 +1,92 @@ | |||
| from datetime import datetime, timedelta | |||
| 
 | |||
| import pytest | |||
| from mock import patch, MagicMock | |||
| from nacl.exceptions import InvalidkeyError | |||
| 
 | |||
| from atheneum import errors | |||
| from atheneum.model import User, UserToken | |||
| from atheneum.service.authentication_service import ( | |||
|     validate_password_strength, | |||
|     is_valid_token, | |||
|     is_valid_password | |||
| ) | |||
| 
 | |||
| service_module = 'atheneum.service.authentication_service' | |||
| 
 | |||
| 
 | |||
| def test_validate_password_strength_happy_path(): | |||
|     valid_password = "HorseStapleBattery9" | |||
|     assert valid_password == validate_password_strength(valid_password) | |||
| 
 | |||
| 
 | |||
| def test_validate_password_strength_length_failure(): | |||
|     invalid_password = "TooShor" | |||
| 
 | |||
|     with pytest.raises(errors.ValidationError) as e_info: | |||
|         error = e_info | |||
|         validate_password_strength(invalid_password) | |||
| 
 | |||
|     assert error is not None | |||
| 
 | |||
| 
 | |||
| def test_validate_password_strength_uppercase_failure(): | |||
|     invalid_password = "NOUPPERCASE9" | |||
| 
 | |||
|     with pytest.raises(errors.ValidationError) as e_info: | |||
|         error = e_info | |||
|         validate_password_strength(invalid_password) | |||
| 
 | |||
|     assert error is not None | |||
| 
 | |||
| 
 | |||
| def test_validate_password_strength_lowercase_failure(): | |||
|     invalid_password = "NOLOWERCASE9" | |||
| 
 | |||
|     with pytest.raises(errors.ValidationError) as e_info: | |||
|         error = e_info | |||
|         validate_password_strength(invalid_password) | |||
| 
 | |||
|     assert error is not None | |||
| 
 | |||
| 
 | |||
| def test_validate_password_strength_number_failure(): | |||
|     invalid_password = "NoNumber" | |||
| 
 | |||
|     with pytest.raises(errors.ValidationError) as e_info: | |||
|         error = e_info | |||
|         validate_password_strength(invalid_password) | |||
| 
 | |||
|     assert error is not None | |||
| 
 | |||
| 
 | |||
| @patch(service_module + '.pwhash.verify') | |||
| def test_is_valid_password_invalid_key_error( | |||
|         mock_pwhash_verify: MagicMock): | |||
|     user = User() | |||
|     user.password_hash = '' | |||
|     mock_pwhash_verify.side_effect = InvalidkeyError() | |||
|     assert not is_valid_password(user, '') | |||
| 
 | |||
| 
 | |||
| def test_is_valid_token_happy_path(): | |||
|     user_token = UserToken() | |||
|     user_token.enabled = True | |||
|     assert is_valid_token(user_token) | |||
| 
 | |||
| 
 | |||
| def test_is_valid_token_no_token(): | |||
|     assert not is_valid_token(None) | |||
| 
 | |||
| 
 | |||
| def test_is_valid_token_disabled(): | |||
|     user_token = UserToken() | |||
|     user_token.enabled = False | |||
|     assert not is_valid_token(user_token) | |||
| 
 | |||
| 
 | |||
| def test_is_valid_token_expired(): | |||
|     user_token = UserToken() | |||
|     user_token.enabled = True | |||
|     user_token.expiration_time = datetime.now() - timedelta(weeks=1) | |||
|     assert not is_valid_token(user_token) | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue