Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
107 changes: 67 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,68 @@
# Show me the code
### Estudo de Caso para uma tela de login de usuario e accesso a uma conta de um banco imaginario.

#### Empresa R. M. Sistemas Web e Mobiles
###### A pedido de: TCS Mobile hiring

#### 1. - Analize do problema.
1.1. - preparado a plataforma de trabalho para obter o acesso para a API.
1.1.1. - Instalacao e configuracao do Postman.
1.1.2. - Teste dos diversos snipets de requisicao para a API oferecidos pela Collection Mockada via Postmam.
1.1.3. - Escolhido o Framework OkHttp Client como snipet para as requisicoes junto a API remota.

#### 2. - Criacao de um prototipo inicial.
2.1. - Escolhido o template "Login Activity" do Android Studio.
2.2. - Escolhido o teste Espresso Unit Test (JUnit) por ja ser embutido no template do Android Studio e por ser
mais facil de manejar diretamente os dados da GUI.
2.3. - Implementado o parser para receber os resultados da requisicao POST para a API.
2.4. - Modificado a tela do template para parecer o maximo possivel ao do design proposto no estudo de caso.
2.5. - Implementado o teste expresso para os diversos complentes clicaveis e editaveis da UI.
2.6. - Implementado o metodo para a receber os dados da requsicao GET para a API.
2.7. - Testado a requisicao remota.
2.8. - Criado o lyout para receber os dados enviados pela API devidamente tratados e formatados.
2.9. - Criado o adapter para exibir os referidos dados em uma lista conforme o design proposto no estudode caso.
2.10. - Testado o envio da requiscao e os controles da UI.
2.11. - Testes finalizados e todos funcionando a contento.

#### 3. - Implementado e Melhorado a GUI
3.1. - Melhorado a Vizualizacao dos dados na UI.
3.2. - Criado uma versao em portugues do Brasil para as mensagens de tela que por padrao foram configuradas em ingles.
3.3. - Criado uma simples tela de splash screen.
3.4. - projeto postado no github como um pull request numa branch de nome "XYZBankApp".

O projeto XYZBank foi desenvolvido em Kotlin versao "1.3.72" com Android Studio "4.2 Canary 7" e com a mais
alta versao do gradle "build:gradle:4.2.0-alpha07".

Estao sendo enviados como pull request, a pasta "XYZBank" contendo:
- arquivos de configuracao do Android Studio, um screencast video do programa em execucao;

- a pasta "app" contendo:
os fontes "*.kt" do pacote '../src/main/java/com.xyzbank.xyzbankapp/* e os testes
os arquivos de layout e resources de tela "*.xml", na pasta '../src/main/res/*';
os fontes "*.kt" dos testes nas saus respectivas pastas

- a pasta gradle para referencia local.

- a pasta 'outputs/apk/', com um pacote de bytecodes no formato "debug.apk"
...
XYZBank
../app/*
../gradle/*
../outputs/apk/*
../build.gradle
../gradle.properties
../gradlew
../gradlew.bat
../local.properties
../README.md - this file
../settings.gradle
../XYZBank.webm
...

##### Conforme proposto no estudo de caso, o app foi criado para Android a partir da versao 4.4 (19 - KitKat)
##### Para compilar uma versao desse app:
- atualize o Android Studio para a ultima versao.
- Atualize as entradas do Android SDK desde a versao 19 ate a "major" versao real: 30.
- Atualize o plugin do Kotlin para a ultima versao.
- Atualize o gradle no projeto para a ultima versao.

Esse repositório contem todo o material necessário para realizar o teste:
- A especificação do layout está na pasta 'bank_app_layout' abrindo o index.html, utilizar os Styles do Android

- Os dados da Api estão mockados, os exemplos e a especificação dos serviços (login e statements) se encontram no arquivo BankApp.postman_collection.json ( é necessário instalar o postman e importar a colection https://www.getpostman.com/apps)

![Image of Yaktocat](https://github.com/SantanderTecnologia/TesteiOS/blob/new_test/telas.png)

### # DESAFIO:

Na primeira tela teremos um formulario de login, o campo user deve aceitar email ou cpf,
o campo password deve validar se a senha tem pelo menos uma letra maiuscula, um caracter especial e um caracter alfanumérico.
Apos a validação, realizar o login no endpoint https://bank-app-test.herokuapp.com/api/login e exibir os dados de retorno na próxima tela.
O ultimo usuário logado deve ser salvo de forma segura localmente, e exibido na tela de login se houver algum salvo.

Na segunda tela será exibido os dados formatados do retorno do login e será necessário fazer um segundo request para obter os lançamentos do usuário, no endpoint https://bank-app-test.herokuapp.com/api/statements/{idUser} que retornará uma lista de lançamentos

### # Avaliação

Você será avaliado pela usabilidade, por respeitar o design e pela arquitetura do app. É esperado que você consiga explicar as decisões que tomou durante o desenvolvimento através de commits.

Obrigatórios:

* Java ou Kotlin
* Material Design
* O app deve funcionar a partir do android 4.4
* Testes unitários, pode usar a ferramenta que você tem mais experiência, só nos explique o que ele tem de bom.
* Arquitetura a ser utilizada: Android Clean Code (https://github.com/kmmraj/android-clean-code && https://medium.com/@kmmraj/android-clean-code-part-1-c66da6551d1)
* Uso do git.

### # Observações gerais

Adicione um arquivo [README.md](http://README.md) com os procedimentos para executar o projeto.
Pedimos que trabalhe sozinho e não divulgue o resultado na internet.

Faça um fork desse desse repositório em seu Github e ao finalizar nos envie um Pull Request com o resultado, por favor informe por qual empresa você esta se candidatando.

# Importante: não há prazo de entrega, faça com qualidade!

# BOA SORTE!
{"statementList":[{"title":"Pagamento","desc":"Conta de luz","date":"2018-08-15","value":-50, ...}],"error":{}}
Binary file added XYZBank/.DS_Store
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added XYZBank/.gradle/6.5/fileChanges/last-build.bin
Binary file not shown.
Binary file added XYZBank/.gradle/6.5/fileContent/fileContent.lock
Binary file not shown.
Binary file added XYZBank/.gradle/6.5/fileHashes/fileHashes.bin
Binary file not shown.
Binary file added XYZBank/.gradle/6.5/fileHashes/fileHashes.lock
Binary file not shown.
Binary file not shown.
Empty file.
Binary file not shown.
Binary file added XYZBank/.gradle/6.5/javaCompile/jarAnalysis.bin
Binary file not shown.
Binary file added XYZBank/.gradle/6.5/javaCompile/javaCompile.lock
Binary file not shown.
Binary file added XYZBank/.gradle/6.5/javaCompile/taskHistory.bin
Binary file not shown.
Binary file not shown.
2 changes: 2 additions & 0 deletions XYZBank/.gradle/buildOutputCleanup/cache.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#Wed Aug 05 13:44:50 BRT 2020
gradle.version=6.5
Binary file not shown.
Binary file added XYZBank/.gradle/checksums/checksums.lock
Binary file not shown.
Empty file.
68 changes: 68 additions & 0 deletions XYZBank/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
Estudo de Caso para uma tela de login de usuario e accesso a uma conta de um banco imaginario.

Empresa R. M. Sistemas Web e Mobiles

1 - Analize do problema.

1.1 - preparado a plataforma de trabalho para obter o acesso para a API.
1.1.1 - Instalacao e configuracao do Postman.
1.1.2 - Teste dos diversos snipets de requisicao para a API oferecidos pela Collection Mockada via Postmam.
1.1.3 - Escolhido o Framework OkHttp Client como snipet para as requisicoes junto a API remota.

2 - Criacao de um prototipo inicial.

2.1 - Escolhido o template "Login Activity" do Android Studio.
2.2 - Escolhido o teste Espresso Unit Test (JUnit) por ja ser embutido no template do Android Studio e por ser
mais facil de manejar diretamente os dados da GUI.
2.3 - Implementado o parser para receber os resultados da requisicao POST para a API.
2.4 - Modificado a tela do template para parecer o maximo possivel ao do design proposto no estudo de caso.
2.5 - Implementado o teste expresso para os diversos componentes clicaveis e editaveis da UI.
2.6 - Implementado o metodo para a receber os dados da requsicao GET para a API.
2.7 - Testado a requisicao remota.
2.8 - Criado o lyout para receber os dados enviados pela API devidamente tratados e formatados.
2.9 - Criado o adapter para exibir os referidos dados em uma lista conforme o design proposto no estudo de caso.
2.10 - Testado o envio da requiscao e os controles da UI.
2.11 - Testes finalizados e todos funcionando a contento.

3 - Implementado e Melhorado a GUI

3.1 - Melhorado a Vizualizacao dos dados na UI.
3.2 - Criado uma versao em portugues do Brasil para as mensagens de tela que por padrao foram configuradas em ingles.
3.3 - Criado uma simples tela de splash screen.
3.4 - projeto postado no github como um pull request numa branch de nome "XYZBankApp".

O projeto XYZBank foi desenvolvido em Kotlin versao "1.3.72" com Android Studio "4.2 Canary 7" e com a mais
alta versao do gradle "build:gradle:4.2.0-alpha07".

Estao sendo enviados como pull request, a pasta "XYZBank" contendo:
- arquivos de configuracao do Android Studio, um screencast video do programa em execucao;

- a pasta "app" contendo:
os fontes "*.kt" do pacote 'app./src/main/java/com.xyzbank.xyzbankapp/* e os testes
os arquivos de layout e resources de tela "*.xml", na pasta 'app/src/main/res/*';
os fontes "*.kt" dos testes nas saus respectivas pastas

- a pasta gradle para referencia local.

- a pasta 'outputs/apk/', com um pacote de bytecodes no formato "debug.apk"

XYZBank/
app/*
gradle/*
outputs/apk/*
build.gradle
gradle.properties
gradlew
gradlew.bat
local.properties
README.md - this file
settings.gradle
XYZBank.webm


Conforme proposto no estudo de caso, o app foi criado para Android a partir da versao 4.4 (19 - KitKat)
Para compilar uma versao desse app:
- atualize o Android Studio para a ultima versao.
- Atualize as entradas do Android SDK desde a versao 19 ate a "major" versao real: 30.
- Atualize oplugin do Kotlin para a ultima versao.
- Atualize o gradle no projeto para a ultima versao.
Binary file added XYZBank/XYZBank.webm
Binary file not shown.
59 changes: 59 additions & 0 deletions XYZBank/app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
}

android {
compileSdkVersion 29
buildToolsVersion "30.0.1"

defaultConfig {
applicationId "com.xyzbank.xyzbankapp"
minSdkVersion 18
targetSdkVersion 29
versionCode 1
versionName "1.0"

vectorDrawables.useSupportLibrary = true

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies {

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation 'com.intuit.ssp:ssp-android:1.0.6'
implementation 'com.intuit.sdp:sdp-android:1.0.6'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.0'

testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'androidx.test:rules:1.3.0-rc02'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.2.0'
}
21 changes: 21 additions & 0 deletions XYZBank/app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.xyzbank.xyzbankapp

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith

/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.xyzbank.xyzbankapp", appContext.packageName)
}
}
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.xyzbank.xyzbankapp.ui.login


import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.*
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.xyzbank.xyzbankapp.R
import org.hamcrest.Matchers.allOf
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@LargeTest
@RunWith(AndroidJUnit4::class)
class LoginActivityUITest {

@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(LoginActivity::class.java)

@Test
fun loginActivityUITest() {
val editText = onView(
allOf(
withId(R.id.username), withHint("User"),
withParent(
allOf(
withId(R.id.container),
withParent(withId(android.R.id.content))
)
),
isDisplayed()
)
)

val editText2 = onView(
allOf(
withId(R.id.password),
withParent(
allOf(
withId(R.id.container),
withParent(withId(android.R.id.content))
)
),
isDisplayed()
)
)

val button = onView(
allOf(
withId(R.id.login), withText("Login"),
withParent(
allOf(
withId(R.id.container),
withParent(withId(android.R.id.content))
)
),
isDisplayed()
)
)
button.check(matches(isDisplayed()))

// editText.perform(typeText("12345678901"), closeSoftKeyboard())
// editText.check(matches(withText("12345678901")))
// editText.perform(clearText(), closeSoftKeyboard())
// editText.perform(typeText("test_user@msn.com"), closeSoftKeyboard())
// editText.check(matches(withText("test_user@msn.com")))
editText2.perform(typeText("Test@1"), closeSoftKeyboard())
editText2.check(matches(withText("Test@1")))
// editText.perform(clearText(), closeSoftKeyboard())
button.perform(click())

}
}
33 changes: 33 additions & 0 deletions XYZBank/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xyzbank.xyzbankapp">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.XYZBank.NoActionBar">
<activity
android:name=".ui.account.AccountActivity"
android:theme="@style/Theme.XYZBank.NoActionBar" />
<activity
android:name=".ui.login.LoginActivity"
android:theme="@style/Theme.XYZBank.NoActionBar" />
<activity
android:name=".ui.SplashScreen"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Binary file not shown.
Loading